From 5f03107095c0096083ec910e088bc5feaeafe5c8 Mon Sep 17 00:00:00 2001 From: Dimitrios Eftaxiopoulos Date: Sat, 22 Dec 2012 02:30:14 +0200 Subject: [PATCH] Imported Upstream version 2.1 --- CMakeLists.txt | 121 +- ChangeLog.txt | 64 + examples/CMakeLists.txt | 28 +- examples/fltk_example.cpp | 22 +- examples/full_test.cpp | 2079 ++------------------ examples/glut_example.cpp | 2 +- examples/qt_example.cpp | 24 +- examples/samples.cpp | 2137 +++++++++++++++++++++ examples/wnd_samples.cpp | 25 +- examples/wx_example.cpp | 2 +- include/CMakeLists.txt | 10 +- include/config.h.in | 11 +- include/mgl2/addon.h | 44 +- include/mgl2/base.h | 150 +- include/mgl2/base_cf.h | 191 +- include/mgl2/canvas.h | 171 +- include/mgl2/canvas_cf.h | 635 +++--- include/mgl2/canvas_wnd.h | 11 +- include/mgl2/cont.h | 226 ++- include/mgl2/data.h | 190 +- include/mgl2/data_cf.h | 400 ++-- include/mgl2/datac.h | 372 ++++ include/mgl2/datac_cf.h | 213 +++ include/mgl2/define.h | 130 +- include/mgl2/eval.h | 19 +- include/mgl2/evalc.h | 19 +- include/mgl2/fit.h | 14 +- include/mgl2/fltk.h | 94 +- include/mgl2/font.h | 23 +- include/mgl2/glut.h | 57 +- include/mgl2/mgl.h | 494 +++-- include/mgl2/mgl_cf.h | 45 +- include/mgl2/opengl.h | 15 +- include/mgl2/other.h | 107 +- include/mgl2/parser.h | 69 +- include/mgl2/plot.h | 170 +- include/mgl2/prim.h | 158 +- include/mgl2/qmathgl.h | 206 ++ include/mgl2/qt.h | 219 +-- include/mgl2/surf.h | 144 +- include/mgl2/type.h | 21 +- include/mgl2/vect.h | 84 +- include/mgl2/volume.h | 68 +- include/mgl2/window.h | 121 +- include/mgl2/wnd.h | 93 + include/mgl2/wx.h | 170 ++ include/xpm/axis_sh.xpm | 22 + include/xpm/box.xpm | 22 + include/xpm/curve.xpm | 21 + include/xpm/hist.xpm | 21 + include/xpm/line.xpm | 21 + include/xpm/oper_dir.xpm | 21 + include/xpm/oper_of.xpm | 22 + include/xpm/text.xpm | 21 + lang/CMakeLists.txt | 123 +- lang/install.m | 1 - lang/{mgl.i.in => mathgl.i} | 4 +- lang/{numpy.i.in => numpy.i} | 0 lang/setup.py.in | 43 - mgllab/CMakeLists.txt | 10 - mgllab/animate.cpp | 314 --- mgllab/data.cpp | 355 ---- mgllab/editor.cpp | 516 ----- mgllab/grid.cpp | 110 -- mgllab/help.cpp | 273 --- mgllab/main.cpp | 299 --- mgllab/mathgl.cpp | 140 -- mgllab/option.cpp | 439 ----- mgllab/setup.cpp | 424 ----- mgllab/table.cpp | 875 --------- mgllab/udav.h | 291 --- mgllab/udav.rc | 24 - mgllab/udav48.ico | Bin 9662 -> 0 bytes mgllab/write.cpp | 17 - src/CMakeLists.txt | 14 +- src/addon.cpp | 56 +- src/axis.cpp | 252 ++- src/base.cpp | 422 +++- src/base_cf.cpp | 68 +- src/canvas.cpp | 490 +++-- src/canvas_cf.cpp | 188 +- src/complex.cpp | 862 +++++++++ src/complex_io.cpp | 900 +++++++++ src/cont.cpp | 136 +- src/crust.cpp | 19 +- src/data.cpp | 365 +++- src/data_io.cpp | 139 +- src/data_new.cpp | 88 +- src/data_png.cpp | 6 +- src/def_font.cpp | 2260 ++++++++++++---------- src/eval.cpp | 56 +- src/evalc.cpp | 61 +- src/evalp.cpp | 11 +- src/exec.cpp | 756 +++++--- src/export.cpp | 141 +- src/export_2d.cpp | 456 ++--- src/export_3d.cpp | 582 +++--- src/fit.cpp | 14 +- src/font.cpp | 50 +- src/obj.cpp | 973 ++++++++++ src/opengl.cpp | 16 +- src/other.cpp | 38 +- src/parser.cpp | 298 +-- src/pde.cpp | 8 +- src/pixel.cpp | 673 ++++--- src/plot.cpp | 117 +- src/prc.cpp | 498 ++--- src/prc/PRC.h | 2 + src/prc/PRCbitStream.cc | 1 + src/prc/PRCbitStream.h | 2 + src/prc/oPRCFile.cc | 621 +++--- src/prc/oPRCFile.h | 509 +++-- src/prc/writePRC.cc | 138 +- src/prc/writePRC.h | 270 ++- src/prim.cpp | 182 +- src/s_hull/s_hull_pro.cpp | 146 +- src/s_hull/s_hull_pro.h | 62 +- src/surf.cpp | 73 +- src/tex_table.cpp | 2 +- src/vect.cpp | 464 ++++- src/volume.cpp | 56 +- {widgets => src}/window.cpp | 110 +- texinfo/CMakeLists.txt | 86 +- texinfo/classes.dia | Bin 0 -> 3500 bytes texinfo/classes.odg | Bin 11301 -> 0 bytes texinfo/classes.pdf | Bin 23785 -> 53847 bytes texinfo/classes.png | Bin 32909 -> 53573 bytes texinfo/concept_en.texi | 38 +- texinfo/concept_ru.texi | 40 +- texinfo/copyright.texi | 11 + texinfo/core_en.texi | 797 ++++---- texinfo/core_ru.texi | 794 ++++---- texinfo/data_en.texi | 432 ++++- texinfo/data_ru.texi | 301 ++- texinfo/datadvance.png | Bin 0 -> 7077 bytes texinfo/doc_en.texi | 76 +- texinfo/doc_ru.texi | 76 +- texinfo/ex_mgl_en.texi | 2753 ++++++++++++++++++++++----- texinfo/ex_mgl_ru.texi | 2718 +++++++++++++++++++++----- texinfo/example_en.texi | 651 +++++-- texinfo/example_ru.texi | 631 ++++-- texinfo/formats_en.texi | 110 ++ texinfo/formats_ru.texi | 110 ++ texinfo/json.html | 121 ++ texinfo/mathgl.js | 496 +++++ texinfo/mathgl_en.texi | 63 +- texinfo/mathgl_ru.texi | 65 +- texinfo/mgl_en.texi | 59 +- texinfo/mgl_ru.texi | 52 +- texinfo/other_en.texi | 125 +- texinfo/other_ru.texi | 125 +- texinfo/overview_en.texi | 35 +- texinfo/overview_ru.texi | 39 +- texinfo/parse_en.texi | 67 +- texinfo/parse_ru.texi | 67 +- texinfo/symbols_en.texi | 676 +++++++ texinfo/symbols_ru.texi | 676 +++++++ texinfo/test.html | 18 + texinfo/title.html | 2 +- texinfo/toc_en.html | 14 + texinfo/toc_fr.html | 17 +- texinfo/toc_ru.html | 16 +- texinfo/udav/udav_arg.png | Bin 0 -> 17770 bytes texinfo/udav/udav_calc.png | Bin 0 -> 182318 bytes texinfo/udav/udav_cmd.png | Bin 0 -> 122968 bytes texinfo/udav/udav_data.png | Bin 0 -> 108821 bytes texinfo/udav/udav_gen_set.png | Bin 0 -> 51246 bytes texinfo/udav/udav_help.png | Bin 0 -> 177113 bytes texinfo/udav/udav_light.png | Bin 0 -> 70752 bytes texinfo/udav/udav_main.png | Bin 0 -> 164679 bytes texinfo/udav/udav_opt.png | Bin 0 -> 23758 bytes texinfo/udav/udav_pen.png | Bin 0 -> 29363 bytes texinfo/udav/udav_prop.png | Bin 0 -> 75166 bytes texinfo/udav/udav_sch.png | Bin 0 -> 43512 bytes texinfo/udav/udav_txt.png | Bin 0 -> 31314 bytes texinfo/udav/udav_var.png | Bin 0 -> 15124 bytes texinfo/udav_en.texi | 132 ++ texinfo/udav_ru.texi | 132 ++ texinfo/version_hist.txt | 31 - texinfo/web_en.texi | 362 ++-- texinfo/web_fr.texi | 381 ++-- texinfo/web_ru.texi | 381 ++-- texinfo/widget_en.texi | 6 +- texinfo/widget_ru.texi | 6 +- todo.txt | 101 - udav/CMakeLists.txt | 10 +- udav/ReadMe | 11 - udav/anim_dlg.h | 2 +- udav/args_dlg.cpp | 4 +- udav/calc_dlg.cpp | 6 +- udav/dat_pnl.cpp | 604 +++--- udav/dat_pnl.h | 33 +- udav/data_dlg.cpp | 145 ++ udav/data_dlg.h | 55 + udav/find_dlg.cpp | 12 +- udav/help_pnl.cpp | 2 +- udav/hint_dlg.cpp | 24 +- udav/hint_dlg.h | 2 +- udav/info_dlg.cpp | 9 +- udav/info_dlg.h | 4 +- udav/mem_pnl.cpp | 28 +- udav/newcmd_dlg.cpp | 116 +- udav/newcmd_dlg.h | 2 + udav/open_dlg.cpp | 20 +- udav/opt_dlg.cpp | 47 +- udav/opt_dlg.h | 4 +- udav/plot_pnl.cpp | 207 +- udav/plot_pnl.h | 5 +- udav/prop_dlg.cpp | 23 +- udav/prop_dlg.h | 8 +- udav/qmglsyntax.cpp | 52 +- udav/style_dlg.cpp | 37 +- udav/style_dlg.h | 4 +- udav/text_pnl.cpp | 106 +- udav/text_pnl.h | 2 +- udav/textedit.cpp | 29 +- udav/textedit.h | 16 +- udav/tree_pnl.cpp | 0 udav/tree_pnl.h | 57 + udav/{UDAV.desktop => udav.desktop} | 0 udav/udav_wnd.cpp | 82 +- udav/udav_wnd.h | 4 - utils/CMakeLists.txt | 38 +- utils/mglcgi.cpp | 89 + utils/mglconv.cpp | 9 +- utils/mglview.cpp | 28 +- widgets/CMakeLists.txt | 123 +- widgets/fltk.cpp | 236 ++- widgets/glut.cpp | 70 +- widgets/qt.cpp | 488 ++++- widgets/wx.cpp | 707 +++++++ 231 files changed, 28653 insertions(+), 16544 deletions(-) create mode 100644 examples/samples.cpp create mode 100644 include/mgl2/datac.h create mode 100644 include/mgl2/datac_cf.h create mode 100644 include/mgl2/qmathgl.h create mode 100644 include/mgl2/wnd.h create mode 100644 include/mgl2/wx.h create mode 100644 include/xpm/axis_sh.xpm create mode 100644 include/xpm/box.xpm create mode 100644 include/xpm/curve.xpm create mode 100644 include/xpm/hist.xpm create mode 100644 include/xpm/line.xpm create mode 100644 include/xpm/oper_dir.xpm create mode 100644 include/xpm/oper_of.xpm create mode 100644 include/xpm/text.xpm delete mode 100644 lang/install.m rename lang/{mgl.i.in => mathgl.i} (98%) rename lang/{numpy.i.in => numpy.i} (100%) delete mode 100644 lang/setup.py.in delete mode 100644 mgllab/CMakeLists.txt delete mode 100644 mgllab/animate.cpp delete mode 100644 mgllab/data.cpp delete mode 100644 mgllab/editor.cpp delete mode 100644 mgllab/grid.cpp delete mode 100644 mgllab/help.cpp delete mode 100644 mgllab/main.cpp delete mode 100644 mgllab/mathgl.cpp delete mode 100644 mgllab/option.cpp delete mode 100644 mgllab/setup.cpp delete mode 100644 mgllab/table.cpp delete mode 100644 mgllab/udav.h delete mode 100644 mgllab/udav.rc delete mode 100644 mgllab/udav48.ico delete mode 100644 mgllab/write.cpp create mode 100644 src/complex.cpp create mode 100644 src/complex_io.cpp create mode 100644 src/obj.cpp rename {widgets => src}/window.cpp (78%) create mode 100644 texinfo/classes.dia delete mode 100644 texinfo/classes.odg create mode 100644 texinfo/copyright.texi create mode 100644 texinfo/datadvance.png create mode 100644 texinfo/formats_en.texi create mode 100644 texinfo/formats_ru.texi create mode 100644 texinfo/json.html create mode 100644 texinfo/mathgl.js create mode 100644 texinfo/symbols_en.texi create mode 100644 texinfo/symbols_ru.texi create mode 100644 texinfo/test.html create mode 100644 texinfo/udav/udav_arg.png create mode 100644 texinfo/udav/udav_calc.png create mode 100644 texinfo/udav/udav_cmd.png create mode 100644 texinfo/udav/udav_data.png create mode 100644 texinfo/udav/udav_gen_set.png create mode 100644 texinfo/udav/udav_help.png create mode 100644 texinfo/udav/udav_light.png create mode 100644 texinfo/udav/udav_main.png create mode 100644 texinfo/udav/udav_opt.png create mode 100644 texinfo/udav/udav_pen.png create mode 100644 texinfo/udav/udav_prop.png create mode 100644 texinfo/udav/udav_sch.png create mode 100644 texinfo/udav/udav_txt.png create mode 100644 texinfo/udav/udav_var.png create mode 100644 texinfo/udav_en.texi create mode 100644 texinfo/udav_ru.texi delete mode 100644 texinfo/version_hist.txt delete mode 100644 todo.txt delete mode 100644 udav/ReadMe create mode 100644 udav/data_dlg.cpp create mode 100644 udav/data_dlg.h create mode 100644 udav/tree_pnl.cpp create mode 100644 udav/tree_pnl.h rename udav/{UDAV.desktop => udav.desktop} (100%) create mode 100644 utils/mglcgi.cpp create mode 100644 widgets/wx.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index db2c551..7f394c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,26 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 2.8.4) project( MathGL ) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: + None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) +endif(NOT CMAKE_BUILD_TYPE) + set(CMAKE_VERBOSE_MAKEFILE ON) set(MathGL_VERSION_MAJOR 2) -set(MathGL_VERSION_MINOR 0) +set(MathGL_VERSION_MINOR 1) + +include(CMakeDependentOption) option(enable-double "Enable double precision in MathGL library" ON) option(enable-simple "Slightly increase drawing speed but disable mglDataA class") option(enable-mpi "Enable mpi") -option(enable-all "Enable all features") -option(enable-langall "Enable all language interfaces") +option(enable-all "Enable all core features") +option(enable-all-widgets "Enable all Widgets") +option(enable-all-swig "Enable all SWIG based interfaces") option(enable-lgpl "Enable only LGPL part of MathGL" OFF) -# option(enable-ltdl "Enable loading modules support") +#option(enable-ltdl "Enable loading modules support") option(enable-pthread "Enable POSIX threads support") option(enable-gsl "Enable gsl support") option(enable-jpeg "Enable jpeg support") @@ -21,8 +30,7 @@ option(enable-zlib "Enable zlib support" ON) option(enable-pdf "Enable pdf support") option(enable-gif "Enable gif support") option(enable-hdf4 "Enable hdf4 support") -option(enable-hdf5 "Enable hdf5 1.6 support") -option(enable-hdf5_18 "Enable hdf5 1.8 support") +option(enable-hdf5 "Enable hdf5 support") option(enable-opengl "Enable OpenGL support" ON) option(enable-glut "Enable glut support") option(enable-fltk "Enable fltk widget") @@ -30,18 +38,19 @@ option(enable-wx "Enable wxWidget widget") option(enable-qt "Enable Qt4 widget") option(enable-python "Enable python interface") option(enable-octave "Enable octave interface") +option(enable-octave-install "Octave interface will install for all users" ON) option(enable-doc "Enable documentation building") include_directories( ${MathGL_SOURCE_DIR}/include ${MathGL_BINARY_DIR}/include) -if(NOT MSVC) +if(NOT MSVC AND NOT BORLAND) find_library(M_LIB m) if(NOT M_LIB) message(SEND_ERROR "${M_LIB}") endif(NOT M_LIB) -else(NOT MSVC) +else(NOT MSVC AND NOT BORLAND) set(M_LIB) -endif(NOT MSVC) +endif(NOT MSVC AND NOT BORLAND) if(enable-double) set(MGL_USE_DOUBLE 1) @@ -61,7 +70,7 @@ if(enable-mpi) find_package(MPI REQUIRED) set(CMAKE_CXX_COMPILE_FLAGS ${CMAKE_CXX_COMPILE_FLAGS} ${MPI_COMPILE_FLAGS}) set(CMAKE_CXX_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS} ${MPI_LINK_FLAGS}) - include_directories(MPI_INCLUDE_PATH) + include_directories(${MPI_INCLUDE_PATH}) else(enable-mpi) set(MGL_HAVE_MPI 0) endif(enable-mpi) @@ -81,18 +90,18 @@ else((enable-all OR enable-gsl) AND (NOT enable-lgpl) ) set(MGL_HAVE_GSL 0) endif((enable-all OR enable-gsl) AND (NOT enable-lgpl) ) -# if(enable-all OR enable-ltdl) -# set(MGL_HAVE_LTDL 1) -# find_library(LTDL_LIB ltdl) -# find_path(LTDL_INCLUDE_DIR ltdl.h) -# if(NOT LTDL_LIB OR NOT LTDL_INCLUDE_DIR) -# message(SEND_ERROR "${LTDL_LIB}") -# message(SEND_ERROR "${LTDL_INCLUDE_DIR}") -# message(SEND_ERROR "Couldn't find LTDL library.") -# endif(NOT LTDL_LIB OR NOT LTDL_INCLUDE_DIR) -# else(enable-all OR enable-ltdl) -# set(MGL_HAVE_LTDL 0) -# endif(enable-all OR enable-ltdl) +#if(enable-all OR enable-ltdl) +# set(MGL_HAVE_LTDL 1) +# find_library(LTDL_LIB ltdl) +# find_path(LTDL_INCLUDE_DIR ltdl.h) +# if(NOT LTDL_LIB OR NOT LTDL_INCLUDE_DIR) +# message(SEND_ERROR "${LTDL_LIB}") +# message(SEND_ERROR "${LTDL_INCLUDE_DIR}") +# message(SEND_ERROR "Couldn't find LTDL library.") +# endif(NOT LTDL_LIB OR NOT LTDL_INCLUDE_DIR) +#else(enable-all OR enable-ltdl) +# set(MGL_HAVE_LTDL 0) +#endif(enable-all OR enable-ltdl) if(enable-all OR enable-pthread) set(MGL_HAVE_PTHREAD 1) @@ -119,20 +128,15 @@ else((enable-all OR enable-hdf4) AND (NOT enable-lgpl) ) set(MGL_HAVE_HDF4 0) endif((enable-all OR enable-hdf4) AND (NOT enable-lgpl) ) -if((enable-all OR enable-hdf5 OR enable-hdf5_18) AND (NOT enable-lgpl) ) +if((enable-all OR enable-hdf5) AND (NOT enable-lgpl) ) set(MGL_HAVE_HDF5 1) - if(enable-hdf5_18) - set(MGL_HAVE_HDF5_18 1) - else(enable-hdf5_18) - set(MGL_HAVE_HDF5_18 0) - endif(enable-hdf5_18) include(FindHDF5) if(NOT HDF5_FOUND) message(SEND_ERROR "Couldn't find HDF5 library.") endif(NOT HDF5_FOUND) -else((enable-all OR enable-hdf5 OR enable-hdf5_18) AND (NOT enable-lgpl) ) +else((enable-all OR enable-hdf5) AND (NOT enable-lgpl) ) set(MGL_HAVE_HDF5 0) -endif((enable-all OR enable-hdf5 OR enable-hdf5_18) AND (NOT enable-lgpl) ) +endif((enable-all OR enable-hdf5) AND (NOT enable-lgpl) ) if(enable-all OR enable-jpeg) set(MGL_HAVE_JPEG 1) @@ -224,7 +228,7 @@ else(enable-all OR enable-opengl) set(MGL_HAVE_OPENGL 0) endif(enable-all OR enable-opengl) -if((enable-all OR enable-glut) AND (NOT enable-lgpl) ) +if((enable-all-widgets OR enable-glut) AND (NOT enable-lgpl) ) set(MGL_HAVE_GLUT 1) if(NOT MGL_HAVE_OPENGL) message(SEND_ERROR "You have to enable OpenGL if you plan to use GLUT.") @@ -233,41 +237,44 @@ if((enable-all OR enable-glut) AND (NOT enable-lgpl) ) if(NOT GLUT_FOUND) message(SEND_ERROR "Couldn't find GLUT library.") endif(NOT GLUT_FOUND) -else((enable-all OR enable-glut) AND (NOT enable-lgpl) ) +else((enable-all-widgets OR enable-glut) AND (NOT enable-lgpl) ) set(MGL_HAVE_GLUT 0) -endif((enable-all OR enable-glut) AND (NOT enable-lgpl) ) +endif((enable-all-widgets OR enable-glut) AND (NOT enable-lgpl) ) -if((enable-all OR enable-fltk) AND (NOT enable-lgpl) ) +if((enable-all-widgets OR enable-fltk) AND (NOT enable-lgpl) ) set(MGL_HAVE_FLTK 1) include(FindFLTK) if(NOT FLTK_FOUND) message(SEND_ERROR "Couldn't find FLTK library.") endif(NOT FLTK_FOUND) -else((enable-all OR enable-fltk) AND (NOT enable-lgpl) ) +else((enable-all-widgets OR enable-fltk) AND (NOT enable-lgpl) ) set(MGL_HAVE_FLTK 0) -endif((enable-all OR enable-fltk) AND (NOT enable-lgpl) ) +endif((enable-all-widgets OR enable-fltk) AND (NOT enable-lgpl) ) -if((enable-all OR enable-wx) AND (NOT enable-lgpl) ) - set(MGL_HAVE_WX 0) +#if((enable-all-widgets OR enable-wx) AND (NOT enable-lgpl) ) +if((enable-wx) AND (NOT enable-lgpl) ) + set(MGL_HAVE_WX 1) FIND_PACKAGE(wxWidgets COMPONENTS base core gl) if(NOT wxWidgets_FOUND) message(SEND_ERROR "Couldn't find wxWidgets library.") endif(NOT wxWidgets_FOUND) -else((enable-all OR enable-wx) AND (NOT enable-lgpl) ) +#else((enable-all-widgets OR enable-wx) AND (NOT enable-lgpl) ) +else((enable-wx) AND (NOT enable-lgpl) ) set(MGL_HAVE_WX 0) -endif((enable-all OR enable-wx) AND (NOT enable-lgpl) ) +#endif((enable-all-widgets OR enable-wx) AND (NOT enable-lgpl) ) +endif((enable-wx) AND (NOT enable-lgpl) ) -if((enable-all OR enable-qt) AND (NOT enable-lgpl) ) +if((enable-all-widgets OR enable-qt) AND (NOT enable-lgpl) ) set(MGL_HAVE_QT 1) FIND_PACKAGE(Qt4) if(NOT QT4_FOUND) message(SEND_ERROR "Couldn't find Qt4 library.") endif(NOT QT4_FOUND) -else((enable-all OR enable-qt) AND (NOT enable-lgpl) ) +else((enable-all-widgets OR enable-qt) AND (NOT enable-lgpl) ) set(MGL_HAVE_QT 0) -endif((enable-all OR enable-qt) AND (NOT enable-lgpl) ) +endif((enable-all-widgets OR enable-qt) AND (NOT enable-lgpl) ) -if((enable-langall OR enable-python) AND (NOT enable-lgpl) ) +if((enable-all-swig OR enable-python) AND (NOT enable-lgpl) ) set(MGL_HAVE_PYTHON 1) FIND_PACKAGE(PythonInterp) if(NOT PYTHONINTERP_FOUND) @@ -277,11 +284,20 @@ if((enable-langall OR enable-python) AND (NOT enable-lgpl) ) if(NOT PYTHONLIBS_FOUND) message(SEND_ERROR "Couldn't find python development libraries.") endif(NOT PYTHONLIBS_FOUND) -else((enable-langall OR enable-python) AND (NOT enable-lgpl) ) + execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print numpy.get_include()" + OUTPUT_VARIABLE NUMPY_INCLUDE_PATH + RESULT_VARIABLE NUMPY_ERR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT NUMPY_INCLUDE_PATH) + message(SEND_ERROR "Couldn't find numpy.") + endif(NOT NUMPY_INCLUDE_PATH) +else((enable-all-swig OR enable-python) AND (NOT enable-lgpl) ) set(MGL_HAVE_PYTHON 0) -endif((enable-langall OR enable-python) AND (NOT enable-lgpl) ) +endif((enable-all-swig OR enable-python) AND (NOT enable-lgpl) ) -if((enable-langall OR enable-octave) AND (NOT enable-lgpl) ) +if((enable-all-swig OR enable-octave) AND (NOT enable-lgpl) ) set(MGL_HAVE_OCTAVE 1) find_program(oct_prog octave-config) if(NOT oct_prog) @@ -299,9 +315,9 @@ if((enable-langall OR enable-octave) AND (NOT enable-lgpl) ) if(NOT oct_tar) message(SEND_ERROR "Couldn't find tar needed for octave interfaces creation.") endif(NOT oct_tar) -else((enable-langall OR enable-octave) AND (NOT enable-lgpl) ) +else((enable-all-swig OR enable-octave) AND (NOT enable-lgpl) ) set(MGL_HAVE_OCTAVE 0) -endif((enable-langall OR enable-octave) AND (NOT enable-lgpl) ) +endif((enable-all-swig OR enable-octave) AND (NOT enable-lgpl) ) if(enable-doc) set(MGL_HAVE_DOC 1) @@ -326,6 +342,7 @@ if(MGL_HAVE_PYTHON OR MGL_HAVE_OCTAVE) if(NOT SWIG_FOUND) message(SEND_ERROR "Couldn't find swig needed for interfaces compiling.") endif(NOT SWIG_FOUND) + INCLUDE(${SWIG_USE_FILE}) endif(MGL_HAVE_PYTHON OR MGL_HAVE_OCTAVE) #execute_process( @@ -359,8 +376,8 @@ add_subdirectory( include ) add_subdirectory( udav ) #add_subdirectory( mgllab ) add_subdirectory( lang ) -if(NOT MSVC) +if(NOT MSVC AND NOT BORLAND) add_subdirectory( utils ) add_subdirectory( examples ) add_subdirectory( texinfo ) -endif(NOT MSVC) +endif(NOT MSVC AND NOT BORLAND) diff --git a/ChangeLog.txt b/ChangeLog.txt index 05243db..e1894cc 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,67 @@ +2.1 Released 13 December 2012 + +* Add class mglDataC for complex data arrays. +* Add mglData::Solve() for finding x-value where dat(x)=val. +* Add mglData::Clean() for removing rows with duplicate values for given column. +* Add Vect3() plot for drawing vectors on slice of 3d vector field. +* Add Table() function for drawing table with data values. +* Add ZoomAxis() for zooming/shifting axis range as whole. +* Add WriteJSON() function for exporting in JSON format suitable for later drawing by JavaScript +* Add JavaScript code for visualizing JSON data. +* Add mgl.cgi tool which return PNG image for CGI request in form of MGL script. +* Add MGL commands 'errbox', 'face' + +* Color can be specified as its RGB[A] values, i.e. like "{xFFFFFF}" or "{xFFFFFFFF}". +* Color in color scheme may have position in range [0,1]. Format is {CN,pos} or {xFFFFFF,pos}. +* Now pen width for marks is proportional to pen width of line multiplied by size of marks. +* Now you can use different font-faces in the plot simultaneously. +* Now Legend() automatically use several columns if it contain too many legend entries. +* Add style '-' for legend for drawing them horizontally. +* Vectors is drawn now even if only starting or ending points are placed in bounding box. +* Strongly rewrite the algorithm of vector field plotting. + +* Grid lines for NAN origin values are always located at far-away edges. +* Try correctly place axis and tick labels even for axis with inverse range (i.e. for v2 * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -17,9 +17,11 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "mgl2/window.h" +#include "mgl2/fltk.h" #if defined(WIN32) || defined(_MSC_VER) || defined(__BORLANDC__) #include +#else +#include #endif //----------------------------------------------------------------------------- int test_wnd(mglGraph *gr); @@ -37,7 +39,7 @@ void *mgl_fltk_tmp(void *) { mgl_fltk_run(); return 0; } int main(int argc,char **argv) { #ifdef PTHREAD_SAMPLE - mglWindow gr("test"); + mglFLTK gr("test"); gr.RunThr(); for(int i=0;i<10;i++) // do calculation { @@ -55,18 +57,18 @@ int main(int argc,char **argv) } return 0; // finish calculations and close the window #else - mglWindow *gr; + mglFLTK *gr; char key = 0; if(argc>1) key = argv[1][0]!='-' ? argv[1][0]:argv[1][1]; else printf("You may specify argument '1', '2', '3' or 'd' for viewing examples of 1d, 2d, 3d or dual plotting\n"); switch(key) { - case '1': gr = new mglWindow(sample_1,"1D plots",0); break; - case '2': gr = new mglWindow(sample_2,"2D plots",0); break; - case '3': gr = new mglWindow(sample_3,"3D plots",0); break; - case 'd': gr = new mglWindow(sample_d,"Dual plots",0); break; - case 't': gr = new mglWindow(test_wnd,"Testing",0); break; - default: gr = new mglWindow(sample,"Drop and waves",0); break; + case '1': gr = new mglFLTK(sample_1,"1D plots"); break; + case '2': gr = new mglFLTK(sample_2,"2D plots"); break; + case '3': gr = new mglFLTK(sample_3,"3D plots"); break; + case 'd': gr = new mglFLTK(sample_d,"Dual plots"); break; + case 't': gr = new mglFLTK(test_wnd,"Testing"); break; + default: gr = new mglFLTK(sample,"Drop and waves"); break; } gr->Run(); return 0; #endif diff --git a/examples/full_test.cpp b/examples/full_test.cpp index 6b174c4..a40758f 100644 --- a/examples/full_test.cpp +++ b/examples/full_test.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * full_test.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -26,11 +26,23 @@ #include "mgl2/mgl.h" #include "mgl2/eval.h" //----------------------------------------------------------------------------- -void mgls_prepare1d(mglData *y, mglData *y1=0, mglData *y2=0, mglData *x1=0, mglData *x2=0); -void mgls_prepare2d(mglData *a, mglData *b=0, mglData *v=0); -void mgls_prepare3d(mglData *a, mglData *b=0); -void mgls_prepare2v(mglData *a, mglData *b); -void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez); +void mgl_create_cpp_font(HMGL gr, const wchar_t *how); +//----------------------------------------------------------------------------- +struct mglSample /// Structure for list of samples +{ + const char *name; + void (*func)(mglGraph*); + const char *mgl; +}; +extern mglSample samp[]; +extern const char *mmgl_dat_prepare; +//----------------------------------------------------------------------------- +int mgl_cmd_smp(const void *a, const void *b) +{ + const mglSample *aa = (const mglSample *)a; + const mglSample *bb = (const mglSample *)b; + return strcmp(aa->name, bb->name); +} //----------------------------------------------------------------------------- int type = 0; int dotest = 0; @@ -39,225 +51,30 @@ int height = 600; int mini = 0; int big = 0; int srnd = 0; +int use_mgl = 0; +int verbose = 0; +//----------------------------------------------------------------------------- +void mgls_prepare1d(mglData *y, mglData *y1=0, mglData *y2=0, mglData *x1=0, mglData *x2=0); +void mgls_prepare2d(mglData *a, mglData *b=0, mglData *v=0); +void mgls_prepare3d(mglData *a, mglData *b=0); +void mgls_prepare2v(mglData *a, mglData *b); +void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez); //----------------------------------------------------------------------------- -void smgl_colorbar(mglGraph *gr); -void smgl_combined(mglGraph *gr); +void mgl_write_obj_old(HMGL gr, const char *fname,const char *descr, int use_png); void save(mglGraph *gr,const char *name,const char *suf); void test(mglGraph *gr) { - float itime =0, ltime=100; - - gr->MultiPlot(10,1,2, 8,1); - gr->SetTickLen(-.02); - gr->SetTickShift(mglPoint(0.2,0.2)); - gr->SetRanges((float) itime,(float) ltime,-3.,3); - gr->SetOrigin(NAN,NAN); - gr->SetTimeUTC(true); - - gr->SetTicksTime('x'); - gr->Axis("y", "b"); - gr->Axis("x"); - gr->SetOrigin(itime,3);gr->Axis("x_"); - gr->Label('y',"y_1",0); - gr->FPlot("2.5","k"); - gr->SetRanges((float) itime,(float) ltime,-10,10); - gr->SetOrigin(ltime,-10); // second axis - gr->Axis("y","r"); gr->Label('y',"#r{y_r}",0.2); - gr->FPlot("5.5","r"); - gr->SetRanges((float) itime,(float) ltime,-1,1); - gr->SetOrigin(itime-(ltime-itime)/7.,-1); // second axis - gr->Axis("y","b"); gr->Label('y',"#r{y_2}",0.2); - gr->FPlot("0.5","r"); - gr->SetRanges((float) itime,(float) ltime,-2,1); - gr->SetOrigin(itime-2*(ltime-itime)/7.,-2); // second axis - gr->Axis("y","b"); gr->Label('y',"#r{y_2}",0.2); - gr->FPlot("0.5","r"); - gr->SetRanges((float) itime,(float) ltime,-2,2); - gr->SetOrigin(itime-3*(ltime-itime)/7.,-2); // second axis - gr->Axis("y","r"); gr->Label('y',"#r{y_3}",0.2); - gr->FPlot("-1.5","r"); - gr->SetRanges((float) itime,(float) ltime,-20,20); - gr->SetOrigin(itime-4*(ltime-itime)/7.,-20); // second axis - gr->Axis("y","r"); gr->Label('y',"#r{y_3}",0.2); - gr->FPlot("-15","r"); - - gr->WriteJPEG("1.jpg"); - gr->WriteEPS("1.eps"); - return; - - mglData ys(10), y; - ys.Modify("0.8*sin(pi*2*x)+0.2*rnd"); - mgls_prepare1d(&y); - - gr->SubPlot(2,2,0); - gr->SetOrigin(mglPoint(-1,-1,-1)); gr->Axis(); - gr->SetOrigin(mglPoint(1,1,1)); gr->Axis(); - gr->Box(); gr->Plot(ys," *"); gr->Label(ys,"y=%y"); - gr->Label('x',"x_y label"); gr->Label('y',"y_y label"); gr->Label('z',"z_y label"); - - gr->SubPlot(2,2,1); gr->Rotate(40,60); - gr->SetOrigin(mglPoint(-1,-1,-1)); gr->Axis(); - gr->SetOrigin(mglPoint(1,1,1)); gr->Axis(); - gr->SetOrigin(mglPoint(NAN,NAN,NAN)); gr->Axis(); - gr->Label('x',"x_y label"); gr->Label('y',"y_y label"); gr->Label('z',"z_y label"); - - gr->SubPlot(2,2,2); - gr->Box(); gr->Plot(y.SubData(-1,0)); - gr->Text(y,"This is very very long string drawn along a curve",":k"); - gr->Text(y,"Another string drawn above a curve","T:r"); - - gr->SubPlot(2,2,3); - mglPoint p; - gr->Mark(p,".r"); - gr->Puts(p,"A","@:C",-1); - gr->Puts(p,"A","@:C",-2); - - gr->SetRange('x',1341610306,1341612408); - gr->SetTicksTime('x'); - gr->Axis(); - return; - - /* mglParse par; + mglParse par; par.AllowSetSize(true); setlocale(LC_CTYPE, ""); - FILE *fp=fopen("/home/balakin/progr/sfnet/mathgl/mathgl-2x/examples/test.mgl","r"); + FILE *fp=fopen("/home/balakin/mathgl-code/mathgl-2x/build/test.mgl","r"); par.Execute(gr,fp,true); - fclose(fp);*/ + fclose(fp); } //----------------------------------------------------------------------------- void fexport(mglGraph *gr) { - mglData a,b,d; mgls_prepare2v(&a,&b); d = a; - for(int i=0;iSubPlot(2,2,1,""); gr->Title("Flow + Dens"); - gr->Flow(a,b,"br"); gr->Dens(d,"BbcyrR"); gr->Box(); - gr->SubPlot(2,2,0); gr->Title("Surf + Cont"); gr->Rotate(50,60); - gr->Light(true); gr->Surf(a); gr->Cont(a,"y"); gr->Box(); - gr->SubPlot(2,2,2); gr->Title("Mesh + Cont"); gr->Rotate(50,60); - gr->Box(); gr->Mesh(a); gr->Cont(a,"_"); - gr->SubPlot(2,2,3); gr->Title("Surf3 + ContF_3");gr->Rotate(50,60); - gr->Box(); gr->ContF3(v,c,"z",0); gr->ContF3(v,c,"x"); gr->ContF3(v,c); - gr->SetCutBox(mglPoint(0,-1,-1), mglPoint(1,0,1.1)); - gr->ContF3(v,c,"z",c.nz-1); gr->Surf3(-0.5,c); - -/* gr->WriteJPEG("test.jpg"); -* gr->WritePNG("test.png"); -* gr->WriteBMP("test.bmp"); -* gr->WriteTGA("test.tga"); -* gr->WriteEPS("test.eps"); -* gr->WriteSVG("test.svg"); -* gr->WriteGIF("test.gif");*/ - - gr->WriteXYZ("test.xyz"); - gr->WriteSTL("test.stl"); - gr->WriteOFF("test.off"); - gr->WriteTEX("test.tex"); - gr->WriteOBJ("test.obj","",true); - // gr->WriteX3D("test.x3d"); -} -//----------------------------------------------------------------------------- -// Sample functions (v.2.*0) -//----------------------------------------------------------------------------- -const char *mmgl_triangulation="new x 100 '2*rnd-1':new y 100 '2*rnd-1':copy z x^2-y^2\n" -"new g 30 30:triangulate d x y\n" -"title 'Triangulation'\nrotate 50 60:box:light on\n" -"triplot d x y z:triplot d x y z '#k'\ndatagrid g x y z:mesh g 'm'\n"; -void smgl_triangulation(mglGraph *gr) // alpha and lighting -{ - mglData x(100), y(100), z(100); - gr->Fill(x,"2*rnd-1"); gr->Fill(y,"2*rnd-1"); gr->Fill(z,"v^2-w^2",x,y); - mglData d = mglTriangulation(x,y), g(30,30); - - if(!mini) gr->Title("Triangulation"); - gr->Rotate(40,60); gr->Box(); gr->Light(true); - gr->TriPlot(d,x,y,z); gr->TriPlot(d,x,y,z,"#k"); - - gr->DataGrid(g,x,y,z); gr->Mesh(g,"m"); -} -//----------------------------------------------------------------------------- -const char *mmgl_alpha="subplot 2 2 0:title 'default':rotate 50 60:box\nsurf a\n" -"subplot 2 2 0:title 'light on':rotate 50 60:box\nlight on:surf a\n" -"subplot 2 2 0:title 'light on; alpha on':rotate 50 60:box\nalpha on:surf a\n" -"subplot 2 2 0:title 'alpha on':rotate 50 60:box\nnlight off:surf a\n"; -void smgl_alpha(mglGraph *gr) // alpha and lighting -{ - mglData a; mgls_prepare2d(&a); - gr->SubPlot(2,2,0); gr->Title("default"); gr->Rotate(50,60); - gr->Box(); gr->Surf(a); - gr->SubPlot(2,2,1); gr->Title("light on"); gr->Rotate(50,60); - gr->Box(); gr->Light(true); gr->Surf(a); - gr->SubPlot(2,2,2); gr->Title("alpha on; light on"); gr->Rotate(50,60); - gr->Box(); gr->Alpha(true); gr->Surf(a); - gr->SubPlot(2,2,3); gr->Title("alpha on"); gr->Rotate(50,60); - gr->Box(); gr->Light(false); gr->Surf(a); -} -//----------------------------------------------------------------------------- -const char *mmgl_schemes="call 'sch' 0 'kw'\ncall 'sch' 1 'wk'\ncall 'sch' 2 'kHCcw'\ncall 'sch' 3 'kBbcw'\n" -"call 'sch' 4 'kRryw'\ncall 'sch' 5 'kGgew'\ncall 'sch' 6 'BbwrR'\ncall 'sch' 7 'BbwgG'\n" -"call 'sch' 8 'GgwmM'\ncall 'sch' 9 'UuwqR'\ncall 'sch' 10 'QqwcC'\ncall 'sch' 11 'CcwyY'\n" -"call 'sch' 12 'bcwyr'\ncall 'sch' 13 'bwr'\ncall 'sch' 13 'BbcyrR'\ncall 'sch' 15 'UbcyqR'\n" -"call 'sch' 16 'BbcwyrR'\ncall 'sch' 17 'bcyr'\ncall 'sch' 18 'BbcyrR|'\ncall 'sch' 19 'bgr'\n" -"stop\nfunc 'sch' 2\nsubplot 2 10 $1 0.2 0:fsurf 'x' '$2':text -1.4 -0.3 '$2' ':C' -8\nreturn\n"; -void smgl_schemes(mglGraph *gr) // Color table -{ - mglData a(256,2); a.Fill(-1,1); - gr->SubPlot(2,10,0,NULL,0.2); gr->Dens(a,"kw"); gr->Puts(0.07, 0.92, "kw", "A"); - gr->SubPlot(2,10,1,NULL,0.2); gr->Dens(a,"wk"); gr->Puts(0.57, 0.92, "wk", "A"); - gr->SubPlot(2,10,2,NULL,0.2); gr->Dens(a,"kHCcw"); gr->Puts(0.07, 0.82, "kHCcw", "A"); - gr->SubPlot(2,10,3,NULL,0.2); gr->Dens(a,"kBbcw"); gr->Puts(0.57, 0.82, "kBbcw", "A"); - gr->SubPlot(2,10,4,NULL,0.2); gr->Dens(a,"kRryw"); gr->Puts(0.07, 0.72, "kRryw", "A"); - gr->SubPlot(2,10,5,NULL,0.2); gr->Dens(a,"kGgew"); gr->Puts(0.57, 0.72, "kGgew", "A"); - gr->SubPlot(2,10,6,NULL,0.2); gr->Dens(a,"BbwrR"); gr->Puts(0.07, 0.62, "BbwrR", "A"); - gr->SubPlot(2,10,7,NULL,0.2); gr->Dens(a,"BbwgG"); gr->Puts(0.57, 0.62, "BbwgG", "A"); - gr->SubPlot(2,10,8,NULL,0.2); gr->Dens(a,"GgwmM"); gr->Puts(0.07, 0.52, "GgwmM", "A"); - gr->SubPlot(2,10,9,NULL,0.2); gr->Dens(a,"UuwqR"); gr->Puts(0.57, 0.52, "UuwqR", "A"); - gr->SubPlot(2,10,10,NULL,0.2); gr->Dens(a,"QqwcC"); gr->Puts(0.07, 0.42, "QqwcC", "A"); - gr->SubPlot(2,10,11,NULL,0.2); gr->Dens(a,"CcwyY"); gr->Puts(0.57, 0.42, "CcwyY", "A"); - gr->SubPlot(2,10,12,NULL,0.2); gr->Dens(a,"bcwyr"); gr->Puts(0.07, 0.32, "bcwyr", "A"); - gr->SubPlot(2,10,13,NULL,0.2); gr->Dens(a,"bwr"); gr->Puts(0.57, 0.32, "bwr", "A"); - gr->SubPlot(2,10,14,NULL,0.2); gr->Dens(a,"BbcyrR"); gr->Puts(0.07, 0.22, "BbcyrR", "A"); - gr->SubPlot(2,10,15,NULL,0.2); gr->Dens(a,"UbcyqR"); gr->Puts(0.57, 0.22, "UbcyqR", "A"); - gr->SubPlot(2,10,16,NULL,0.2); gr->Dens(a,"BbcwyrR"); gr->Puts(0.07, 0.12, "BbcwyrR", "A"); - gr->SubPlot(2,10,17,NULL,0.2); gr->Dens(a,"bcyr"); gr->Puts(0.57, 0.12, "bcyr", "A"); - gr->SubPlot(2,10,18,NULL,0.2); gr->Dens(a,"BbcyrR|"); gr->Puts(0.07, 0.02, "BbcyrR|", "A"); - gr->SubPlot(2,10,19,NULL,0.2); gr->Dens(a,"bgr"); gr->Puts(0.57, 0.02, "bgr", "A"); -} -//----------------------------------------------------------------------------- -const char *mmgl_curvcor="origin -1 1 -1\nsubplot 2 2 0:title 'Cartesian':rotate 50 60:fplot '2*t-1' '0.5' '0':axis:grid\n" -"axis 'y*sin(pi*x)' 'y*cos(pi*x)':subplot 2 2 1:title 'Cylindrical':rotate 50 60:fplot '2*t-1' '0.5' '0':axis:grid\n" -"axis '2*y*x' 'y*y - x*x':subplot 2 2 2:title 'Parabolic':rotate 50 60:fplot '2*t-1' '0.5' '0':axis:grid\n" -"axis 'y*sin(pi*x)' 'y*cos(pi*x)' 'x+z':subplot 2 2 3:title 'Spiral':rotate 50 60:fplot '2*t-1' '0.5' '0':axis:grid\n"; -void smgl_curvcoor(mglGraph *gr) // curvilinear coordinates -{ - gr->SetOrigin(-1,1,-1); - - gr->SubPlot(2,2,0); gr->Title("Cartesian"); gr->Rotate(50,60); - gr->FPlot("2*t-1","0.5","0","r2"); - gr->Axis(); gr->Grid(); - - gr->SetFunc("y*sin(pi*x)","y*cos(pi*x)",0); - gr->SubPlot(2,2,1); gr->Title("Cylindrical"); gr->Rotate(50,60); - gr->FPlot("2*t-1","0.5","0","r2"); - gr->Axis(); gr->Grid(); - - gr->SetFunc("2*y*x","y*y - x*x",0); - gr->SubPlot(2,2,2); gr->Title("Parabolic"); gr->Rotate(50,60); - gr->FPlot("2*t-1","0.5","0","r2"); - gr->Axis(); gr->Grid(); - - gr->SetFunc("y*sin(pi*x)","y*cos(pi*x)","x+z"); - gr->SubPlot(2,2,3); gr->Title("Spiral"); gr->Rotate(50,60); - gr->FPlot("2*t-1","0.5","0","r2"); - gr->Axis(); gr->Grid(); - gr->SetFunc(0,0,0); // set to default Cartesian -} -//----------------------------------------------------------------------------- -const char *mmgl_style=""; -void smgl_style(mglGraph *gr) // pen styles -{ - gr->SubPlot(2,2,0); + gr->SubPlot(3,2,0); double d,x1,x2,x0,y=0.95; d=0.3, x0=0.2, x1=0.5, x2=0.6; gr->Line(mglPoint(x0,1-0*d),mglPoint(x1,1-0*d),"k-"); gr->Puts(mglPoint(x2,y-0*d),"Solid '-'",":rL"); @@ -268,34 +85,34 @@ void smgl_style(mglGraph *gr) // pen styles gr->Line(mglPoint(x0,1-5*d),mglPoint(x1,1-5*d),"ki"); gr->Puts(mglPoint(x2,y-5*d),"Small dash-dot 'i'",":rL"); gr->Line(mglPoint(x0,1-6*d),mglPoint(x1,1-6*d),"k:"); gr->Puts(mglPoint(x2,y-6*d),"Dots ':'",":rL"); gr->Line(mglPoint(x0,1-7*d),mglPoint(x1,1-7*d),"k "); gr->Puts(mglPoint(x2,y-7*d),"None ' '",":rL"); - + d=0.25; x1=-1; x0=-0.8; y = -0.05; - gr->Mark(mglPoint(x1,5*d),"."); gr->Puts(mglPoint(x0,y+5*d),"'.'",":rL"); - gr->Mark(mglPoint(x1,4*d),"+"); gr->Puts(mglPoint(x0,y+4*d),"'+'",":rL"); - gr->Mark(mglPoint(x1,3*d),"x"); gr->Puts(mglPoint(x0,y+3*d),"'x'",":rL"); - gr->Mark(mglPoint(x1,2*d),"*"); gr->Puts(mglPoint(x0,y+2*d),"'*'",":rL"); - gr->Mark(mglPoint(x1,d),"s"); gr->Puts(mglPoint(x0,y+d),"'s'",":rL"); - gr->Mark(mglPoint(x1,0),"d"); gr->Puts(mglPoint(x0,y),"'d'",":rL"); - gr->Mark(mglPoint(x1,-d,0),"o"); gr->Puts(mglPoint(x0,y-d),"'o'",":rL"); - gr->Mark(mglPoint(x1,-2*d,0),"^"); gr->Puts(mglPoint(x0,y-2*d),"'\\^'",":rL"); - gr->Mark(mglPoint(x1,-3*d,0),"v"); gr->Puts(mglPoint(x0,y-3*d),"'v'",":rL"); - gr->Mark(mglPoint(x1,-4*d,0),"<"); gr->Puts(mglPoint(x0,y-4*d),"'<'",":rL"); - gr->Mark(mglPoint(x1,-5*d,0),">"); gr->Puts(mglPoint(x0,y-5*d),"'>'",":rL"); - + gr->Mark(mglPoint(x1,5*d),"k."); gr->Puts(mglPoint(x0,y+5*d),"'.'",":rL"); + gr->Mark(mglPoint(x1,4*d),"k+"); gr->Puts(mglPoint(x0,y+4*d),"'+'",":rL"); + gr->Mark(mglPoint(x1,3*d),"kx"); gr->Puts(mglPoint(x0,y+3*d),"'x'",":rL"); + gr->Mark(mglPoint(x1,2*d),"k*"); gr->Puts(mglPoint(x0,y+2*d),"'*'",":rL"); + gr->Mark(mglPoint(x1,d),"ks"); gr->Puts(mglPoint(x0,y+d),"'s'",":rL"); + gr->Mark(mglPoint(x1,0),"kd"); gr->Puts(mglPoint(x0,y),"'d'",":rL"); + gr->Mark(mglPoint(x1,-d,0),"ko"); gr->Puts(mglPoint(x0,y-d),"'o'",":rL"); + gr->Mark(mglPoint(x1,-2*d,0),"k^"); gr->Puts(mglPoint(x0,y-2*d),"'\\^'",":rL"); + gr->Mark(mglPoint(x1,-3*d,0),"kv"); gr->Puts(mglPoint(x0,y-3*d),"'v'",":rL"); + gr->Mark(mglPoint(x1,-4*d,0),"k<"); gr->Puts(mglPoint(x0,y-4*d),"'<'",":rL"); + gr->Mark(mglPoint(x1,-5*d,0),"k>"); gr->Puts(mglPoint(x0,y-5*d),"'>'",":rL"); + d=0.25; x1=-0.5; x0=-0.3; y = -0.05; - gr->Mark(mglPoint(x1,5*d),"#."); gr->Puts(mglPoint(x0,y+5*d),"'\\#.'",":rL"); - gr->Mark(mglPoint(x1,4*d),"#+"); gr->Puts(mglPoint(x0,y+4*d),"'\\#+'",":rL"); - gr->Mark(mglPoint(x1,3*d),"#x"); gr->Puts(mglPoint(x0,y+3*d),"'\\#x'",":rL"); - gr->Mark(mglPoint(x1,2*d),"#*"); gr->Puts(mglPoint(x0,y+2*d),"'\\#*'",":rL"); - gr->Mark(mglPoint(x1,d),"#s"); gr->Puts(mglPoint(x0,y+d),"'\\#s'",":rL"); - gr->Mark(mglPoint(x1,0),"#d"); gr->Puts(mglPoint(x0,y),"'\\#d'",":rL"); - gr->Mark(mglPoint(x1,-d,0),"#o"); gr->Puts(mglPoint(x0,y-d),"'\\#o'",":rL"); - gr->Mark(mglPoint(x1,-2*d,0),"#^"); gr->Puts(mglPoint(x0,y-2*d),"'\\#\\^'",":rL"); - gr->Mark(mglPoint(x1,-3*d,0),"#v"); gr->Puts(mglPoint(x0,y-3*d),"'\\#v'",":rL"); - gr->Mark(mglPoint(x1,-4*d,0),"#<"); gr->Puts(mglPoint(x0,y-4*d),"'\\#<'",":rL"); - gr->Mark(mglPoint(x1,-5*d,0),"#>"); gr->Puts(mglPoint(x0,y-5*d),"'\\#>'",":rL"); - - gr->SubPlot(2,2,1); + gr->Mark(mglPoint(x1,5*d),"k#."); gr->Puts(mglPoint(x0,y+5*d),"'\\#.'",":rL"); + gr->Mark(mglPoint(x1,4*d),"k#+"); gr->Puts(mglPoint(x0,y+4*d),"'\\#+'",":rL"); + gr->Mark(mglPoint(x1,3*d),"k#x"); gr->Puts(mglPoint(x0,y+3*d),"'\\#x'",":rL"); + gr->Mark(mglPoint(x1,2*d),"k#*"); gr->Puts(mglPoint(x0,y+2*d),"'\\#*'",":rL"); + gr->Mark(mglPoint(x1,d),"k#s"); gr->Puts(mglPoint(x0,y+d),"'\\#s'",":rL"); + gr->Mark(mglPoint(x1,0),"k#d"); gr->Puts(mglPoint(x0,y),"'\\#d'",":rL"); + gr->Mark(mglPoint(x1,-d,0),"k#o"); gr->Puts(mglPoint(x0,y-d),"'\\#o'",":rL"); + gr->Mark(mglPoint(x1,-2*d,0),"k#^"); gr->Puts(mglPoint(x0,y-2*d),"'\\#\\^'",":rL"); + gr->Mark(mglPoint(x1,-3*d,0),"k#v"); gr->Puts(mglPoint(x0,y-3*d),"'\\#v'",":rL"); + gr->Mark(mglPoint(x1,-4*d,0),"k#<"); gr->Puts(mglPoint(x0,y-4*d),"'\\#<'",":rL"); + gr->Mark(mglPoint(x1,-5*d,0),"k#>"); gr->Puts(mglPoint(x0,y-5*d),"'\\#>'",":rL"); + + gr->SubPlot(3,2,1); double a=0.1,b=0.4,c=0.5; gr->Line(mglPoint(a,1),mglPoint(b,1),"k-A"); gr->Puts(mglPoint(c,1),"Style 'A' or 'A\\_'",":rL"); gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"k-V"); gr->Puts(mglPoint(c,0.8),"Style 'V' or 'V\\_'",":rL"); @@ -308,7 +125,7 @@ void smgl_style(mglGraph *gr) // pen styles gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-_"); gr->Puts(mglPoint(c,-0.6),"Style '\\_' or none",":rL"); gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-AS"); gr->Puts(mglPoint(c,-0.8),"Style 'AS'",":rL"); gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-_A"); gr->Puts(mglPoint(c,-1),"Style '\\_A'",":rL"); - + a=-1; b=-0.7; c=-0.6; gr->Line(mglPoint(a,1),mglPoint(b,1),"kAA"); gr->Puts(mglPoint(c,1),"Style 'AA'",":rL"); gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"kVV"); gr->Puts(mglPoint(c,0.8),"Style 'VV'",":rL"); @@ -321,8 +138,8 @@ void smgl_style(mglGraph *gr) // pen styles gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-__"); gr->Puts(mglPoint(c,-0.6),"Style '\\_\\_'",":rL"); gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-VA"); gr->Puts(mglPoint(c,-0.8),"Style 'VA'",":rL"); gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-AV"); gr->Puts(mglPoint(c,-1),"Style 'AV'",":rL"); - - gr->SubPlot(2,2,2); + + gr->SubPlot(3,2,2); //#LENUQ gr->FaceZ(mglPoint(-1, -1), 0.4, 0.3, "L#"); gr->Puts(mglPoint(-0.8,-0.9), "L", "w:C", -1.4); gr->FaceZ(mglPoint(-0.6,-1), 0.4, 0.3, "E#"); gr->Puts(mglPoint(-0.4,-0.9), "E", "w:C", -1.4); @@ -365,8 +182,11 @@ void smgl_style(mglGraph *gr) // pen styles gr->FaceZ(mglPoint(-0.2,0.8), 0.4, 0.3, "{r5}#"); gr->Puts(mglPoint(0, 0.9), "\\{r5\\}", "k:C", -1.4); gr->FaceZ(mglPoint(0.2, 0.8), 0.4, 0.3, "{r7}#"); gr->Puts(mglPoint(0.4, 0.9), "\\{r7\\}", "k:C", -1.4); gr->FaceZ(mglPoint(0.6, 0.8), 0.4, 0.3, "{r9}#"); gr->Puts(mglPoint(0.8, 0.9), "\\{r9\\}", "k:C", -1.4); - - gr->SubPlot(2,2,3); + // HEX + gr->FaceZ(mglPoint(-1, -1.3), 1, 0.3, "{xff9966}#"); gr->Puts(mglPoint(-0.5,-1.2), "\\{xff9966\\}", "k:C", -1.4); + gr->FaceZ(mglPoint(0, -1.3), 1, 0.3, "{x83CAFF}#"); gr->Puts(mglPoint( 0.5,-1.2), "\\{x83CAFF\\}", "k:C", -1.4); + + gr->SubPlot(3,2,3); char stl[3]="r1", txt[4]="'1'"; for(int i=0;i<10;i++) { @@ -374,1588 +194,85 @@ void smgl_style(mglGraph *gr) // pen styles gr->Line(mglPoint(-1,0.2*i-1),mglPoint(1,0.2*i-1),stl); gr->Puts(mglPoint(1.05,0.2*i-1),txt,":L"); } -} -//----------------------------------------------------------------------------- -const char *mmgl_text="subplot 2 2 0 ''\ntext 0 1 'Text can be in ASCII and in Unicode'\ntext 0 0.6 'It can be \\wire{wire}, \\big{big} or #r{colored}'\n" -"text 0 0.2 'One can change style in string: \\b{bold}, \\i{italic, \\b{both}}'\ntext 0 -0.2 'Easy to \\a{overline} or \\u{underline}'\n" -"text 0 -0.6 'Easy to change indexes ^{up} _{down} @{center}'\ntext 0 -1 'It parse TeX: \\int \\alpha \\cdot '\n'\\sqrt3{sin(\\pi x)^2 + \\gamma_{i_k}} dx'\n" -"subplot0 2 2 1 ''\n text 0 0 '\\sqrt{\\frac{\\alpha^{\\gamma^2}+\\overset 1{\\big\\infty}}{\\sqrt3{2+b}}}' '@' -2\n" -"subplot 2 2 2 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k'\ntext y 'Another string drawn above a curve' 'r:T'\n" -"subplot 2 2 3 '':line -1 -1 1 -1 'rA':text 0 -1 1 -1 'Horizontal'\n" -"line -1 -1 1 1 'rA':text 0 0 1 1 'At angle' '@'\nline -1 0 -1 1 'rA':text -1 0 -1 1 'Vertical'\n"; -void smgl_text(mglGraph *gr) // text drawing -{ - if(!mini) gr->SubPlot(2,2,0,""); - gr->Putsw(mglPoint(0,1),L"Text can be in ASCII and in Unicode"); - gr->Puts(mglPoint(0,0.6),"It can be \\wire{wire}, \\big{big} or #r{colored}"); - gr->Puts(mglPoint(0,0.2),"One can change style in string: " - "\\b{bold}, \\i{italic, \\b{both}}"); - gr->Puts(mglPoint(0,-0.2),"Easy to \\a{overline} or " - "\\u{underline}"); - gr->Puts(mglPoint(0,-0.6),"Easy to change indexes ^{up} _{down} @{center}"); - gr->Puts(mglPoint(0,-1),"It parse TeX: \\int \\alpha \\cdot " - "\\sqrt3{sin(\\pi x)^2 + \\gamma_{i_k}} dx"); - if(mini) return; - - gr->SubPlot(2,2,1,""); - gr->Puts(mglPoint(0,0.5), "\\sqrt{\\frac{\\alpha^{\\gamma^2}+\\overset 1{\\big\\infty}}{\\sqrt3{2+b}}}", "@", -2); - gr->Puts(mglPoint(0,-0.5),"Text can be printed\non several lines"); - - gr->SubPlot(2,2,2,""); - mglData y; mgls_prepare1d(&y); - gr->Box(); gr->Plot(y.SubData(-1,0)); - gr->Text(y,"This is very very long string drawn along a curve",":k"); - gr->Text(y,"Another string drawn above a curve","T:r"); - - gr->SubPlot(2,2,3,""); - gr->Line(mglPoint(-1,-1),mglPoint(1,-1),"rA"); gr->Puts(mglPoint(0,-1),mglPoint(1,-1),"Horizontal"); - gr->Line(mglPoint(-1,-1),mglPoint(1,1),"rA"); gr->Puts(mglPoint(0,0),mglPoint(1,1),"At angle","@"); - gr->Line(mglPoint(-1,-1),mglPoint(-1,1),"rA"); gr->Puts(mglPoint(-1,0),mglPoint(-1,1),"Vertical"); -} -//----------------------------------------------------------------------------- -const char *mmgl_fonts="loadfont 'bonum':text 0 1.1-2*d 'bonum font'\nloadfont 'chorus':text 0 1.1-3*d 'chorus font'\nloadfont 'cursor':text 0 1.1-4*d 'cursor font'\n" -"loadfont 'heros':text 0 1.1-5*d 'heros font'\nloadfont 'heroscn':text 0 1.1-6*d 'heroscn font'\nloadfont 'pagella':text 0 1.1-7*d 'pagella font'\n" -"loadfont 'schola':text 0 1.1-8*d 'schola font'\nloadfont 'termes':text 0 1.1-9*d 'termes font'\nnloadfont ''\n"; -void smgl_fonts(mglGraph *gr) // font typefaces -{ - double h=1.1, d=0.25; - gr->LoadFont("STIX"); gr->Puts(mglPoint(0,h), "default font (STIX)"); - gr->LoadFont("adventor"); gr->Puts(mglPoint(0,h-d), "adventor font"); - gr->LoadFont("bonum"); gr->Puts(mglPoint(0,h-2*d), "bonum font"); - gr->LoadFont("chorus"); gr->Puts(mglPoint(0,h-3*d), "chorus font"); - gr->LoadFont("cursor"); gr->Puts(mglPoint(0,h-4*d), "cursor font"); - gr->LoadFont("heros"); gr->Puts(mglPoint(0,h-5*d), "heros font"); - gr->LoadFont("heroscn"); gr->Puts(mglPoint(0,h-6*d), "heroscn font"); - gr->LoadFont("pagella"); gr->Puts(mglPoint(0,h-7*d), "pagella font"); - gr->LoadFont("schola"); gr->Puts(mglPoint(0,h-8*d), "schola font"); - gr->LoadFont("termes"); gr->Puts(mglPoint(0,h-9*d), "termes font"); - gr->LoadFont(""); -} -//----------------------------------------------------------------------------- -const char *mmgl_bars="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 0\n" -"subplot 3 2 0 '':title 'Bars plot (default)':box:bars ys\nsubplot 3 2 1 '':title '2 colors':box:bars ys 'cbgGyr'\n" -"subplot 3 2 4 '':title '\\\'\\#\\\' style':box:bars ys '#'\n" -"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 3 2 5:title '3d variant':rotate 50 60:box:bars xc yc z 'r'\n" -"ranges -1 1 -3 3:subplot 3 2 2 '':title '\\\'a\\\' style':box:bars ys 'a'\nsubplot 3 2 3 '':title '\\\'f\\\' style':box:bars ys 'f'\n"; -void smgl_bars(mglGraph *gr) -{ - mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); - gr->SetOrigin(0,0,0); - if(!mini) { gr->SubPlot(3,2,0,""); gr->Title("Bars plot (default)"); } - gr->Box(); gr->Bars(ys); - if(mini) return; - gr->SubPlot(3,2,1,""); gr->Title("2 colors"); gr->Box(); gr->Bars(ys,"cbgGyr"); - gr->SubPlot(3,2,4,""); gr->Title("'\\#' style"); gr->Box(); gr->Bars(ys,"#"); - gr->SubPlot(3,2,5); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); - mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); - yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); - gr->Bars(xc,yc,z,"r"); - gr->SetRanges(-1,1,-3,3); // increase range since summation can exceed [-1,1] - gr->SubPlot(3,2,2,""); gr->Title("'a' style"); gr->Box(); gr->Bars(ys,"a"); - gr->SubPlot(3,2,3,""); gr->Title("'f' style"); gr->Box(); gr->Bars(ys,"f"); -} -//----------------------------------------------------------------------------- -const char *mmgl_barh="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 0\n" -"subplot 2 2 0 '':title 'Barh plot (default)':box:barh ys\nsubplot 2 2 1 '':title '2 colors':box:barh y 'cbgGyr's\n" -"ranges -3 3 -1 1:subplot 2 2 2 '':title '\\\'a\\\' style':box:barh ys 'a'\nsubplot 2 2 3 '': title '\\\'f\\\' style':box:barh ys 'f'\n"; -void smgl_barh(mglGraph *gr) -{ - mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); - gr->SetOrigin(0,0,0); - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Barh plot (default)"); } - gr->Box(); gr->Barh(ys); - if(mini) return; - gr->SubPlot(2,2,1,""); gr->Title("2 colors"); gr->Box(); gr->Barh(ys,"cbgGyr"); - gr->SetRanges(-3,3,-1,1); // increase range since summation can exceed [-1,1] - gr->SubPlot(2,2,2,""); gr->Title("'a' style"); gr->Box(); gr->Barh(ys,"a"); - gr->SubPlot(2,2,3,""); gr->Title("'f' style"); gr->Box(); gr->Barh(ys,"f"); -} -//----------------------------------------------------------------------------- -const char *mmgl_area="origin 0 0 0\nsubplot 2 2 0 '':title 'Area plot (default)':box:area y\n" -"subplot 2 2 1 '':title '2 colors':box:area y 'cbgGyr'\nsubplot 2 2 2 '':title '\\\'!\\\' style':box:area y '!'\n" -"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 3:title '3d variant':rotate 50 60:box:area xc yc z 'r'\n"; -void smgl_area(mglGraph *gr) -{ - mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Area plot (default)"); } - gr->Box(); gr->Area(y); - if(mini) return; - gr->SubPlot(2,2,1,""); gr->Title("2 colors"); gr->Box(); gr->Area(y,"cbgGyr"); - gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Area(y,"!"); - gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); - mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); - yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); - gr->Area(xc,yc,z,"r"); -} -//----------------------------------------------------------------------------- -const char *mmgl_plot="subplot 2 2 0 '':title 'Plot plot (default)':box:plot y\n" -"subplot 2 2 2 '':title ''!' style; 'rgb' palette':box:plot y 'o!rgb'\nsubplot 2 2 3 '':title 'just markers':box:plot y ' +'\n" -"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:plot xc yc z 'rs'\n"; -void smgl_plot(mglGraph *gr) -{ - mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Plot plot (default)"); } - gr->Box(); gr->Plot(y); - if(mini) return; - gr->SubPlot(2,2,2,""); gr->Title("'!' style; 'rgb' palette"); gr->Box(); gr->Plot(y,"o!rgb"); - gr->SubPlot(2,2,3,""); gr->Title("just markers"); gr->Box(); gr->Plot(y," +"); - gr->SubPlot(2,2,1); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); - mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); - yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); - gr->Plot(xc,yc,z,"rs"); -} -//----------------------------------------------------------------------------- -const char *mmgl_tens="subplot 2 2 0 '':title 'Tens plot (default)':box:tens y(:.0) y(:,1)\nsubplot 2 2 1 '':title '' ' style':box:plot y(:.0) y(:,1) 'o '\n" -"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:tens xc yc z z 's'\n"; -void smgl_tens(mglGraph *gr) -{ - mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Tens plot (default)"); } - gr->Box(); gr->Tens(y.SubData(-1,0), y.SubData(-1,1)); - if(mini) return; - gr->SubPlot(2,2,2,""); gr->Title("' ' style"); gr->Box(); gr->Tens(y.SubData(-1,0), y.SubData(-1,1),"o "); - gr->SubPlot(2,2,1); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); - mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); - yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); - gr->Tens(xc,yc,z,z,"s"); -} -//----------------------------------------------------------------------------- -const char *mmgl_region="copy y1 y(:,1):copy y2 y(:,2)\n" -"subplot 2 2 0 '':title 'Region plot (default)':box:region y1 y2:plot y1 'k2':plot y2 'k2'\n" -"subplot 2 2 1 '':title '2 colors':box:region y1 y2 'yr':plot y1 'k2':plot y2 'k2'\n" -"subplot 2 2 2 '':title '\\\'!\\\' style':box:region y1 y2 '!':plot y1 'k2':plot y2 'k2'\n" -"subplot 2 2 3 '':title '\\\'i\\\' style':box:region y1 y2 'ir':plot y1 'k2':plot y2 'k2'\n"; -void smgl_region(mglGraph *gr) -{ - mglData y; mgls_prepare1d(&y); - mglData y1 = y.SubData(-1,1), y2 = y.SubData(-1,2); gr->SetOrigin(0,0,0); - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Region plot (default)"); } - gr->Box(); gr->Region(y1,y2); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); - if(mini) return; - gr->SubPlot(2,2,1,""); gr->Title("2 colors"); gr->Box(); gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); - gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Region(y1,y2,"!"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); - gr->SubPlot(2,2,3,""); gr->Title("'i' style"); gr->Box(); gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); -} -//----------------------------------------------------------------------------- -const char *mmgl_stem="origin 0 0 0:subplot 2 2 0 '':title 'Stem plot (default)':box:stem y\n" -"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:stem xc yc z 'rx'\n" -"subplot 2 2 2 '':title '\\\\'!\\\' style':box:stem y 'o!rgb'\n"; -void smgl_stem(mglGraph *gr) -{ - mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); - mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); - yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Stem plot (default)"); } - gr->Box(); gr->Stem(y); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("3d variant"); gr->Rotate(50,60); - gr->Box(); gr->Stem(xc,yc,z,"rx"); - gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Stem(y,"o!rgb"); -} -//----------------------------------------------------------------------------- -const char *mmgl_step="origin 0 0 0:subplot 2 2 0 '':title 'Step plot (default)':box:step y\n" -"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:step xc yc z 'r'\n" -"subplot 2 2 2 '':title '\\\\'!\\\' style':box:step y 's!rgb'\n"; -void smgl_step(mglGraph *gr) -{ - mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); - mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); - yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Step plot (default)"); } - gr->Box(); gr->Step(y); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("3d variant"); gr->Rotate(50,60); - gr->Box(); gr->Step(xc,yc,z,"r"); - gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Step(y,"s!rgb"); -} -//----------------------------------------------------------------------------- -const char *mmgl_boxplot="new a 10 7 '(2*rnd-1)^3/2'\nsubplot 1 1 0 '':title 'Boxplot plot':box:boxplot a"; -void smgl_boxplot(mglGraph *gr) // flow threads and density plot -{ - mglData a(10,7); a.Modify("(2*rnd-1)^3/2"); - if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Boxplot plot"); } - gr->Box(); gr->BoxPlot(a); -} -//----------------------------------------------------------------------------- -const char *mmgl_type0="alpha on:light on:transptype 0:clf\nsubplot 2 2 0:rotate 50 60:surf a:box\n" -"subplot 2 2 1:rotate 50 60:dens a:box\nsubplot 2 2 2:rotate 50 60:cont a:box\n" -"subplot 2 2 3:rotate 50 60:axial a:box"; -void smgl_type0(mglGraph *gr) // TranspType = 0 -{ - gr->Alpha(true); gr->Light(true); - mglData a; mgls_prepare2d(&a); - gr->SetTranspType(0); gr->Clf(); - gr->SubPlot(2,2,0); gr->Rotate(50,60); gr->Surf(a); gr->Box(); - gr->SubPlot(2,2,1); gr->Rotate(50,60); gr->Dens(a); gr->Box(); - gr->SubPlot(2,2,2); gr->Rotate(50,60); gr->Cont(a); gr->Box(); - gr->SubPlot(2,2,3); gr->Rotate(50,60); gr->Axial(a); gr->Box(); -} -//----------------------------------------------------------------------------- -const char *mmgl_type1="alpha on:light on:transptype 1:clf\nsubplot 2 2 0:rotate 50 60:surf a:box\n" -"subplot 2 2 1:rotate 50 60:dens a:box\nsubplot 2 2 2:rotate 50 60:cont a:box\n" -"subplot 2 2 3:rotate 50 60:axial a:box"; -void smgl_type1(mglGraph *gr) // TranspType = 1 -{ - gr->Alpha(true); gr->Light(true); - mglData a; mgls_prepare2d(&a); - gr->SetTranspType(1); gr->Clf(); - gr->SubPlot(2,2,0); gr->Rotate(50,60); gr->Surf(a); gr->Box(); - gr->SubPlot(2,2,1); gr->Rotate(50,60); gr->Dens(a); gr->Box(); - gr->SubPlot(2,2,2); gr->Rotate(50,60); gr->Cont(a); gr->Box(); - gr->SubPlot(2,2,3); gr->Rotate(50,60); gr->Axial(a); gr->Box(); -} -//----------------------------------------------------------------------------- -const char *mmgl_type2="alpha on:light on:transptype 2:clf\nsubplot 2 2 0:rotate 50 60:surf a:box\n" -"subplot 2 2 1:rotate 50 60:dens a:box\nsubplot 2 2 2:rotate 50 60:cont a:box\n" -"subplot 2 2 3:rotate 50 60:axial a:box"; -void smgl_type2(mglGraph *gr) // TranspType = 2 -{ - gr->Alpha(true); gr->Light(true); - mglData a; mgls_prepare2d(&a); - gr->SetTranspType(2); gr->Clf(); - gr->SubPlot(2,2,0); gr->Rotate(50,60); gr->Surf(a); gr->Box(); - gr->SubPlot(2,2,1); gr->Rotate(50,60); gr->Dens(a); gr->Box(); - gr->SubPlot(2,2,2); gr->Rotate(50,60); gr->Cont(a); gr->Box(); - gr->SubPlot(2,2,3); gr->Rotate(50,60); gr->Axial(a); gr->Box(); -} -//----------------------------------------------------------------------------- -const char *mmgl_molecule="alpha on:light on\n" -"subplot 2 2 0 '':title 'Methane, CH_4':rotate 60 120\n" -"sphere 0 0 0 0.25 'k':drop 0 0 0 0 0 1 0.35 'h' 1 2:sphere 0 0 0.7 0.25 'g'\n" -"drop 0 0 0 -0.94 0 -0.33 0.35 'h' 1 2:sphere -0.66 0 -0.23 0.25 'g'\n" -"drop 0 0 0 0.47 0.82 -0.33 0.35 'h' 1 2:sphere 0.33 0.57 -0.23 0.25 'g'\n" -"drop 0 0 0 0.47 -0.82 -0.33 0.35 'h' 1 2:sphere 0.33 -0.57 -0.23 0.25 'g'\n" -"subplot 2 2 1 '':title 'Water, H{_2}O':rotate 60 100\n" -"sphere 0 0 0 0.25 'r':drop 0 0 0 0.3 0.5 0 0.3 'm' 1 2:sphere 0.3 0.5 0 0.25 'g'\n" -"drop 0 0 0 0.3 -0.5 0 0.3 'm' 1 2:sphere 0.3 -0.5 0 0.25 'g'\n" -"subplot 2 2 2 '':title 'Oxygen, O_2':rotate 60 120\n" -"drop 0 0.5 0 0 -0.3 0 0.3 'm' 1 2:sphere 0 0.5 0 0.25 'r'\n" -"drop 0 -0.5 0 0 0.3 0 0.3 'm' 1 2:sphere 0 -0.5 0 0.25 'r'\n" -"subplot 2 2 3 '':title 'Ammonia, NH_3':rotate 60 120\n" -"sphere 0 0 0 0.25 'b':drop 0 0 0 0.33 0.57 0 0.32 'n' 1 2\n" -"sphere 0.33 0.57 0 0.25 'g':drop 0 0 0 0.33 -0.57 0 0.32 'n' 1 2\n" -"sphere 0.33 -0.57 0 0.25 'g':drop 0 0 0 -0.65 0 0 0.32 'n' 1 2\n" -"sphere -0.65 0 0 0.25 'g'\n"; -void smgl_molecule(mglGraph *gr) // example of moleculas -{ - gr->VertexColor(false); gr->Compression(false); // per-vertex colors and compression are detrimental to transparency - gr->DoubleSided(false); // we do not get into atoms, while rendering internal surface has negative impact on trasparency - gr->Alpha(true); gr->Light(true); - - gr->SubPlot(2,2,0,""); gr->Title("Methane, CH_4"); - gr->StartGroup("Methane"); - gr->Rotate(60,120); - gr->Sphere(mglPoint(0,0,0),0.25,"k"); - gr->Drop(mglPoint(0,0,0),mglPoint(0,0,1),0.35,"h",1,2); - gr->Sphere(mglPoint(0,0,0.7),0.25,"g"); - gr->Drop(mglPoint(0,0,0),mglPoint(-0.94,0,-0.33),0.35,"h",1,2); - gr->Sphere(mglPoint(-0.66,0,-0.23),0.25,"g"); - gr->Drop(mglPoint(0,0,0),mglPoint(0.47,0.82,-0.33),0.35,"h",1,2); - gr->Sphere(mglPoint(0.33,0.57,-0.23),0.25,"g"); - gr->Drop(mglPoint(0,0,0),mglPoint(0.47,-0.82,-0.33),0.35,"h",1,2); - gr->Sphere(mglPoint(0.33,-0.57,-0.23),0.25,"g"); - gr->EndGroup(); - - gr->SubPlot(2,2,1,""); gr->Title("Water, H_{2}O"); - gr->StartGroup("Water"); - gr->Rotate(60,100); - gr->StartGroup("Water_O"); - gr->Sphere(mglPoint(0,0,0),0.25,"r"); - gr->EndGroup(); - gr->StartGroup("Water_Bond_1"); - gr->Drop(mglPoint(0,0,0),mglPoint(0.3,0.5,0),0.3,"m",1,2); - gr->EndGroup(); - gr->StartGroup("Water_H_1"); - gr->Sphere(mglPoint(0.3,0.5,0),0.25,"g"); - gr->EndGroup(); - gr->StartGroup("Water_Bond_2"); - gr->Drop(mglPoint(0,0,0),mglPoint(0.3,-0.5,0),0.3,"m",1,2); - gr->EndGroup(); - gr->StartGroup("Water_H_2"); - gr->Sphere(mglPoint(0.3,-0.5,0),0.25,"g"); - gr->EndGroup(); - gr->EndGroup(); - - gr->SubPlot(2,2,2,""); gr->Title("Oxygen, O_2"); - gr->StartGroup("Oxygen"); - gr->Rotate(60,120); - gr->Drop(mglPoint(0,0.5,0),mglPoint(0,-0.3,0),0.3,"m",1,2); - gr->Sphere(mglPoint(0,0.5,0),0.25,"r"); - gr->Drop(mglPoint(0,-0.5,0),mglPoint(0,0.3,0),0.3,"m",1,2); - gr->Sphere(mglPoint(0,-0.5,0),0.25,"r"); - gr->EndGroup(); - - gr->SubPlot(2,2,3,""); gr->Title("Ammonia, NH_3"); - gr->StartGroup("Ammonia"); - gr->Rotate(60,120); - gr->Sphere(mglPoint(0,0,0),0.25,"b"); - gr->Drop(mglPoint(0,0,0),mglPoint(0.33,0.57,0),0.32,"n",1,2); - gr->Sphere(mglPoint(0.33,0.57,0),0.25,"g"); - gr->Drop(mglPoint(0,0,0),mglPoint(0.33,-0.57,0),0.32,"n",1,2); - gr->Sphere(mglPoint(0.33,-0.57,0),0.25,"g"); - gr->Drop(mglPoint(0,0,0),mglPoint(-0.65,0,0),0.32,"n",1,2); - gr->Sphere(mglPoint(-0.65,0,0),0.25,"g"); - gr->EndGroup(); - gr->DoubleSided( true ); // put back -} -//----------------------------------------------------------------------------- -const char *mmgl_error="new y 50 '0.7*sin(pi*x-pi) + 0.5*cos(3*pi*(x+1)/2) + 0.2*sin(pi*(x+1)/2)'\n" -"new x0 10 'x + 0.1*rnd-0.05':new ex 10 '0.1':new ey 10 '0.2'\n" -"new y0 10 '0.7*sin(pi*x-pi) + 0.5*cos(3*pi*(x+1)/2) + 0.2*sin(pi*(x+1)/2) + 0.2*rnd-0.1'\n" -"subplot 2 2 0 '':title 'Error plot (default)':box:plot y:error x0 y0 ex ey 'k'\n" -"subplot 2 2 1 '':title '\\\'!\\\' style; no e_x':box:plot y:error x0 y0 ex ey 'o!rgb'\n" -"subplot 2 2 2 '':title '\\\'\\@\\\' style':box:plot y:error x0 y0 ex ey '@'; alpha 0.5\n" -"subplot 2 2 3 '':title '3d variant':rotate 50 60:axis\n" -"for $1 0 9\n\terror 2*rnd-1 2*rnd-1 2*rnd-1 0.2 0.2 0.2 'bo'\nnext\n"; -void smgl_error(mglGraph *gr) -{ - mglData y; mgls_prepare1d(&y); - mglData x0(10), y0(10), ex0(10), ey0(10); - double x; - for(int i=0;i<10;i++) - { - x = i/9.; - x0.a[i] = 2*x-1 + 0.1*mgl_rnd()-0.05; - y0.a[i] = 0.7*sin(2*M_PI*x)+0.5*cos(3*M_PI*x)+0.2*sin(M_PI*x)+0.2*mgl_rnd()-0.1; - ey0.a[i]=0.2; ex0.a[i]=0.1; - } - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Error plot (default)"); } - gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Error(x0,y0,ex0,ey0,"ko"); - if(mini) return; - gr->SubPlot(2,2,1,""); gr->Title("'!' style; no e_x"); - gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Error(x0,y0,ey0,"o!rgb"); - gr->SubPlot(2,2,2,""); gr->Title("'\\@' style"); - gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Error(x0,y0,ex0,ey0,"@","alpha 0.5"); - gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); - for(int i=0;i<10;i++) - gr->Error(mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1,2*mgl_rnd()-1), mglPoint(0.2,0.2,0.2),"bo"); - gr->Axis(); -} -//----------------------------------------------------------------------------- -const char *mmgl_chart="new ch 7 2 'rnd+0.1':light on\n" -"subplot 2 2 0:title 'Chart plot (default)':rotate 50 60:box:chart ch\n" -"subplot 2 2 1:title '\\\'\\#\\\' style':rotate 50 60:box:chart ch '#'\n" -"subplot 2 2 2:title 'Pie chart; \\\'\\\' style':rotate 50 60:\n" -"axis '(y+1)/2*cos(pi*x)' '(y+1)/2*sin(pi*x)':box:chart ch 'bgr cmy#'\n" -"subplot 2 2 2:title 'Ring chart; \\\'\\\' style':rotate 50 60:\n" -"axis '(y+2)/3*cos(pi*x)' '(y+2)/3*sin(pi*x)':box:chart ch 'bgr cmy#'\n"; -void smgl_chart(mglGraph *gr) -{ - mglData ch(7,2); for(int i=0;i<7*2;i++) ch.a[i]=mgl_rnd()+0.1; - if(!mini) { gr->SubPlot(2,2,0); gr->Title("Chart plot (default)"); } - gr->Light(true); gr->Rotate(50,60); gr->Box(); gr->Chart(ch); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("'\\#' style"); - gr->Rotate(50,60); gr->Box(); gr->Chart(ch,"#"); - gr->SubPlot(2,2,2); gr->Title("Pie chart; ' ' color"); - gr->SetFunc("(y+1)/2*cos(pi*x)","(y+1)/2*sin(pi*x)",""); - gr->Rotate(50,60); gr->Box(); gr->Chart(ch,"bgr cmy#"); - gr->SubPlot(2,2,3); gr->Title("Ring chart; ' ' color"); - gr->SetFunc("(y+2)/3*cos(pi*x)","(y+2)/3*sin(pi*x)",""); - gr->Rotate(50,60); gr->Box(); gr->Chart(ch,"bgr cmy#"); -} -//----------------------------------------------------------------------------- -const char *mmgl_mark="subplot 1 1 0:title 'Mark plot (default)':box:mark y y1 's'\n"; -void smgl_mark(mglGraph *gr) -{ - mglData y,y1; mgls_prepare1d(&y,&y1); - if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Mark plot (default)"); } - gr->Box(); gr->Mark(y,y1,"s"); -} -//----------------------------------------------------------------------------- -const char *mmgl_radar="new yr 10 3 '0.4*sin(pi*(x+1.5+y/2)+0.1*rnd)'\n" -"subplot 1 1 0 '':title 'Radar plot (with grid, \\\'\\#\\\')':box:radar yr '#'\n"; -void smgl_radar(mglGraph *gr) -{ - mglData yr(10,3); yr.Modify("0.4*sin(pi*(2*x+y))+0.1*rnd"); - if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Radar plot (with grid, '\\#')"); } - gr->Radar(yr,"#"); -} -//----------------------------------------------------------------------------- -const char *mmgl_candle="new y 30 'sin(pi*x/2)^2':copy y1 y/2:copy y2 (y+1)/2\n" -"subplot 1 1 0 '':title 'Candle plot (with grid, \\\'\\#\\\')'\nyrange 0 1:box:candle y y1 y2\n"; -void smgl_candle(mglGraph *gr) -{ - mglData y(30); gr->Fill(y,"sin(pi*x/2)^2"); - mglData y1(30); gr->Fill(y1,"v/2",y); - mglData y2(30); gr->Fill(y2,"(1+v)/2",y); - if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Candle plot (default)"); } - gr->SetRange('y',0,1); gr->Box(); gr->Candle(y,y1,y2); -} -//----------------------------------------------------------------------------- -const char *mmgl_textmark="subplot 1 1 0 '':title 'TextMark plot (default)':box:textmark y y1 '\\gamma' 'r'\n"; -void smgl_textmark(mglGraph *gr) -{ - mglData y,y1; mgls_prepare1d(&y,&y1); - if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("TextMark plot (default)"); } - gr->Box(); gr->TextMark(y,y1,"\\gamma","r"); -} -//----------------------------------------------------------------------------- -const char *mmgl_tube="new yc 50 'sin(pi*x)':new xc 50 'cos(pi*x)':new z 50 'x':divto y1 20\n" -"subplot 2 2 0 '':title 'Tube plot (default)':box:tube y 0.05\n" -"subplot 2 2 1 '':title 'variable radius':box:tube y y1\n" -"subplot 2 2 2 '':title '\\\'\\#\\\' style':box:tube y 0.05 '#'\n" -"subplot 2 2 3:title '3d variant':rotate 50 60:box:tube xc yc z y2 'r'\n"; -void smgl_tube(mglGraph *gr) -{ - mglData y,y1,y2; mgls_prepare1d(&y,&y1,&y2); y1/=20; - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Tube plot (default)"); } - gr->Light(true); gr->Box(); gr->Tube(y,0.05); - if(mini) return; - gr->SubPlot(2,2,1,""); gr->Title("variable radius"); gr->Box(); gr->Tube(y,y1); - gr->SubPlot(2,2,2,""); gr->Title("'\\#' style"); gr->Box(); gr->Tube(y,0.05,"#"); - mglData yc(50), xc(50), z(50); z.Modify("2*x-1"); - yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); - gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); gr->Tube(xc,yc,z,y2,"r"); -} -//----------------------------------------------------------------------------- -const char *mmgl_tape="new yc 50 'sin(pi*x)':new xc 50 'cos(pi*x)':new z 50 'x'\n" -"subplot 2 2 0 '':title 'Tape plot (default)':box:tape y:plot y 'k'\n" -"subplot 2 2 1:title '3d variant, 2 colors':rotate 50 60:light on\n" -"box:plot xc yc z 'k':tape xc yc z 'rg'\n" -"subplot 2 2 2:title '3d variant, x only':rotate 50 60\n" -"box:plot xc yc z 'k':tape xc yc z 'xr':tape xc yc z 'xr#'\n" -"subplot 2 2 2:title '3d variant, z only':rotate 50 60\n" -"box:plot xc yc z 'k':tape xc yc z 'zg':tape xc yc z 'zg#'\n"; -void smgl_tape(mglGraph *gr) -{ - mglData y; mgls_prepare1d(&y); - mglData xc(50), yc(50), z(50); - yc.Modify("sin(pi*(2*x-1))"); - xc.Modify("cos(pi*2*x-pi)"); z.Fill(-1,1); - if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Tape plot (default)"); } - gr->Box(); gr->Tape(y); gr->Plot(y,"k"); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("3d variant, 2 colors"); gr->Rotate(50,60); gr->Light(true); - gr->Box(); gr->Plot(xc,yc,z,"k"); gr->Tape(xc,yc,z,"rg"); - gr->SubPlot(2,2,2); gr->Title("3d variant, x only"); gr->Rotate(50,60); - gr->Box(); gr->Plot(xc,yc,z,"k"); gr->Tape(xc,yc,z,"xr"); gr->Tape(xc,yc,z,"xr#"); - gr->SubPlot(2,2,3); gr->Title("3d variant, z only"); gr->Rotate(50,60); - gr->Box(); gr->Plot(xc,yc,z,"k"); gr->Tape(xc,yc,z,"zg"); gr->Tape(xc,yc,z,"zg#"); -} -//----------------------------------------------------------------------------- -const char *mmgl_fog="rotate 50 60:light on:fog 1\nbox:surf a\n"; -void smgl_fog(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - if(!mini) gr->Title("Fog sample"); - gr->Light(true); gr->Rotate(50,60); gr->Fog(1); gr->Box(); - gr->Surf(a); -} -//----------------------------------------------------------------------------- -const char *mmgl_map="new a 50 40 'x':new b 50 40 'y':zrange -2 2:text 0 0 '\to'\n" -"subplot 2 1 0:text 0 1.1 '\\{x, y\\}' '' -2:box:map a b 'brgk' 0 0\n" -"subplot 2 1 1:text 0 1.1 '\\{\\frac{x^3+y^3}{2}, \\frac{x-y}{2}\\}' '' -2\n" -"box:fill a '(x^3+y^3)/2':fill b '(x-y)/2':map a b 'brgk' 0 0\n"; -void smgl_map(mglGraph *gr) // example of mapping -{ - mglData a(50, 40), b(50, 40); - gr->Puts(mglPoint(0, 0), "\\to", ":C", -1.4); - gr->SetRanges(-1,1,-1,1,-2,2); - - gr->SubPlot(2, 1, 0); - gr->Fill(a,"x"); gr->Fill(b,"y"); - gr->Puts(mglPoint(0, 1.1), "\\{x, y\\}", ":C", -2); gr->Box(); - gr->Map(a, b, "brgk"); - - gr->SubPlot(2, 1, 1); - gr->Fill(a,"(x^3+y^3)/2"); gr->Fill(b,"(x-y)/2"); - gr->Puts(mglPoint(0, 1.1), "\\{\\frac{x^3+y^3}{2}, \\frac{x-y}{2}\\}", ":C", -2); - gr->Box(); - gr->Map(a, b, "brgk"); -} -//----------------------------------------------------------------------------- -const char *mmgl_stfa="new a 2000:new b 2000\nfill a 'cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+'\n" -"'cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)'\n" -"subplot 1 2 0:plot a:axis:xlabel '\\i t'\n" -"subplot 1 2 1:stfa a b 64:axis:ylabel '\\omega' 0:xlabel '\\i t'\n"; -void smgl_stfa(mglGraph *gr) // STFA sample -{ - mglData a(2000), b(2000); - gr->Fill(a,"cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+\ - cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)"); - gr->SubPlot(1, 2, 0,"<_"); gr->Title("Initial signal"); - gr->Plot(a); - gr->Axis(); - gr->Label('x', "\\i t"); - - gr->SubPlot(1, 2, 1,"<_"); gr->Title("STFA plot"); - gr->STFA(a, b, 64); - gr->Axis(); - gr->Label('x', "\\i t"); - gr->Label('y', "\\omega", 0); -} -//----------------------------------------------------------------------------- -const char *mmgl_qo2d="define $1 'p^2+q^2-x-1+i*0.5*(y+x)*(y>-x)'\n" -"subplot 1 1 0 '<_':title 'Beam and ray tracing'\n" -"ray r $1 -0.7 -1 0 0 0.5 0 0.02 2:plot r(0) r(1) 'k'\naxis:xlabel '\\i x':ylabel '\\i z'\n" -"new re 128 'exp(-48*x^2)':new im 128:qo2d a $1 re im r 1 30 xx yy\n" -"crange 0 1:dens xx yy a 'wyrRk':fplot '-x' 'k|'\n" -"text 0 0.85 'absorption: (x+y)/2 for x+y>0'\ntext 0.7 -0.05 'central ray'"; -void smgl_qo2d(mglGraph *gr) -{ - mglData r, xx, yy, a, im(128), re(128); - const char *ham = "p^2+q^2-x-1+i*0.5*(y+x)*(y>-x)"; - r = mglRay(ham, mglPoint(-0.7, -1), mglPoint(0, 0.5), 0.02, 2); - if(!mini) {gr->SubPlot(1,1,0,"<_"); gr->Title("Beam and ray tracing");} - gr->Plot(r.SubData(0), r.SubData(1), "k"); - gr->Axis(); gr->Label('x', "\\i x"); gr->Label('y', "\\i z"); - // now start beam tracing - gr->Fill(re,"exp(-48*x^2)"); - a = mglQO2d(ham, re, im, r, xx, yy, 1, 30); - gr->SetRange('c',0, 1); - gr->Dens(xx, yy, a, "wyrRk"); - gr->FPlot("-x", "k|"); - gr->Puts(mglPoint(0, 0.85), "absorption: (x+y)/2 for x+y>0"); - gr->Puts(mglPoint(0.7, -0.05), "central ray"); -} -//----------------------------------------------------------------------------- -const char *mmgl_pde="new re 128 'exp(-48*(x+0.7)^2)':new im 128\n" -"pde a 'p^2+q^2-x-1+i*0.5*(z+x)*(z>-x)' re im 0.01 30\ntranspose a\n" -"subplot 1 1 0 '<_':title 'PDE solver'\n" -"axis:xlabel '\\i x':ylabel '\\i z'\ncrange 0 1:dens a 'wyrRk'\n" -"fplot '-x' 'k|':text 0 0.85 'absorption: (x+z)/2 for x+z>0'\n" -"text 0 1.1 'Equation: ik_0\\partial_zu + \\Delta u + x\\cdot u + i \\frac{x+z}{2}\\cdot u = 0'"; -void smgl_pde(mglGraph *gr) // PDE sample -{ - mglData a,re(128),im(128); - gr->Fill(re,"exp(-48*(x+0.7)^2)"); - a = gr->PDE("p^2+q^2-x-1+i*0.5*(z+x)*(z>-x)", re, im, 0.01, 30); - a.Transpose("yxz"); - if(!mini) {gr->SubPlot(1,1,0,"<_"); gr->Title("PDE solver"); } - gr->SetRange('c',0,1); gr->Dens(a,"wyrRk"); - gr->Axis(); gr->Label('x', "\\i x"); gr->Label('y', "\\i z"); - gr->FPlot("-x", "k|"); - gr->Puts(mglPoint(0, 0.85), "absorption: (x+z)/2 for x+z>0"); - gr->Puts(mglPoint(0,1.1),"Equation: ik_0\\partial_zu + \\Delta u + x\\cdot u + i \\frac{x+z}{2}\\cdot u = 0"); -} -//----------------------------------------------------------------------------- -const char *mmgl_conta="title 'Cont3 sample':rotate 50 60:box\ncont3 c 'x':cont3 c:cont3 c 'z'"; -void smgl_conta(mglGraph *gr) -{ - mglData c; mgls_prepare3d(&c); - if(!mini) gr->Title("Cont3 sample"); - gr->Rotate(50,60); gr->Box(); - gr->Cont3(c,"x"); gr->Cont3(c); gr->Cont3(c,"z"); -} -//----------------------------------------------------------------------------- -const char *mmgl_contfa="title 'Cont3 sample':rotate 50 60:light on:box\n" -"contf3 c 'x':contf3 c:contf3 c 'z'\ncont3 c 'xk':cont3 c 'k':cont3 c 'zk'\n"; -void smgl_contfa(mglGraph *gr) -{ - mglData c; mgls_prepare3d(&c); - if(!mini) gr->Title("ContF3 sample"); - gr->Rotate(50,60); gr->Light(true); gr->Box(); - gr->ContF3(c,"x"); gr->ContF3(c); gr->ContF3(c,"z"); - gr->Cont3(c,"kx"); gr->Cont3(c,"k"); gr->Cont3(c,"kz"); -} -//----------------------------------------------------------------------------- -const char *mmgl_densa="title 'Dens3 sample':rotate 50 60:alpha on:alphadef 0.7\n" -"origin 0 0 0:box:axis '_xyz'\ndens3 c 'x':dens3 c ':y':dens3 c 'z'"; -void smgl_densa(mglGraph *gr) -{ - mglData c; mgls_prepare3d(&c); - if(!mini) gr->Title("Dens3 sample"); - gr->Rotate(50,60); gr->Alpha(true); gr->SetAlphaDef(0.7); - gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box(); - gr->Dens3(c,"x"); gr->Dens3(c); gr->Dens3(c,"z"); -} -//----------------------------------------------------------------------------- -const char *mmgl_dens_xyz="title 'Dens[XYZ] sample':rotate 50 60:light on:box\n" -"densx c.sum('x') '' -1:densy c.sum('y') '' 1:densz c.sum('z') '' -1"; -void smgl_dens_xyz(mglGraph *gr) -{ - mglData c; mgls_prepare3d(&c); - if(!mini) gr->Title("Dens[XYZ] sample"); - gr->Rotate(50,60); gr->Box(); gr->DensX(c.Sum("x"),0,-1); - gr->DensY(c.Sum("y"),0,1); gr->DensZ(c.Sum("z"),0,-1); -} -//----------------------------------------------------------------------------- -const char *mmgl_cont_xyz="title 'Cont[XYZ] sample':rotate 50 60:light on:box\n" -"contx c.sum('x') '' -1:conty c.sum('y') '' 1:contz c.sum('z') '' -1"; -void smgl_cont_xyz(mglGraph *gr) -{ - mglData c; mgls_prepare3d(&c); - if(!mini) gr->Title("Cont[XYZ] sample"); - gr->Rotate(50,60); gr->Box(); gr->ContX(c.Sum("x"),"",-1); - gr->ContY(c.Sum("y"),"",1); gr->ContZ(c.Sum("z"),"",-1); -} -//----------------------------------------------------------------------------- -const char *mmgl_contf_xyz="title 'ContF[XYZ] sample':rotate 50 60:light on:box\n" -"contfx c.sum('x') '' -1:contfy c.sum('y') '' 1:contfz c.sum('z') '' -1"; -void smgl_contf_xyz(mglGraph *gr) -{ - mglData c; mgls_prepare3d(&c); - if(!mini) gr->Title("ContF[XYZ] sample"); - gr->Rotate(50,60); gr->Box(); gr->ContFX(c.Sum("x"),"",-1); - gr->ContFY(c.Sum("y"),"",1); gr->ContFZ(c.Sum("z"),"",-1); -} -//----------------------------------------------------------------------------- -const char *mmgl_cloud="subplot 2 2 0:title 'Cloud plot':rotate 50 60:alpha on:box:cloud c 'wyrRk'" -"subplot 2 2 1:title '\\\'!\\\' style':rotate 50 60:box:cloud c '!wyrRk'" -"subplot 2 2 2:title '\\\'.\\\' style':rotate 50 60:box:cloud c '.wyrRk'" -"subplot 2 2 3:title 'meshnum 10':rotate 50 60:box:cloud c 'wyrRk'; meshnum 10"; -void smgl_cloud(mglGraph *gr) -{ - mglData c; mgls_prepare3d(&c); - if(!mini) { gr->SubPlot(2,2,0); gr->Title("Cloud plot"); } - gr->Rotate(50,60); gr->Alpha(true); - gr->Box(); gr->Cloud(c,"wyrRk"); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("'!' style"); - gr->Rotate(50,60); gr->Box(); gr->Cloud(c,"!wyrRk"); - gr->SubPlot(2,2,2); gr->Title("'.' style"); - gr->Rotate(50,60); gr->Box(); gr->Cloud(c,".wyrRk"); - gr->SubPlot(2,2,3); gr->Title("meshnum 10"); - gr->Rotate(50,60); gr->Box(); gr->Cloud(c,"wyrRk","meshnum 10"); -} -//----------------------------------------------------------------------------- -const char *mmgl_cont="list v -0.5 -0.15 0 0.15 0.5\nsubplot 2 2 0:title 'Cont plot (default)':rotate 50 60:box:cont a\n" -"subplot 2 2 1:title 'manual levels':rotate 50 60:box:cont v a\n" -"subplot 2 2 2:title '\\\'\\_\\\' style':rotate 50 60:box:cont a '_'\n" -"subplot 2 2 3 '':title '\\\'t\\\' style':box:cont a 't'\n"; -void smgl_cont(mglGraph *gr) -{ - mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5; v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15; v.a[4]=0.5; - if(!mini) { gr->SubPlot(2,2,0); gr->Title("Cont plot (default)"); } - gr->Rotate(50,60); gr->Box(); gr->Cont(a); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("manual levels"); - gr->Rotate(50,60); gr->Box(); gr->Cont(v,a); - gr->SubPlot(2,2,2); gr->Title("'\\_' style"); - gr->Rotate(50,60); gr->Box(); gr->Cont(a,"_"); - gr->SubPlot(2,2,3,""); gr->Title("'t' style"); - gr->Box(); gr->Cont(a,"t"); -} -//----------------------------------------------------------------------------- -const char *mmgl_contf="list v -0.5 -0.15 0 0.15 0.5\n" -"new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'" -"subplot 2 2 0:title 'ContF plot (default)':rotate 50 60:box:contf a\n" -"subplot 2 2 1:title 'manual levels':rotate 50 60:box:contf v a\n" -"subplot 2 2 2:title '\\\'\\_\\\' style':rotate 50 60:box:contf a '_'\n" -"subplot 2 2 3:title 'several slices':rotate 50 60:box:contf a1\n"; -void smgl_contf(mglGraph *gr) -{ - mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5; - v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15; v.a[4]=0.5; - gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)"); - - if(!mini) { gr->SubPlot(2,2,0); gr->Title("ContF plot (default)"); } - gr->Rotate(50,60); gr->Box(); gr->ContF(a); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("manual levels"); - gr->Rotate(50,60); gr->Box(); gr->ContF(v,a); - gr->SubPlot(2,2,2); gr->Title("'\\_' style"); - gr->Rotate(50,60); gr->Box(); gr->ContF(a,"_"); - gr->SubPlot(2,2,3); gr->Title("several slices"); - gr->Rotate(50,60); gr->Box(); gr->ContF(a1); -} -//----------------------------------------------------------------------------- -const char *mmgl_contd="list v -0.5 -0.15 0 0.15 0.5\n" -"new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'" -"subplot 2 2 0:title 'ContD plot (default)':rotate 50 60:box:contd a\n" -"subplot 2 2 1:title 'manual levels':rotate 50 60:box:contd v a\n" -"subplot 2 2 2:title '\\\'\\_\\\' style':rotate 50 60:box:contd a '_'\n" -"subplot 2 2 3:title 'several slices':rotate 50 60:box:contd a1\n"; -void smgl_contd(mglGraph *gr) -{ - mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5; - v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15; v.a[4]=0.5; - gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)"); - - if(!mini) { gr->SubPlot(2,2,0); gr->Title("ContD plot (default)"); } - gr->Rotate(50,60); gr->Box(); gr->ContD(a); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("manual levels"); - gr->Rotate(50,60); gr->Box(); gr->ContD(v,a); - gr->SubPlot(2,2,2); gr->Title("'\\_' style"); - gr->Rotate(50,60); gr->Box(); gr->ContD(a,"_"); - gr->SubPlot(2,2,3); gr->Title("several slices"); - gr->Rotate(50,60); gr->Box(); gr->ContD(a1); -} -//----------------------------------------------------------------------------- -const char *mmgl_contv="list v -0.5 -0.15 0 0.15 0.5\n" -"subplot 2 2 0:title 'ContV plot (default)':rotate 50 60:box:contv a\n" -"subplot 2 2 1:title 'manual levels':rotate 50 60:box:contv v a\n" -"subplot 2 2 2:title '\\\'\\_\\\' style':rotate 50 60:box:contv a '_'\n" -"subplot 2 2 3:title 'ContV and ContF':rotate 50 60:light on:box\ncontv a:contf a:cont a 'k'\n"; -void smgl_contv(mglGraph *gr) -{ - mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5; - v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15; v.a[4]=0.5; - if(!mini) { gr->SubPlot(2,2,0); gr->Title("ContV plot (default)"); } - gr->Rotate(50,60); gr->Box(); gr->ContV(a); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("manual levels"); - gr->Rotate(50,60); gr->Box(); gr->ContV(v,a); - gr->SubPlot(2,2,2); gr->Title("'\\_' style"); - gr->Rotate(50,60); gr->Box(); gr->ContV(a,"_"); - gr->SubPlot(2,2,3); gr->Title("ContV and ContF"); - gr->Rotate(50,60); gr->Box(); gr->Light(true); - gr->ContV(a); gr->ContF(a); gr->Cont(a,"k"); -} -//----------------------------------------------------------------------------- -const char *mmgl_torus="subplot 2 2 0:title 'Torus plot (default)':light on:rotate 50 60:box:torus y1 y2\n" -"subplot 2 2 0:title '\\\'x\\\' style':light on:rotate 50 60:box:torus y1 y2 'x'\n" -"subplot 2 2 0:title '\\\'z\\\' style':light on:rotate 50 60:box:torus y1 y2 'z'\n" -"subplot 2 2 0:title '\\\'\\#\\\' style':light on:rotate 50 60:box:torus y1 y2 '#'\n"; -void smgl_torus(mglGraph *gr) -{ - mglData y1,y2; mgls_prepare1d(0,&y1,&y2); - if(!mini) { gr->SubPlot(2,2,0); gr->Title("Torus plot (default)"); } - gr->Light(true); gr->Rotate(50,60); gr->Box(); gr->Torus(y1,y2); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("'x' style"); gr->Rotate(50,60); gr->Box(); gr->Torus(y1,y2,"x"); - gr->SubPlot(2,2,2); gr->Title("'z' style"); gr->Rotate(50,60); gr->Box(); gr->Torus(y1,y2,"z"); - gr->SubPlot(2,2,3); gr->Title("'\\#' style"); gr->Rotate(50,60); gr->Box(); gr->Torus(y1,y2,"#"); -} -//----------------------------------------------------------------------------- -const char *mmgl_axial="subplot 2 2 0:title 'Axial plot (default)':light on:rotate 50 60:box:axial a\n" -"subplot 2 2 0:title '\\\'x\\\' style':light on:rotate 50 60:box:axial a 'x'\n" -"subplot 2 2 0:title '\\\'z\\\' style':light on:rotate 50 60:box:axial a 'z'\n" -"subplot 2 2 0:title '\\\'\\#\\\' style':light on:rotate 50 60:box:axial a '#'\n"; -void smgl_axial(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - if(!mini) { gr->SubPlot(2,2,0); gr->Title("Axial plot (default)"); } - gr->Light(true); gr->Alpha(true); gr->Rotate(50,60); gr->Box(); gr->Axial(a); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("'x' style"); gr->Rotate(50,60); gr->Box(); gr->Axial(a,"x"); - gr->SubPlot(2,2,2); gr->Title("'z' style"); gr->Rotate(50,60); gr->Box(); gr->Axial(a,"z"); - gr->SubPlot(2,2,3); gr->Title("'\\#' style"); gr->Rotate(50,60); gr->Box(); gr->Axial(a,"#"); -} -//----------------------------------------------------------------------------- -const char *mmgl_several_light="rotate 50 60:light on:light 1 0 1 0 'c'\n" -"light 2 1 0 0 'y':light 3 0 -1 0 'm':box:surf a 'h'\n"; -void smgl_several_light(mglGraph *gr) // several light sources -{ - mglData a; mgls_prepare2d(&a); - if(!mini) gr->Title("Several light sources"); - gr->Rotate(50,60); gr->Light(true); gr->AddLight(1,mglPoint(0,1,0),'c'); - gr->AddLight(2,mglPoint(1,0,0),'y'); gr->AddLight(3,mglPoint(0,-1,0),'m'); - gr->Box(); gr->Surf(a,"h"); -} -//----------------------------------------------------------------------------- -const char *mmgl_surf3="title 'Surf3 plot':rotate 50 60:light on:alpha on:box:surf3 c"; -void smgl_surf3(mglGraph *gr) -{ - mglData c; mgls_prepare3d(&c); - if(!mini) gr->Title("Surf3 plot"); - gr->Rotate(50,60); gr->Light(true); gr->Alpha(true); - gr->Box(); gr->Surf3(c); -} -//----------------------------------------------------------------------------- -const char *mmgl_surf3a="title 'Surf3 plot':rotate 50 60:light on:alpha on:box:surf3a c d"; -void smgl_surf3a(mglGraph *gr) -{ - mglData c,d; mgls_prepare3d(&c,&d); - if(!mini) gr->Title("Surf3A plot"); - gr->Rotate(50,60); gr->Light(true); gr->Alpha(true); - gr->Box(); gr->Surf3A(c,d); -} -//----------------------------------------------------------------------------- -const char *mmgl_surf3c="title 'Surf3 plot':rotate 50 60:light on:alpha on:box:surf3c c d"; -void smgl_surf3c(mglGraph *gr) -{ - mglData c,d; mgls_prepare3d(&c,&d); - if(!mini) gr->Title("Surf3C plot"); - gr->Rotate(50,60); gr->Light(true); gr->Alpha(true); - gr->Box(); gr->Surf3C(c,d); -} -//----------------------------------------------------------------------------- -const char *mmgl_cut="subplot 2 2 0:title 'Cut on (default)':rotate 50 60:light on:box:surf a; zrange -1 0.5\n" -"subplot 2 2 1:title 'Cut off':rotate 50 60:box:surf a; zrange -1 0.5; cut off\n" -"subplot 2 2 2:title 'Cut in box':rotate 50 60:box:alpha on\ncut 0 -1 -1 1 0 1.1:surf3 c\ncut 0 0 0 0 0 0\t# restore back\n" -"subplot 2 2 3:title 'Cut by formula':rotate 50 60\ncut '(z>(x+0.5*y-1)^2-1) & (z>(x-0.5*y-1)^2-1)':surf3 c"; -void smgl_cut(mglGraph *gr) // cutting -{ - mglData a,c,v(1); mgls_prepare2d(&a); mgls_prepare3d(&c); v.a[0]=0.5; - gr->SubPlot(2,2,0); gr->Title("Cut on (default)"); gr->Rotate(50,60); gr->Light(true); - gr->Box(); gr->Surf(a,"","zrange -1 0.5"); - gr->SubPlot(2,2,1); gr->Title("Cut off"); gr->Rotate(50,60); - gr->Box(); gr->Surf(a,"","zrange -1 0.5; cut off"); - gr->SubPlot(2,2,2); gr->Title("Cut in box"); gr->Rotate(50,60); - gr->SetCutBox(mglPoint(0,-1,-1), mglPoint(1,0,1.1)); - gr->Alpha(true); gr->Box(); gr->Surf3(c); - gr->SetCutBox(mglPoint(0), mglPoint(0)); // switch it off - gr->SubPlot(2,2,3); gr->Title("Cut by formula"); gr->Rotate(50,60); - gr->CutOff("(z>(x+0.5*y-1)^2-1) & (z>(x-0.5*y-1)^2-1)"); - gr->Box(); gr->Surf3(c); gr->CutOff(""); // switch it off -} -//----------------------------------------------------------------------------- -const char *mmgl_traj="subplot 1 1 0 '':title 'Traj plot':box:plot x y:traj x y y1 y2\n"; -void smgl_traj(mglGraph *gr) -{ - mglData x,y,y1,y2; mgls_prepare1d(&y,&y1,&y2,&x); - if(!mini) {gr->SubPlot(1,1,0,""); gr->Title("Traj plot");} - gr->Box(); gr->Plot(x,y); gr->Traj(x,y,y1,y2); -} -//----------------------------------------------------------------------------- -const char *mmgl_mesh="title 'Mesh plot':rotate 50 60:box:mesh a\n"; -void smgl_mesh(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - if(!mini) gr->Title("Mesh plot"); - gr->Rotate(50,60); gr->Box(); gr->Mesh(a); -} -//----------------------------------------------------------------------------- -const char *mmgl_fall="title 'Fall plot':rotate 50 60:box:fall a\n"; -void smgl_fall(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - if(!mini) gr->Title("Fall plot"); - gr->Rotate(50,60); gr->Box(); gr->Fall(a); -} -//----------------------------------------------------------------------------- -const char *mmgl_surf="subplot 2 2 0:title 'Surf plot (default)':rotate 50 60:light on:box:surf a\n" -"subplot 2 2 1:title '\\\'\\#\\\' style; meshnum 10':rotate 50 60:box:surf a '#'; meshnum 10\n" -"subplot 2 2 2:title '\\\'|\\\' style':rotate 50 60:box:surf a '|'\n" -"new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'\nnew y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)'\nnew z 50 40 '0.8*cos(pi*(y+1)/2)'\n" -"subplot 2 2 3:title 'parametric form':rotate 50 60:box:surf x y z 'BbwrR'\n"; -void smgl_surf(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - if(!mini) { gr->SubPlot(2,2,0); gr->Title("Surf plot (default)"); } - gr->Light(true); gr->Rotate(50,60); gr->Box(); gr->Surf(a); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("'\\#' style; meshnum 10"); - gr->Rotate(50,60); gr->Box(); gr->Surf(a,"#","meshnum 10"); - gr->SubPlot(2,2,2); gr->Title("'|' style"); - gr->Rotate(50,60); gr->Box(); gr->Surf(a,"|"); - gr->SubPlot(2,2,3); gr->Title("parametric form"); - mglData x(50,40),y(50,40),z(50,40); - gr->Fill(x,"0.8*sin(pi*x)*sin(pi*(y+1)/2)"); - gr->Fill(y,"0.8*cos(pi*x)*sin(pi*(y+1)/2)"); - gr->Fill(z,"0.8*cos(pi*(y+1)/2)"); - gr->Rotate(50,60); gr->Box(); gr->Surf(x,y,z,"BbwrR"); -} -//----------------------------------------------------------------------------- -const char *mmgl_parser="# NOT AVAILABLE\n"; -void smgl_parser(mglGraph *gr) // example of MGL parsing -{ - gr->Title("MGL parser sample"); - double a[100]; // let a_i = sin(4*pi*x), x=0...1 - for(int i=0;i<100;i++)a[i]=sin(4*M_PI*i/99); - mglParse *parser = new mglParse; - mglData *d = parser->AddVar("dat"); - d->Set(a,100); // set data to variable - parser->Execute(gr, "plot dat; xrange 0 1\nbox\naxis"); - // you may break script at any line do something - // and continue after that - parser->Execute(gr, "xlabel 'x'\nylabel 'y'\nbox"); - // also you may use cycles or conditions in script - parser->Execute(gr, "for $0 -1 1 0.1\nline 0 0 -1 $0 'r'\nnext"); - delete parser; -} -//----------------------------------------------------------------------------- -const char *mmgl_belt="title 'Fall plot':rotate 50 60:box:fall a\n"; -void smgl_belt(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - if(!mini) gr->Title("Belt plot"); - gr->Rotate(50,60); gr->Box(); gr->Belt(a); -} -//----------------------------------------------------------------------------- -const char *mmgl_dens="new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'\n" -"subplot 2 2 0 '':title 'Dens plot (default)':box:dens a\n" -"subplot 2 2 1:title '3d variant':rotate 50 60:box:dens a\n" -"subplot 2 2 2 '':title '\\\'\\#\\\' style; meshnum 10':box:dens a '#'; meshnum 10\n" -"subplot 2 2 3:title 'several slices':rotate 50 60:box:dens a1\n"; -void smgl_dens(mglGraph *gr) -{ - mglData a,a1(30,40,3); mgls_prepare2d(&a); - gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)"); - if(!mini) {gr->SubPlot(2,2,0,""); gr->Title("Dens plot (default)");} - gr->Box(); gr->Dens(a); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("3d variant"); - gr->Rotate(50,60); gr->Box(); gr->Dens(a); - gr->SubPlot(2,2,2,""); gr->Title("'\\#' style; meshnum 10"); - gr->Box(); gr->Dens(a,"#","meshnum 10"); - gr->SubPlot(2,2,3); gr->Title("several slices"); - gr->Rotate(50,60); gr->Box(); gr->Dens(a1); -} -//----------------------------------------------------------------------------- -const char *mmgl_surfc="title 'SurfC plot':rotate 50 60:light on:box:surfc a b\n"; -void smgl_surfc(mglGraph *gr) -{ - mglData a,b; mgls_prepare2d(&a,&b); - if(!mini) gr->Title("SurfC plot"); gr->Rotate(50,60); - gr->Light(true); gr->Box(); gr->SurfC(a,b); -} -//----------------------------------------------------------------------------- -const char *mmgl_surfa="title 'SurfA plot':rotate 50 60:light on:box:surfa a b\n"; -void smgl_surfa(mglGraph *gr) -{ - mglData a,b; mgls_prepare2d(&a,&b); - if(!mini) gr->Title("SurfA plot"); gr->Rotate(50,60); - gr->Alpha(true); gr->Light(true); gr->Box(); gr->SurfA(a,b); -} -//----------------------------------------------------------------------------- -const char *mmgl_tile="title 'Tile plot':rotate 50 60:box:tile a\n"; -void smgl_tile(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - if(!mini) gr->Title("Tile plot"); - gr->Rotate(40,60); gr->Box(); gr->Tile(a); -} -//----------------------------------------------------------------------------- -const char *mmgl_tiles="title 'Tiles plot':box:tiles a b\n"; -void smgl_tiles(mglGraph *gr) -{ - mglData a,b; mgls_prepare2d(&a,&b); - if(!mini) {gr->SubPlot(1,1,0,""); gr->Title("TileS plot");} - gr->Box(); gr->TileS(a,b); -} -//----------------------------------------------------------------------------- -const char *mmgl_boxs="subplot 2 2 0 '':title 'Boxs plot (default)':light on:box:boxs a\n" -"subplot 2 2 1:title '\\\'\\@\\\' style':rotate 50 60:box:boxs a '@'\n" -"subplot 2 2 2:title '\\\'\\#\\\' style':box:boxs a '#'\n" -"subplot 2 2 3:title 'compare with Tile':rotate 50 60:box:tile a\n"; -void smgl_boxs(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - gr->SetOrigin(0,0,0); gr->Light(true); - if(!mini) {gr->SubPlot(2,2,0); gr->Title("Boxs plot (default)");} - gr->Rotate(40,60); gr->Box(); gr->Boxs(a); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("'\\@' style"); - gr->Rotate(50,60); gr->Box(); gr->Boxs(a,"@"); - gr->SubPlot(2,2,2); gr->Title("'\\#' style"); - gr->Rotate(50,60); gr->Box(); gr->Boxs(a,"#"); - gr->SubPlot(2,2,3); gr->Title("compare with Tile"); - gr->Rotate(50,60); gr->Box(); gr->Tile(a); -} -//----------------------------------------------------------------------------- -const char *fit="new rnd 100 '0.4*rnd+0.1+sin(2*pi*x)'\nnew in 100 '0.3+sin(2*pi*x)'\n" -"list ini 1 1 3:fit res rnd 'a+b*sin(c*x)' 'abc' ini\n" -"title 'Fitting sample':yrange -2 2:box:axis:plot rnd '. '\n" -"plot res 'r':plot in 'b'\ntext -0.9 -1.3 'fitted:' 'r:L'\n" -"putsfit 0 -1.8 'y = ' 'r':text 0 2.2 'initial: y = 0.3+sin(2\\pi x)' 'b'\n"; -void smgl_fit(mglGraph *gr) // nonlinear fitting -{ - mglData rnd(100), in(100), res; - gr->Fill(rnd,"0.4*rnd+0.1+sin(2*pi*x)"); - gr->Fill(in,"0.3+sin(2*pi*x)"); - double ini[3] = {1,1,3}; - mglData Ini(3,ini); - res = gr->Fit(rnd, "a+b*sin(c*x)", "abc", Ini); - if(!mini) gr->Title("Fitting sample"); - gr->SetRange('y',-2,2); gr->Box(); gr->Plot(rnd, ". "); - gr->Axis(); gr->Plot(res, "r"); gr->Plot(in, "b"); - gr->Puts(mglPoint(-0.9, -1.3), "fitted:", "r:L"); - gr->PutsFit(mglPoint(0, -1.8), "y = ", "r"); - gr->Puts(mglPoint(0, 2.2), "initial: y = 0.3+sin(2\\pi x)", "b"); -// gr->SetRanges(mglPoint(-1,-1,-1),mglPoint(1,1,1)); gr->SetOrigin(0,0,0); -} -//----------------------------------------------------------------------------- -const char *mmgl_vect="subplot 3 2 0 '':title 'Vect plot (default)':box:vect a b\n" -"subplot 3 2 1 '':title '\\\'.\\\' style; \\\'=\\\' style':box:vect a b '.='\n" -"subplot 3 2 2 '':title '\\\'f\\\' style':box:vect a b 'f'\n" -"subplot 3 2 3 '':title '\\\'>\\\' style':box:vect a b '>'\n" -"subplot 3 2 4 '':title '\\\'<\\\' style':box:vect a b '<'\n" -"subplot 3 2 5:title '3d variant':rotate 50 60:box:vect ex ey ez\n"; -void smgl_vect(mglGraph *gr) -{ - mglData a,b; mgls_prepare2v(&a,&b); - if(!mini) {gr->SubPlot(3,2,0,""); gr->Title("Vect plot (default)");} - gr->Box(); gr->Vect(a,b); - if(mini) return; - gr->SubPlot(3,2,1,""); gr->Title("'.' style; '=' style"); gr->Box(); gr->Vect(a,b,"=."); - gr->SubPlot(3,2,2,""); gr->Title("'f' style"); gr->Box(); gr->Vect(a,b,"f"); - gr->SubPlot(3,2,3,""); gr->Title("'>' style"); gr->Box(); gr->Vect(a,b,">"); - gr->SubPlot(3,2,4,""); gr->Title("'<' style"); gr->Box(); gr->Vect(a,b,"<"); - mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); - gr->SubPlot(3,2,5); gr->Title("3d variant"); gr->Rotate(50,60); - gr->Box(); gr->Vect(ex,ey,ez); -} -//----------------------------------------------------------------------------- -const char *mmgl_flow="subplot 2 2 0 '':title 'Flow plot (default)':box:flow a b\n" -"subplot 2 2 1 '':title '\\\'v\\\' style':box:flow a b 'v'\n" -"subplot 2 2 2 '':title 'from edges only':box:flow a b '#'\n" -"subplot 2 2 3:title '3d variant':rotate 50 60:box:flow ex ey ez\n"; -void smgl_flow(mglGraph *gr) -{ - mglData a,b; mgls_prepare2v(&a,&b); - if(!mini) {gr->SubPlot(2,2,0,""); gr->Title("Flow plot (default)");} - gr->Box(); gr->Flow(a,b); - if(mini) return; - gr->SubPlot(2,2,1,""); gr->Title("'v' style"); gr->Box(); gr->Flow(a,b,"v"); - gr->SubPlot(2,2,2,""); gr->Title("'\\#' style"); gr->Box(); gr->Flow(a,b,"#"); - mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); - gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); - gr->Box(); gr->Flow(ex,ey,ez); -} -//----------------------------------------------------------------------------- -const char *mmgl_pipe="subplot 2 2 0 '':title 'Pipe plot (default)':light on:box:pipe a b\n" -"subplot 2 2 1 '':title '\\\'i\\\' style':box:pipe a b 'i'\n" -"subplot 2 2 2 '':title 'from edges only':box:pipe a b '#'\n" -"subplot 2 2 3:title '3d variant':rotate 50 60:box:pipe ex ey ez '' 0.1\n"; -void smgl_pipe(mglGraph *gr) -{ - mglData a,b; mgls_prepare2v(&a,&b); - if(!mini) {gr->SubPlot(2,2,0,""); gr->Title("Pipe plot (default)");} - gr->Light(true); gr->Box(); gr->Pipe(a,b); - if(mini) return; - gr->SubPlot(2,2,1,""); gr->Title("'i' style"); gr->Box(); gr->Pipe(a,b,"i"); - gr->SubPlot(2,2,2,""); gr->Title("'\\#' style"); gr->Box(); gr->Pipe(a,b,"#"); - mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); - gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); - gr->Box(); gr->Pipe(ex,ey,ez,"",0.1); -} -//----------------------------------------------------------------------------- -const char *mmgl_dew="subplot 1 1 0 '':title 'Dew plot':light on:box:dew a b\n"; -void smgl_dew(mglGraph *gr) -{ - mglData a,b; mgls_prepare2v(&a,&b); - if(!mini) {gr->SubPlot(1,1,0,""); gr->Title("Dew plot");} - gr->Box(); gr->Light(true); gr->Dew(a,b); -} -//----------------------------------------------------------------------------- -const char *mmgl_grad="subplot 1 1 0 '':title 'Grad plot':box:grad a:dens a '{u8}w{q8}'\n"; -void smgl_grad(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - if(!mini) {gr->SubPlot(1,1,0,""); gr->Title("Grad plot");} - gr->Box(); gr->Grad(a); gr->Dens(a,"{u8}w{q8}"); -} -//----------------------------------------------------------------------------- -const char *mmgl_cones="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd'" -"title 'Cones plot':rotate 50 60:light on:origin 0 0 0:box:cones ys\n"; -void smgl_cones(mglGraph *gr) -{ - mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); - gr->Light(true); gr->SetOrigin(0,0,0); - if(!mini) { gr->SubPlot(2,2,0); gr->Title("Cones plot"); } - gr->Rotate(50,60); gr->Box(); gr->Cones(ys); - if(mini) return; - gr->SubPlot(2,2,1); gr->Title("2 colors"); - gr->Rotate(50,60); gr->Box(); gr->Cones(ys,"cbgGyr"); - gr->SubPlot(2,2,2); gr->Title("'\\#' style"); - gr->Rotate(50,60); gr->Box(); gr->Cones(ys,"#"); - gr->SubPlot(2,2,3); gr->Title("'a' style"); - gr->SetRange('z',-2,2); // increase range since summation can exceed [-1,1] - gr->Rotate(50,60); gr->Box(); gr->Cones(ys,"a"); -} -//----------------------------------------------------------------------------- -const char *mmgl_aspect="subplot 2 2 0:box:text -1 1.1 'Just box' ':L'\ninplot 0.2 0.5 0.7 1:box:text 0 1.2 'InPlot example'\n" -"subplot 2 2 1:title 'Rotate only':rotate 50 60:box\nsubplot 2 2 2:title 'Rotate and Aspect':rotate 50 60:aspect 1 1 2:box\n" -"subplot 2 2 3:title 'Aspect in other direction':rotate 50 60:aspect 1 2 2:box\n"; -void smgl_aspect(mglGraph *gr) // transformation -{ - gr->SubPlot(2,2,0); gr->Box(); - gr->Puts(mglPoint(-1,1.1),"Just box",":L"); - gr->InPlot(0.2,0.5,0.7,1,false); gr->Box(); - gr->Puts(mglPoint(0,1.2),"InPlot example"); - gr->SubPlot(2,2,1); gr->Title("Rotate only"); - gr->Rotate(50,60); gr->Box(); - gr->SubPlot(2,2,2); gr->Title("Rotate and Aspect"); - gr->Rotate(50,60); gr->Aspect(1,1,2); gr->Box(); - gr->SubPlot(2,2,3); gr->Title("Aspect in other direction"); - gr->Rotate(50,60); gr->Aspect(1,2,2); gr->Box(); -} -//----------------------------------------------------------------------------- -const char *mmgl_inplot="subplot 3 2 0:title 'StickPlot'\nstickplot 3 0 20 30:box 'r':text 0 0 '0' 'r'\n" -"stickplot 3 1 20 30:box 'g':text 0 0 '1' 'g'\nstickplot 3 2 20 30:box 'b':text 0 0 '2' 'b'\n" -"subplot 3 2 3 '':title 'ColumnPlot'\ncolumnplot 3 0:box 'r':text 0 0 '0' 'r'\n" -"columnplot 3 1:box 'g':text 0 0 '1' 'g'\ncolumnplot 3 2:box 'b':text 0 0 '2' 'b'\n" -"subplot 3 2 4 '':title 'GridPlot'\ngridplot 2 2 0:box 'r':text 0 0 '0' 'r'\n" -"gridplot 2 2 1:box 'g':text 0 0 '1' 'g'\ngridplot 2 2 2:box 'b':text 0 0 '2' 'b'\n" -"gridplot 2 2 3:box 'm':text 0 0 '3' 'm'\nsubplot 3 2 5 '':title 'InPlot':box\n" -"inplot 0.4 1 0.6 1 on:box 'r'\nmultiplot 3 2 1 2 1 '':title 'MultiPlot':box\n"; -void smgl_inplot(mglGraph *gr) -{ - gr->SubPlot(3,2,0); gr->Title("StickPlot"); - gr->StickPlot(3, 0, 20, 30); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); - gr->StickPlot(3, 1, 20, 30); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); - gr->StickPlot(3, 2, 20, 30); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); - gr->SubPlot(3,2,3,""); gr->Title("ColumnPlot"); - gr->ColumnPlot(3, 0); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); - gr->ColumnPlot(3, 1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); - gr->ColumnPlot(3, 2); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); - gr->SubPlot(3,2,4,""); gr->Title("GridPlot"); - gr->GridPlot(2, 2, 0); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); - gr->GridPlot(2, 2, 1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); - gr->GridPlot(2, 2, 2); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); - gr->GridPlot(2, 2, 3); gr->Box("m"); gr->Puts(mglPoint(0),"3","m"); - gr->SubPlot(3,2,5,""); gr->Title("InPlot"); gr->Box(); - gr->InPlot(0.4, 1, 0.6, 1, true); gr->Box("r"); - gr->MultiPlot(3,2,1, 2, 1,""); gr->Title("MultiPlot"); gr->Box(); -} -//----------------------------------------------------------------------------- -const char *mmgl_combined="new v 10:fill v -0.5 1:copy d sqrt(a^2+b^2)\n" -"subplot 2 2 0:title 'Surf + Cont':rotate 50 60:light on:box:surf a:cont a 'y'\n" -"subplot 2 2 1 '':title 'Flow + Dens':box:flow a b 'br':dens d\n" -"subplot 2 2 2:title 'Mesh + Cont':rotate 50 60:box:mesh a:cont a '_'\n" -"subplot 2 2 3:title 'Surf3 + ContF3':rotate 50 60:light on\n" -"box:contf3 v c 'z' 0:contf3 v c 'x':contf3 v c\ncut 0 -1 -1 1 0 1.1\ncontf3 v c 'z' c.nz-1:surf3 -0.5 c\n"; -void smgl_combined(mglGraph *gr) // flow threads and density plot -{ - mglData a,b,d; mgls_prepare2v(&a,&b); d = a; - for(int i=0;iSubPlot(2,2,1,""); gr->Title("Flow + Dens"); - gr->Flow(a,b,"br"); gr->Dens(d,"BbcyrR"); gr->Box(); - gr->SubPlot(2,2,0); gr->Title("Surf + Cont"); gr->Rotate(50,60); - gr->Light(true); gr->Surf(a); gr->Cont(a,"y"); gr->Box(); - gr->SubPlot(2,2,2); gr->Title("Mesh + Cont"); gr->Rotate(50,60); - gr->Box(); gr->Mesh(a); gr->Cont(a,"_"); - gr->SubPlot(2,2,3); gr->Title("Surf3 + ContF3");gr->Rotate(50,60); - gr->Box(); gr->ContF3(v,c,"z",0); gr->ContF3(v,c,"x"); gr->ContF3(v,c); - gr->SetCutBox(mglPoint(0,-1,-1), mglPoint(1,0,1.1)); - gr->ContF3(v,c,"z",c.nz-1); gr->Surf3(-0.5,c); -} -//----------------------------------------------------------------------------- -const char *mmgl_axis="subplot 2 2 0:title 'Axis origin, Grid':origin 0 0:axis:grid:fplot 'x^3'\n" -"subplot 2 2 1:title '2 axis':ranges -1 1 -1 1:origin -1 -1:axis:ylabel 'axis_1':fplot 'sin(pi*x)'\n" -"ranges 0 1 0 1:origin 1 1:axis:ylabel 'axis_2':fplot 'cos(pi*x)'\n" -"subplot 2 2 3:title 'More axis':origin nan nan:xrange -1 1:axis:xlabel 'x':ylabel 'y':fplot 'x^2' 'k'\n" -"yrange -1 1:origin -1.3 -1:axis 'y' 'r':ylabel '#r{y_2}' 0.2:fplot 'x^3' 'r'\n\n" -"subplot 2 2 2:title '4 segments, inverted axis':origin 0 0:\n" -"inplot 0.5 1 0.5 1:ranges 0 10 0 2:axis\nfplot 'sqrt(x/2)':xlabel 'W' 1:ylabel 'U' 1\n" -"inplot 0 0.5 0.5 1:ranges 1 0 0 2:axis 'x':fplot 'sqrt(x)+x^3':xlabel '\\tau' 1\n" -"inplot 0.5 1 0 0.5:ranges 0 10 4 0:axis 'y':fplot 'x/4':ylabel 'L' -1\n" -"inplot 0 0.5 0 0.5:ranges 1 0 4 0:fplot '4*x^2'\n"; -void smgl_axis(mglGraph *gr) -{ - gr->SubPlot(2,2,0); gr->Title("Axis origin, Grid"); gr->SetOrigin(0,0); - gr->Axis(); gr->Grid(); gr->FPlot("x^3"); - - gr->SubPlot(2,2,1); gr->Title("2 axis"); - gr->SetRanges(-1,1,-1,1); gr->SetOrigin(-1,-1,-1); // first axis - gr->Axis(); gr->Label('y',"axis 1",0); gr->FPlot("sin(pi*x)"); - gr->SetRanges(0,1,0,1); gr->SetOrigin(1,1,1); // second axis - gr->Axis(); gr->Label('y',"axis 2",0); gr->FPlot("cos(pi*x)"); - - gr->SubPlot(2,2,3); gr->Title("More axis"); gr->SetOrigin(NAN,NAN); gr->SetRange('x',-1,1); - gr->Axis(); gr->Label('x',"x",0); gr->Label('y',"y_1",0); gr->FPlot("x^2","k"); - gr->SetRanges(-1,1,-1,1); gr->SetOrigin(-1.3,-1); // second axis - gr->Axis("y","r"); gr->Label('y',"#r{y_2}",0.2); gr->FPlot("x^3","r"); - - gr->SubPlot(2,2,2); gr->Title("4 segments, inverted axis"); gr->SetOrigin(0,0); - gr->InPlot(0.5,1,0.5,1); gr->SetRanges(0,10,0,2); gr->Axis(); - gr->FPlot("sqrt(x/2)"); gr->Label('x',"W",1); gr->Label('y',"U",1); - gr->InPlot(0,0.5,0.5,1); gr->SetRanges(1,0,0,2); gr->Axis("x"); - gr->FPlot("sqrt(x)+x^3"); gr->Label('x',"\\tau",-1); - gr->InPlot(0.5,1,0,0.5); gr->SetRanges(0,10,4,0); gr->Axis("y"); - gr->FPlot("x/4"); gr->Label('y',"L",-1); - gr->InPlot(0,0.5,0,0.5); gr->SetRanges(1,0,4,0); gr->FPlot("4*x^2"); -} -//----------------------------------------------------------------------------- -const char *mmgl_ticks="subplot 3 2 0:title 'Usual axis':axis\n" -"subplot 3 2 1:title 'Too big/small range':ranges -1000 1000 0 0.001:axis\n" -"subplot 3 2 3:title 'Too narrow range':ranges 100 100.1 10 10.01:axis\n" -"subplot 3 2 4:title 'Disable ticks tuning':tuneticks off:axis\n" -"subplot 3 2 2:title 'Manual ticks':ranges -pi pi 0 2:\nxtick -pi '\\pi' -pi/2 '-\\pi/2' 0 '0' 0.886 'x^*' pi/2 '\\pi/2' pi 'pi':axis\n" -"# or you can use: list v -pi -pi/2 0 0.886 pi/2 pi:xtick v '-\\pi\n-\\pi/2\n0\nx^*\n\\pi/2\n\\pi':axis\n" -"subplot 3 2 5:title 'Time ticks':xrange 0 3e5:ticktime 'x':axis\n"; -void smgl_ticks(mglGraph *gr) -{ - gr->SubPlot(3,2,0); gr->Title("Usual axis"); gr->Axis(); - gr->SubPlot(3,2,1); gr->Title("Too big/small range"); - gr->SetRanges(-1000,1000,0,0.001); gr->Axis(); - gr->SubPlot(3,2,3); gr->Title("Too narrow range"); - gr->SetRanges(100,100.1,10,10.01); gr->Axis(); - gr->SubPlot(3,2,4); gr->Title("Disable ticks tuning"); - gr->SetTuneTicks(0); gr->Axis(); - - gr->SubPlot(3,2,2); gr->Title("Manual ticks"); gr->SetRanges(-M_PI,M_PI, 0, 2); - double val[]={-M_PI, -M_PI/2, 0, 0.886, M_PI/2, M_PI}; - gr->SetTicksVal('x', mglData(6,val), "-\\pi\n-\\pi/2\n0\nx^*\n\\pi/2\n\\pi"); - gr->Axis(); gr->Grid(); gr->FPlot("2*cos(x^2)^2", "r2"); - - gr->SubPlot(3,2,5); gr->Title("Time ticks"); gr->SetRange('x',0,3e5); - gr->SetTicksTime('x',0); gr->Axis(); -} -//----------------------------------------------------------------------------- -const char *mmgl_box="subplot 2 2 0:title 'Box (default)':rotate 50 60:box\n" -"subplot 2 2 0:title 'colored':rotate 50 60:box 'r'\n" -"subplot 2 2 0:title 'with faces':rotate 50 60:box '@'\n" -"subplot 2 2 0:title 'both':rotate 50 60:box '@cm'\n"; -void smgl_box(mglGraph *gr) -{ - gr->SubPlot(2,2,0); gr->Title("Box (default)"); gr->Rotate(50,60); gr->Box(); - gr->SubPlot(2,2,1); gr->Title("colored"); gr->Rotate(50,60); gr->Box("r"); - gr->SubPlot(2,2,2); gr->Title("with faces"); gr->Rotate(50,60); gr->Box("@"); - gr->SubPlot(2,2,3); gr->Title("both"); gr->Rotate(50,60); gr->Box("@cm"); -} -//----------------------------------------------------------------------------- -const char *mmgl_loglog="subplot 2 2 0 '<_':title 'Semi-log axis':ranges 0.01 100 -1 1:axis 'lg(x)' ''\n" -"axis:fplot 'sin(1/x)':xlabel 'x':ylabel 'y = sin 1/x'\n" -"subplot 2 2 1 '<_':title 'Log-log axis':ranges 0.01 100 0.1 100:axis 'lg(x)' 'lg(y)'\n" -"axis:grid 'xy' 'g':fplot 'sqrt(1+x^2)':xlabel 'x':ylabel 'y = \\sqrt{1+x^2}'\n" -"subplot 2 2 2 '<_':title 'Minus-log axis':ranges -100 -0.01 -100 -0.1:axis '-lg(-x)' '-lg(-y)'\n" -"axis:fplot '-sqrt(1+x^2)':xlabel 'x':ylabel 'y = -\\sqrt{1+x^2}'\n" -"subplot 2 2 3 '<_':title 'Log-ticks':ranges 0.01 100 0 100:axis 'sqrt(x)' ''\n" -"axis:fplot 'x':xlabel 'x':ylabel 'y = x'\n"; -void smgl_loglog(mglGraph *gr) // log-log axis -{ - gr->SubPlot(2,2,0,"<_"); gr->Title("Semi-log axis"); gr->SetRanges(0.01,100,-1,1); gr->SetFunc("lg(x)",""); - gr->Axis(); gr->Grid("xy","g"); gr->FPlot("sin(1/x)"); gr->Label('x',"x",0); gr->Label('y', "y = sin 1/x",0); - gr->SubPlot(2,2,1,"<_"); gr->Title("Log-log axis"); gr->SetRanges(0.01,100,0.1,100); gr->SetFunc("lg(x)","lg(y)"); - gr->Axis(); gr->FPlot("sqrt(1+x^2)"); gr->Label('x',"x",0); gr->Label('y', "y = \\sqrt{1+x^2}",0); - gr->SubPlot(2,2,2,"<_"); gr->Title("Minus-log axis"); gr->SetRanges(-100,-0.01,-100,-0.1); gr->SetFunc("-lg(-x)","-lg(-y)"); - gr->Axis(); gr->FPlot("-sqrt(1+x^2)"); gr->Label('x',"x",0); gr->Label('y', "y = -\\sqrt{1+x^2}",0); - gr->SubPlot(2,2,3,"<_"); gr->Title("Log-ticks"); gr->SetRanges(0.1,100,0,100); gr->SetFunc("sqrt(x)",""); - gr->Axis(); gr->FPlot("x"); gr->Label('x',"x",1); gr->Label('y', "y = x",0); -} -//----------------------------------------------------------------------------- -const char *mmgl_venn="list x -0.3 0 0.3:list y 0.3 -0.3 0.3:list e 0.7 0.7 0.7\n" -"subplot 1 1 0 '':title 'Venn-like diagram':alpha on:error x y e e '!rgb@#o'"; -void smgl_venn(mglGraph *gr) -{ - double xx[3]={-0.3,0,0.3}, yy[3]={0.3,-0.3,0.3}, ee[3]={0.7,0.7,0.7}; - mglData x(3,xx), y(3,yy), e(3,ee); - gr->SubPlot(1,1,0); gr->Title("Venn-like diagram"); gr->Alpha(true); gr->Error(x,y,e,e,"!rgb@#o"); -} -//----------------------------------------------------------------------------- -const char *mmgl_stereo="light on subplot 2 1 0:rotate 50 60+3:box:surf a\nsubplot 2 1 1:rotate 50 60-3:box:surf a\n"; -void smgl_stereo(mglGraph *gr) -{ - mglData a; mgls_prepare2d(&a); - gr->Light(true); - gr->SubPlot(2,1,0); gr->Rotate(50,60+1); - gr->Box(); gr->Surf(a); - gr->SubPlot(2,1,1); gr->Rotate(50,60-1); - gr->Box(); gr->Surf(a); -} -//----------------------------------------------------------------------------- -const char *mmgl_hist="new x 10000 '2*rnd-1':new y 10000 '2*rnd-1':copy z x 'exp(-6*(u^2+v^2))' y\n" -"hist xx x z:norm xx 0 1:hist yy y z:norm yy 0 1\nmultiplot 3 3 3 2 2 '':ranges -1 1 -1 1 0 1:box:dots x y z 'wyrRk'\n" -"multiplot 3 3 0 2 1 '':ranges -1 1 0 1:box:bars xx\nmultiplot 3 3 5 1 2 '':ranges 0 1 -1 1:box:barh yy\n" -"subplot 3 3 2:text 0 0 'Hist and\\nMultiPlot\\nsample' 'a' -6\n"; -void smgl_hist(mglGraph *gr) -{ - mglData x(10000), y(10000), z(10000); gr->Fill(x,"2*rnd-1"); gr->Fill(y,"2*rnd-1"); gr->Fill(z,"exp(-6*(v^2+w^2))",x,y); - mglData xx=gr->Hist(x,z), yy=gr->Hist(y,z); xx.Norm(0,1); yy.Norm(0,1); - gr->MultiPlot(3,3,3,2,2,""); gr->SetRanges(-1,1,-1,1,0,1); gr->Box(); gr->Dots(x,y,z,"wyrRk"); - gr->MultiPlot(3,3,0,2,1,""); gr->SetRanges(-1,1,0,1); gr->Box(); gr->Bars(xx); - gr->MultiPlot(3,3,5,1,2,""); gr->SetRanges(0,1,-1,1); gr->Box(); gr->Barh(yy); - gr->SubPlot(3,3,2); gr->Puts(mglPoint(0.5,0.5),"Hist and\nMultiPlot\nsample","a",-3); -} -//----------------------------------------------------------------------------- -const char *mmgl_primitives=""; // TODO add later -void smgl_primitives(mglGraph *gr) // flag # -{ - gr->SubPlot(2,2,0,""); gr->Title("Line, Curve, Rhomb, Ellipse"); - gr->Line(mglPoint(-1,-1),mglPoint(-0.5,1),"qAI"); - gr->Curve(mglPoint(-0.6,-1),mglPoint(1,1),mglPoint(0,1),mglPoint(1,1),"rA"); - gr->Rhomb(mglPoint(0,0.4),mglPoint(1,0.9),0.2,"b#"); - gr->Rhomb(mglPoint(0,0),mglPoint(1,0.4),0.2,"cg@"); - gr->Ellipse(mglPoint(0,-0.5),mglPoint(1,-0.1),0.2,"u#"); - gr->Ellipse(mglPoint(0,-1),mglPoint(1,-0.6),0.2,"m@"); - gr->Mark(mglPoint(0,-0.5),"*"); gr->Mark(mglPoint(1,-0.1),"*"); - - gr->Light(true); - gr->SubPlot(2,2,1); gr->Title("Face[xyz]"); gr->Rotate(50,60); gr->Box(); - gr->FaceX(mglPoint(1,0,-1),1,1,"r"); - gr->FaceY(mglPoint(-1,-1,-1),1,1,"g"); - gr->FaceZ(mglPoint(1,-1,-1),-1,1,"b"); - gr->Face(mglPoint(-1,-1,1),mglPoint(-1,1,1),mglPoint(1,-1,0),mglPoint(1,1,1),"m"); - - gr->SubPlot(2,2,3,""); gr->Title("Cone"); - gr->Cone(mglPoint(-0.7,-0.3),mglPoint(-0.7,0.7,0.5),0.2,0.1,"b"); - gr->Puts(mglPoint(-0.7,-0.7),"no edges\n(default)"); - gr->Cone(mglPoint(0,-0.3),mglPoint(0,0.7,0.5),0.2,0.1,"g@"); - gr->Puts(mglPoint(0,-0.7),"with edges\n('\\@' style)"); - gr->Cone(mglPoint(0.7,-0.3),mglPoint(0.7,0.7,0.5),0.2,0,"ry"); - gr->Puts(mglPoint(0.7,-0.7),"'arrow' with\ngradient"); - - gr->SubPlot(2,2,2,""); gr->Title("Sphere and Drop"); - gr->Alpha(false); - gr->Puts(mglPoint(-0.9,-0.7),"sh=0"); - gr->Drop(mglPoint(-0.9,0),mglPoint(0,1),0.5,"r",0); - gr->Puts(mglPoint(-0.3,-0.7),"sh=0.33"); - gr->Drop(mglPoint(-0.3,0),mglPoint(0,1),0.5,"r",0.33); - gr->Puts(mglPoint(0.3,-0.7),"sh=0.67"); - gr->Drop(mglPoint(0.3,0),mglPoint(0,1),0.5,"r",0.67); - gr->Puts(mglPoint(0.9,-0.7),"sh=1"); - gr->Drop(mglPoint(0.9,0),mglPoint(0,1),0.5,"r",1); - gr->Ball(mglPoint(-0.9,0,1),'k'); - gr->Ball(mglPoint(-0.3,0,1),'k'); - gr->Ball(mglPoint(0.3,0,1),'k'); - gr->Ball(mglPoint(0.9,0,1),'k'); - gr->Line(mglPoint(-0.9,0,1),mglPoint(0.9,0,1),"b"); -} -//----------------------------------------------------------------------------- -const char *mmgl_label="new ys 10 '0.2*rnd-0.8*sin(pi*x)'\n" -"subplot 1 1 0 '':title 'Label plot':box:plot ys ' *':label ys 'y=%y'\n"; -void smgl_label(mglGraph *gr) -{ - mglData ys(10); ys.Modify("0.8*sin(pi*2*x)+0.2*rnd"); - if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Label plot"); } - gr->Box(); gr->Plot(ys," *"); gr->Label(ys,"y=%y"); -} -//----------------------------------------------------------------------------- -const char *mmgl_colorbar="subplot 2 2 0:title 'Colorbar out of box':box\n" -"colorbar '<':colorbar '>':colorbar '_':colorbar '^'\n" -"subplot 2 2 0:title 'Colorbar near box':box\n" -"colorbar 'I':colorbar '_I':colorbar '^I'\n" -"subplot 2 2 0:title 'manual colors':box:contd v a\n" -"colorbar v '<':colorbar v '>':colorbar v '_':colorbar v '^'\n" -"subplot 2 2 0:title 'log-scale'\n" -"colorbar '>' 0.5 0:text 0 1.2 'Normal scale':colorbar '>':text 1.3 1.2 'Log scale'\n"; -void smgl_colorbar(mglGraph *gr) -{ - gr->SubPlot(2,2,0); gr->Title("Colorbar out of box"); gr->Box(); - gr->Colorbar("<"); gr->Colorbar(">"); gr->Colorbar("_"); gr->Colorbar("^"); - gr->SubPlot(2,2,1); gr->Title("Colorbar near box"); gr->Box(); - gr->Colorbar("Colorbar(">I"); gr->Colorbar("_I"); gr->Colorbar("^I"); - gr->SubPlot(2,2,2); gr->Title("manual colors"); - mglData a,v; mgls_prepare2d(&a,0,&v); - gr->Box(); gr->ContD(v,a); - gr->Colorbar(v,"<"); gr->Colorbar(v,">"); gr->Colorbar(v,"_"); gr->Colorbar(v,"^"); - gr->SubPlot(2,2,3); gr->Title("log-scale"); - gr->SetRange('c',0.01,1e3); - gr->Colorbar(">",0.5,0); gr->Puts(mglPoint(0,1.2),"Normal scale"); - gr->SetFunc("","","","lg(c)"); - gr->Colorbar(">"); gr->Puts(mglPoint(1.3,1.2),"Log scale"); -} -//----------------------------------------------------------------------------- -const char *mmgl_legend="addlegend 'sin(\\pi {x^2})' 'b':addlegend 'sin(\\pi x)' 'g*'\n" -"addlegend 'sin(\\pi \\sqrt{x})' 'rd':addlegend 'jsut text' ' ':addlegend 'no indent for this' ''\n" -"subplot 2 2 0 '':title 'Legend (default)':box:legend\n" -"legend 3 'A#':text 0.75 0.65 'Absolute position' 'A'\n" -"subplot 2 2 2 '':title 'coloring':box:legend 0 'r#':legend 1 'Wb#':legend 2 'ygr#'\n" -"subplot 2 2 3 '':title 'manual position':box:legend 0.5 0.5\n"; -void smgl_legend(mglGraph *gr) -{ - gr->AddLegend("sin(\\pi {x^2})","b"); - gr->AddLegend("sin(\\pi x)","g*"); - gr->AddLegend("sin(\\pi \\sqrt{x})","rd"); - gr->AddLegend("just text"," "); - gr->AddLegend("no indent for this",""); - if(!mini) {gr->SubPlot(2,2,0,""); gr->Title("Legend (default)");} - gr->Box(); gr->Legend(); - if(mini) return; - gr->Legend(3,"A#"); - gr->Puts(mglPoint(0.75,0.65),"Absolute position","A"); - gr->SubPlot(2,2,2,""); gr->Title("coloring"); gr->Box(); - gr->Legend(0,"r#"); gr->Legend(1,"Wb#"); gr->Legend(2,"ygr#"); - gr->SubPlot(2,2,3,""); gr->Title("manual position"); gr->Box(); gr->Legend(0.5,0.5); -} -//----------------------------------------------------------------------------- -const char *mmgl_data_diff=""; // TODO add later -void smgl_dat_diff(mglGraph *gr) // differentiate -{ - gr->SetRanges(0,1,0,1,0,1); - mglData a(30,40); a.Modify("x*y"); - gr->SubPlot(2,2,0); gr->Rotate(60,40); - gr->Surf(a); gr->Box(); - gr->Puts(mglPoint(0.7,1,1.2),"a(x,y)","",-2); - gr->SubPlot(2,2,1); gr->Rotate(60,40); - a.Diff("x"); gr->Surf(a); gr->Box(); - gr->Puts(mglPoint(0.7,1,1.2),"da/dx","",-2); - gr->SubPlot(2,2,2); gr->Rotate(60,40); - a.Integral("xy"); gr->Surf(a); gr->Box(); - gr->Puts(mglPoint(0.7,1,1.2),"\\int da/dx dxdy","",-2); - gr->SubPlot(2,2,3); gr->Rotate(60,40); - a.Diff2("y"); gr->Surf(a); gr->Box(); - gr->Puts(mglPoint(0.7,1,1.2),"\\int {d^2}a/dxdy dx","",-2); -} -//----------------------------------------------------------------------------- -const char *mmgl_data_extra=""; // TODO add later -void smgl_dat_extra(mglGraph *gr) // differentiate -{ - gr->SubPlot(2,2,0,""); gr->Title("Envelop sample"); - mglData d1(1000); gr->Fill(d1,"exp(-8*x^2)*sin(10*pi*x)"); - gr->Axis(); gr->Plot(d1, "b"); - d1.Envelop('x'); gr->Plot(d1, "r"); - - gr->SubPlot(2,2,1,""); gr->Title("Smooth sample"); - mglData y0(30),y1,y2,y3; - gr->SetRanges(0,1,0,1); - gr->Fill(y0, "0.4*sin(pi*x) + 0.3*cos(1.5*pi*x) - 0.4*sin(2*pi*x)+0.5*rnd"); - - y1=y0; y1.Smooth("x3"); - y2=y0; y2.Smooth("x5"); - y3=y0; y3.Smooth("x"); - - gr->Plot(y0,"{m7}:s", "legend 'none'"); //gr->AddLegend("none","k"); - gr->Plot(y1,"r", "legend ''3' style'"); - gr->Plot(y2,"g", "legend ''5' style'"); - gr->Plot(y3,"b", "legend 'default'"); - gr->Legend(); gr->Box(); - - gr->SubPlot(2,2,2); gr->Title("Sew sample"); - mglData d2(100, 100); gr->Fill(d2, "mod((y^2-(1-x)^2)/2,0.1)"); - gr->Rotate(50, 60); gr->Light(true); gr->Alpha(true); - gr->Box(); gr->Surf(d2, "b"); - d2.Sew("xy", 0.1); gr->Surf(d2, "r"); - - gr->SubPlot(2,2,3); gr->Title("Resize sample (interpolation)"); - mglData x0(10), v0(10), x1, v1; - gr->Fill(x0,"rnd"); gr->Fill(v0,"rnd"); - x1 = x0.Resize(100); v1 = v0.Resize(100); - gr->Plot(x0,v0,"b+ "); gr->Plot(x1,v1,"r-"); - gr->Label(x0,v0,"%n"); -} -//----------------------------------------------------------------------------- -const char *mmgl_ternary=""; // TODO add later -void smgl_ternary(mglGraph *gr) // flag # -{ - gr->SetRanges(0,1,0,1,0,1); - mglData x(50),y(50),z(50),rx(10),ry(10), a(20,30); - a.Modify("30*x*y*(1-x-y)^2*(x+y<1)"); - x.Modify("0.25*(1+cos(2*pi*x))"); - y.Modify("0.25*(1+sin(2*pi*x))"); - rx.Modify("rnd"); ry.Modify("(1-v)*rnd",rx); - z.Modify("x"); - - gr->SubPlot(2,2,0); gr->Title("Ordinary axis 3D"); - gr->Rotate(50,60); gr->Light(true); - gr->Plot(x,y,z,"r2"); gr->Surf(a,"BbcyrR#"); - gr->Axis(); gr->Grid(); gr->Box(); - gr->Label('x',"B",1); gr->Label('y',"C",1); gr->Label('z',"Z",1); - - gr->SubPlot(2,2,1); gr->Title("Ternary axis (x+y+t=1)"); - gr->Ternary(1); - gr->Plot(x,y,"r2"); gr->Plot(rx,ry,"q^ "); gr->Cont(a,"BbcyrR"); - gr->Line(mglPoint(0.5,0), mglPoint(0,0.75), "g2"); - gr->Axis(); gr->Grid("xyz","B;"); - gr->Label('x',"B"); gr->Label('y',"C"); gr->Label('t',"A"); - - gr->SubPlot(2,2,2); gr->Title("Quaternary axis 3D"); - gr->Rotate(50,60); gr->Light(true); - gr->Ternary(2); - gr->Plot(x,y,z,"r2"); gr->Surf(a,"BbcyrR#"); - gr->Axis(); gr->Grid(); gr->Box(); - gr->Label('t',"A",1); gr->Label('x',"B",1); - gr->Label('y',"C",1); gr->Label('z',"D",1); - - gr->SubPlot(2,2,3); gr->Title("Ternary axis 3D"); - gr->Rotate(50,60); gr->Light(true); - gr->Ternary(1); - gr->Plot(x,y,z,"r2"); gr->Surf(a,"BbcyrR#"); - gr->Axis(); gr->Grid(); gr->Box(); - gr->Label('t',"A",1); gr->Label('x',"B",1); - gr->Label('y',"C",1); gr->Label('z',"Z",1); -} -//----------------------------------------------------------------------------- -const char *mmgl_triplot="list q 0 1 2 3 | 4 5 6 7 | 0 2 4 6 | 1 3 5 7 | 0 4 1 5 | 2 6 3 7\n" -"list xq -1 1 -1 1 -1 1 -1 1\nlist yq -1 -1 1 1 -1 -1 1 1\nlist zq -1 -1 -1 -1 1 1 1 1\nlight on\n" -"subplot 2 1 0:title 'QuadPlot sample':rotate 50 60\n" -"quadplot q xq yq zq 'yr'\nquadplot q xq yq zq '#k'\n" -"list t 0 1 2 | 0 1 3 | 0 2 3 | 1 2 3\n" -"list xq -1 1 0 0\nlist yq -1 -1 1 0\nlist zq -1 -1 -1 1\n" -"subplot 2 1 1:title 'TriPlot sample':rotate 50 60\n" -"triplot t xt yt zt 'b'\ntriplot t xt yt zt '#k'\n"; -void smgl_triplot(mglGraph *gr) -{ - double q[] = {0,1,2,3, 4,5,6,7, 0,2,4,6, 1,3,5,7, 0,4,1,5, 2,6,3,7}; - double xc[] = {-1,1,-1,1,-1,1,-1,1}, yc[] = {-1,-1,1,1,-1,-1,1,1}, zc[] = {-1,-1,-1,-1,1,1,1,1}; - mglData qq(6,4,q), xx(8,xc), yy(8,yc), zz(8,zc); - gr->Light(true); //gr->Alpha(true); - gr->SubPlot(2,1,0); gr->Title("QuadPlot sample"); gr->Rotate(50,60); - gr->QuadPlot(qq,xx,yy,zz,"yr"); - gr->QuadPlot(qq,xx,yy,zz,"k#"); - + + gr->SubPlot(3,2,4); gr->Title("TriPlot sample"); gr->Rotate(50,60); double t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3}; double xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1}; mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt); - gr->SubPlot(2,1,1); gr->Title("TriPlot sample"); gr->Rotate(50,60); gr->TriPlot(tt,uu,vv,ww,"b"); gr->TriPlot(tt,uu,vv,ww,"k#"); -} -//----------------------------------------------------------------------------- -const char *mmgl_dots="new t 1000 'pi*(rnd-0.5)':new f 1000 '2*pi*rnd'\n" -"copy x 0.9*cos(t)*cos(f):copy y 0.9*cos(t)*sin(f):copy z 0.6*sin(t)\n" -"title 'Dots sample':rotate 50 60\nbox:dots x y z\n"; -void smgl_dots(mglGraph *gr) -{ - int i, n=1000; - mglData x(n),y(n),z(n); - for(i=0;iTitle("Dots sample"); - gr->Rotate(50,60); gr->Box(); gr->Dots(x,y,z); -} -//----------------------------------------------------------------------------- -/*void smgl_surf3_rgbd(mglGraph *gr) -{ - mglData c; mgls_prepare3d(&c); - gr->Rotate(40,60); gr->VertexColor(true); - gr->Box(); gr->Surf3(c,"bgrd"); -}*/ -//----------------------------------------------------------------------------- -const char *mmgl_mirror="new a 30 40 '-pi*x*exp(-(y+1)^2-4*x^2)'\nalpha on:light on:rotate 40 60:box\n" -"surf a 'r';yrange 0 1\nsurf a 'b';yrange 0 -1\n"; -void smgl_mirror(mglGraph *gr) // flag # -{ - mglData a(30,40); - gr->Fill(a,"-pi*x*exp(-(y+1)^2-4*x^2)"); - - if(!mini) gr->Title("Example of options"); - gr->Alpha(false); gr->Rotate(40,60); - gr->Light(true); gr->Box(); - gr->Surf(a,"r","yrange 0 1"); gr->Surf(a,"b","yrange 0 -1"); -} -//----------------------------------------------------------------------------- -//============================================================================= -struct mglSample /// Structure for list of samples -{ - const char *name; - void (*func)(mglGraph*); -}; -extern mglSample samp[]; -//----------------------------------------------------------------------------- -int mgl_cmd_smp(const void *a, const void *b) -{ - const mglSample *aa = (const mglSample *)a; - const mglSample *bb = (const mglSample *)b; - return strcmp(aa->name, bb->name); + + gr->SubPlot(3,2,5); + mglData r(4); r.Fill(1,4); + gr->SetRanges(1,4,1,4); gr->Axis(); + gr->Mark(r,r,"s"); + gr->Plot(r,"b"); + + gr->WriteJPEG("test.jpg"); + gr->WritePNG("test.png"); + gr->WriteBMP("test.bmp"); + gr->WriteTGA("test.tga"); + gr->WriteEPS("test.eps"); + gr->WriteSVG("test.svg"); + gr->WriteGIF("test.gif"); + + gr->WriteXYZ("test.xyz"); + gr->WriteSTL("test.stl"); + gr->WriteOFF("test.off"); + gr->WriteTEX("test.tex"); + gr->WriteOBJ("test.obj"); + gr->WritePRC("test.prc"); } //----------------------------------------------------------------------------- #if !defined(_MSC_VER) && !defined(__BORLANDC__) static struct option longopts[] = { - { "test", no_argument, &dotest, 1 }, - { "srnd", no_argument, &srnd, 1 }, - { "width", required_argument, NULL, 'w' }, - { "height", required_argument, NULL, 'h' }, - { "list", no_argument, NULL, 'l' }, - { "kind", required_argument, NULL, 'k' }, - { "thread", required_argument, NULL, 't' }, - { "mini", no_argument, &mini, 1 }, - { "big", no_argument, &big, 1 }, - { "png", no_argument, &type, 0 }, - { "eps", no_argument, &type, 1 }, - { "svg", no_argument, &type, 2 }, - { "solid", no_argument, &type, 3 }, - { "jpeg", no_argument, &type, 4 }, - { "prc", no_argument, &type, 5 }, - { "gif", no_argument, &type, 6 }, - { "none", no_argument, &type, 7 }, - { "bps", no_argument, &type, 8 }, - { "u3d", no_argument, &type, 9 }, - { "pdf", no_argument, &type, 10 }, - { "obj", no_argument, &type, 11 }, - { "off", no_argument, &type, 12 }, - { "stl", no_argument, &type, 13 }, - { "help", no_argument, NULL, '?' }, - { NULL, 0, NULL, 0 } + { "big", no_argument, &big, 1 }, + { "bps", no_argument, &type, 8 }, + { "help", no_argument, NULL, '?' }, + { "height", required_argument, NULL, 'h' }, + { "png", no_argument, &type, 0 }, + { "eps", no_argument, &type, 1 }, + { "gif", no_argument, &type, 6 }, + { "jpeg", no_argument, &type, 4 }, + { "kind", required_argument, NULL, 'k' }, + { "list", no_argument, NULL, 'l' }, + { "mgl", no_argument, &use_mgl, 1 }, + { "mini", no_argument, &mini, 1 }, + { "none", no_argument, &type, 7 }, + { "obj", no_argument, &type, 11 }, + { "off", no_argument, &type, 12 }, + { "prc", no_argument, &type, 5 }, + { "solid", no_argument, &type, 3 }, + { "srnd", no_argument, &srnd, 1 }, + { "svg", no_argument, &type, 2 }, + { "stl", no_argument, &type, 13 }, + { "tex", no_argument, &type, 14 }, + { "json", no_argument, &type, 15 }, + { "test", no_argument, &dotest, 1 }, + { "font", no_argument, &dotest, 2 }, + { "fmts", no_argument, &dotest, 3 }, + { "thread", required_argument, NULL, 't' }, + { "verbose",no_argument, &verbose, 1 }, + { "width", required_argument, NULL, 'w' }, + { NULL, 0, NULL, 0 } }; //----------------------------------------------------------------------------- void usage() { puts ( - "--png - output png\n" +// "--png - output png\n" "--width=num - png picture width\n" "--height=num - png picture height\n" "--mini - png picture is 200x150\n" "--big - png picture is 1920x1440\n" "--idtf - output idtf\n" - "--u3d - output u3d\n" - "--pdf - output pdf\n" + "--prc - output prc\n" "--eps - output EPS\n" + "--eps - output LaTeX\n" "--jpeg - output JPEG\n" - "--solid - output solid PNG\n" + "--json - output JSON\n" + "--solid - output solid PNG\n" "--svg - output SVG\n" "--obj - output obj/mtl\n" "--off - output off\n" @@ -1965,7 +282,10 @@ void usage() "--list - print list of sample names\n" "--kind=name - produce only this sample\n" "--thread=num - number of threads used\n" + "--mgl - use MGL scripts for samples\n" "--test - perform test\n" + "--font - write current font as C++ file\n" + "--fmts - write sample in all possible formats\n" ); } #endif @@ -2002,12 +322,6 @@ void save(mglGraph *gr,const char *name,const char *suf="") sprintf(buf,"%s%s.png",name,suf); gr->WritePNG(buf,0,false); break; - case 9: // U3D - sprintf(buf,"%s%s.u3d",name,suf); - //gr->WriteU3D(buf); break; // TODO: Add IDTF support - case 10: // PDF - sprintf(buf,"%s%s.pdf",name,suf); - //gr->WritePDF(buf); break; // TODO: Add IDTF support case 11: // OBJ sprintf(buf,"%s%s.obj",name,suf); gr->WriteOBJ(buf); break; @@ -2017,6 +331,12 @@ void save(mglGraph *gr,const char *name,const char *suf="") case 13: // STL sprintf(buf,"%s%s.stl",name,suf); gr->WriteSTL(buf); break; + case 14: // TeX + sprintf(buf,"%s%s.tex",name,suf); + gr->WriteTEX(buf); break; + case 15: // JSON + sprintf(buf,"%s%s.json",name,suf); + gr->WriteJSON(buf); break; default:// PNG (no alpha) sprintf(buf,"%s%s.png",name,suf); gr->WritePNG(buf,0,false); break; @@ -2051,28 +371,49 @@ int main(int argc,char **argv) } #endif + if(dotest==1) printf("Global (before):%s\n",mglGlobalMess.c_str()); gr = new mglGraph; //gr->SetQuality(0); - if(mini) { gr->SetSize(190,145); suf = "-sm"; } else if(big) { gr->SetSize(1920,1440); suf = "-lg"; } else gr->SetSize(width,height); - if(dotest) + if(dotest==1) { -// gr->SetSize(600,600); mgl_set_test_mode(true); test(gr); gr->WritePNG("test.png","",false); gr->WriteEPS("test.eps"); + printf("Messages:%s\n",gr->Message()); + printf("Global:%s\n",mglGlobalMess.c_str()); delete gr; return 0; } + else if(dotest==2) + { mgl_create_cpp_font(gr->Self(), L"!-~,¡-ÿ,̀-̏,Α-ω,ϑ,ϕ,ϖ,ϰ,ϱ,ϵ,А-я,ℏ,ℑ,ℓ,ℜ,←-↙,∀-∯,≠-≯,⟂"); + delete gr; return 0; } + else if(dotest==3) + { fexport(gr); delete gr; return 0; } + if(type==15) mini=1; // save mini version for json + if(srnd) mgl_srnd(1); gr->VertexColor(false); gr->TextureColor(true); gr->Compression(false); if(name[0]==0) while(s->name[0]) // all samples { gr->DefaultPlotParam(); gr->Clf(); - s->func(gr); save(gr, s->name, suf); + if(use_mgl) + { + mglParse par; + par.AllowSetSize(true); + setlocale(LC_CTYPE, ""); + char *buf = new char[strlen(s->mgl)+strlen(mmgl_dat_prepare)+1]; + strcpy(buf,s->mgl); strcat(buf,mmgl_dat_prepare); + printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl); + par.Execute(gr,buf); delete []buf; + const char *mess = gr->Message(); + if(*mess) printf("Warnings: %s\n-------\n",mess); + } + else s->func(gr); + save(gr, s->name, suf); fflush(stdout); s++; } else // manual sample @@ -2084,7 +425,20 @@ int main(int argc,char **argv) if(s) { gr->DefaultPlotParam(); gr->Clf(); - s->func(gr); save(gr, s->name, suf); + if(use_mgl) + { + mglParse par; + par.AllowSetSize(true); + setlocale(LC_CTYPE, ""); + char *buf = new char[strlen(s->mgl)+strlen(mmgl_dat_prepare)+1]; + strcpy(buf,s->mgl); strcat(buf,mmgl_dat_prepare); + printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl); + par.Execute(gr,buf); delete []buf; + const char *mess = gr->Message(); + if(*mess) printf("Warnings: %s\n-------\n",mess); + } + else s->func(gr); + save(gr, s->name, suf); } else printf("no sample %s\n",name); } @@ -2092,96 +446,3 @@ int main(int argc,char **argv) delete gr; return 0; } //----------------------------------------------------------------------------- -mglSample samp[] = { - {"alpha", smgl_alpha}, - {"area", smgl_area}, - {"aspect", smgl_aspect}, - {"axial", smgl_axial}, - {"axis", smgl_axis}, - {"barh", smgl_barh}, - {"bars", smgl_bars}, - {"belt", smgl_belt}, - {"box", smgl_box}, - {"boxplot", smgl_boxplot}, - {"boxs", smgl_boxs}, - {"candle", smgl_candle}, - {"chart", smgl_chart}, - {"cloud", smgl_cloud}, - {"colorbar", smgl_colorbar}, - {"combined", smgl_combined}, - {"cones", smgl_cones}, - {"cont", smgl_cont}, - {"cont_xyz", smgl_cont_xyz}, - {"conta", smgl_conta}, - {"contd", smgl_contd}, - {"contf", smgl_contf}, - {"contf_xyz", smgl_contf_xyz}, - {"contfa", smgl_contfa}, - {"contv", smgl_contv}, -// {"crust", smgl_crust}, // TODO: open after triangulation - {"curvcoor", smgl_curvcoor}, - {"cut", smgl_cut}, - {"dat_diff", smgl_dat_diff}, - {"dat_extra", smgl_dat_extra}, - {"dens", smgl_dens}, - {"dens_xyz", smgl_dens_xyz}, - {"densa", smgl_densa}, - {"dew", smgl_dew}, - {"dots", smgl_dots}, - {"error", smgl_error}, - {"fall", smgl_fall}, - {"fit", smgl_fit}, - {"flow", smgl_flow}, - {"fog", smgl_fog}, -// {"fonts", smgl_fonts}, // TODO enable later - {"grad", smgl_grad}, - {"hist", smgl_hist}, - {"inplot", smgl_inplot}, - {"label", smgl_label}, - {"legend", smgl_legend}, - {"loglog", smgl_loglog}, - {"map", smgl_map}, - {"mark", smgl_mark}, - {"mesh", smgl_mesh}, - {"mirror", smgl_mirror}, - {"molecule", smgl_molecule}, - {"parser", smgl_parser}, - {"pde", smgl_pde}, - {"pipe", smgl_pipe}, - {"plot", smgl_plot}, - {"primitives", smgl_primitives}, - {"qo2d", smgl_qo2d}, - {"radar", smgl_radar}, - {"region", smgl_region}, - {"schemes", smgl_schemes}, - {"several_light", smgl_several_light}, - {"stem", smgl_stem}, - {"step", smgl_step}, - {"stereo", smgl_stereo}, - {"stfa", smgl_stfa}, - {"style", smgl_style}, - {"surf", smgl_surf}, - {"surf3", smgl_surf3}, - {"surf3a", smgl_surf3a}, - {"surf3c", smgl_surf3c}, - {"surfa", smgl_surfa}, - {"surfc", smgl_surfc}, - {"tape", smgl_tape}, - {"tens", smgl_tens}, - {"ternary", smgl_ternary}, - {"text", smgl_text}, - {"textmark", smgl_textmark}, - {"ticks", smgl_ticks}, - {"tile", smgl_tile}, - {"tiles", smgl_tiles}, - {"torus", smgl_torus}, - {"traj", smgl_traj}, - {"triangulation",smgl_triangulation}, - {"triplot", smgl_triplot}, - {"tube", smgl_tube}, - {"type0", smgl_type0}, - {"type1", smgl_type1}, - {"type2", smgl_type2}, - {"vect", smgl_vect}, - {"venn", smgl_venn}, -{"", NULL}}; diff --git a/examples/glut_example.cpp b/examples/glut_example.cpp index 4d758be..419bb74 100644 --- a/examples/glut_example.cpp +++ b/examples/glut_example.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * glut_example.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * diff --git a/examples/qt_example.cpp b/examples/qt_example.cpp index 4a16d08..2dfbb75 100644 --- a/examples/qt_example.cpp +++ b/examples/qt_example.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * qt_example.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -17,9 +17,11 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "mgl2/window.h" +#include "mgl2/qt.h" #if defined(WIN32) || defined(_MSC_VER) || defined(__BORLANDC__) #include +#else +#include #endif //----------------------------------------------------------------------------- int test_wnd(mglGraph *gr); @@ -40,7 +42,7 @@ class Foo : public mglDraw { mglPoint pnt; // some result of calculation public: - mglWindow *Gr; // graphics to be updated + mglWnd *Gr; // graphics to be updated int Draw(mglGraph *gr); void Calc(); } foo; @@ -69,22 +71,22 @@ int Foo::Draw(mglGraph *gr) int main(int argc,char **argv) { #ifdef PTHREAD_SAMPLE - mglWindow gr(&foo,"MathGL examples"); + mglQT gr(&foo,"MathGL examples"); foo.Gr = &gr; foo.Run(); return gr.Run(); #else - mglWindow *gr; + mglQT *gr; char key = 0; if(argc>1) key = argv[1][0]!='-' ? argv[1][0]:argv[1][1]; else printf("You may specify argument '1', '2', '3' or 'd' for viewing examples of 1d, 2d, 3d or dual plotting\n"); switch(key) { - case '1': gr = new mglWindow(sample_1,"1D plots",1); break; - case '2': gr = new mglWindow(sample_2,"2D plots",1); break; - case '3': gr = new mglWindow(sample_3,"3D plots",1); break; - case 'd': gr = new mglWindow(sample_d,"Dual plots",1); break; - case 't': gr = new mglWindow(test_wnd,"Testing",1); break; - default: gr = new mglWindow(sample,"Drop and waves",1); break; + case '1': gr = new mglQT(sample_1,"1D plots"); break; + case '2': gr = new mglQT(sample_2,"2D plots"); break; + case '3': gr = new mglQT(sample_3,"3D plots"); break; + case 'd': gr = new mglQT(sample_d,"Dual plots"); break; + case 't': gr = new mglQT(test_wnd,"Testing"); break; + default: gr = new mglQT(sample,"Drop and waves"); break; } gr->Run(); return 0; #endif diff --git a/examples/samples.cpp b/examples/samples.cpp new file mode 100644 index 0000000..9e94bf0 --- /dev/null +++ b/examples/samples.cpp @@ -0,0 +1,2137 @@ +/*************************************************************************** + * samples.cpp is part of Math Graphic Library + * Copyright (C) 2007-2012 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "mgl2/mgl.h" +//----------------------------------------------------------------------------- +void mgls_prepare1d(mglData *y, mglData *y1=0, mglData *y2=0, mglData *x1=0, mglData *x2=0); +void mgls_prepare2d(mglData *a, mglData *b=0, mglData *v=0); +void mgls_prepare3d(mglData *a, mglData *b=0); +void mgls_prepare2v(mglData *a, mglData *b); +void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez); +extern int mini; +//----------------------------------------------------------------------------- +struct mglSample /// Structure for list of samples +{ + const char *name; + void (*func)(mglGraph*); + const char *mgl; +}; +//----------------------------------------------------------------------------- +// MGL functions for preparing data +//----------------------------------------------------------------------------- +const char *mmgl_dat_prepare = "\nstop\n\nfunc 'prepare1d'\n\ +new y 50 3\nmodify y '0.7*sin(2*pi*x)+0.5*cos(3*pi*x)+0.2*sin(pi*x)'\n\ +modify y 'sin(2*pi*x)' 1\nmodify y 'cos(2*pi*x)' 2\n\ +new x1 50 'x'\nnew x2 50 '0.05-0.03*cos(pi*x)'\n\ +new y1 50 '0.5-0.3*cos(pi*x)'\nnew y2 50 '-0.3*sin(pi*x)'\n\ +return\n\nfunc 'prepare2d'\n\ +new a 50 40 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'\n\ +new b 50 40 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'\n\ +return\n\nfunc 'prepare3d'\n\ +new c 61 50 40 '-2*(x^2+y^2+z^4-z^2)+0.2'\n\ +new d 61 50 40 '1-2*tanh((x+y)*(x+y))'\n\ +return\n\nfunc 'prepare2v'\n\ +new a 20 30 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'\n\ +new b 20 30 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))'\n\ +return\n\nfunc 'prepare3v'\n\ +define $1 pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5)\n\ +define $2 pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5)\n\ +new ex 10 10 10 '0.2*x/$1-0.2*x/$2'\n\ +new ey 10 10 10 '0.2*y/$1-0.2*y/$2'\n\ +new ez 10 10 10 '0.2*(z-0.3)/$1-0.2*(z+0.3)/$2'\nreturn\n"; +//----------------------------------------------------------------------------- +// Sample functions (v.2.*0) +//----------------------------------------------------------------------------- +const char *mmgl_solve="zrange 0 1\nnew x 20 30 '(x+2)/3*cos(pi*y)'\n" +"new y 20 30 '(x+2)/3*sin(pi*y)'\nnew z 20 30 'exp(-6*x^2-2*sin(pi*y)^2)'\n\n" +"subplot 2 1 0:title 'Cartesian space':rotate 30 -40\naxis 'xyzU':box\nxlabel 'x':ylabel 'y'" +"origin 1 1:grid 'xy'\nmesh x y z\n\n" +"# section along 'x' direction\nsolve u x 0.5 'x'\nvar v u.nx 0 1\n" +"evaluate yy y u v\nevaluate xx x u v\nevaluate zz z u v\nplot xx yy zz 'k2o'\n\n" +"# 1st section along 'y' direction\nsolve u1 x -0.5 'y'\nvar v1 u1.nx 0 1\n" +"evaluate yy y v1 u1\nevaluate xx x v1 u1\nevaluate zz z v1 u1\nplot xx yy zz 'b2^'\n\n" +"# 2nd section along 'y' direction\nsolve u2 x -0.5 'y' u1\n" +"evaluate yy y v1 u2\nevaluate xx x v1 u2\nevaluate zz z v1 u2\nplot xx yy zz 'r2v'\n\n" +"subplot 2 1 1:title 'Accompanied space'\nranges 0 1 0 1:origin 0 0\n" +"axis:box:xlabel 'i':ylabel 'j':grid2 z 'h'\n\n" +"plot u v 'k2o':line 0.4 0.5 0.8 0.5 'kA'\n" +"plot v1 u1 'b2^':line 0.5 0.15 0.5 0.3 'bA'\n" +"plot v1 u2 'r2v':line 0.5 0.7 0.5 0.85 'rA'\n"; +void smgl_solve(mglGraph *gr) // solve and evaluate +{ + gr->SetRange('z',0,1); + mglData x(20,30), y(20,30), z(20,30), xx,yy,zz; + gr->Fill(x,"(x+2)/3*cos(pi*y)"); + gr->Fill(y,"(x+2)/3*sin(pi*y)"); + gr->Fill(z,"exp(-6*x^2-2*sin(pi*y)^2)"); + + gr->SubPlot(2,1,0); gr->Title("Cartesian space"); gr->Rotate(30,-40); + gr->Axis("xyzU"); gr->Box(); gr->Label('x',"x"); gr->Label('y',"y"); + gr->SetOrigin(1,1); gr->Grid("xy"); + gr->Mesh(x,y,z); + + // section along 'x' direction + mglData u = x.Solve(0.5,'x'); + mglData v(u.nx); v.Fill(0,1); + xx = x.Evaluate(u,v); yy = y.Evaluate(u,v); zz = z.Evaluate(u,v); + gr->Plot(xx,yy,zz,"k2o"); + + // 1st section along 'y' direction + mglData u1 = x.Solve(-0.5,'y'); + mglData v1(u1.nx); v1.Fill(0,1); + xx = x.Evaluate(v1,u1); yy = y.Evaluate(v1,u1); zz = z.Evaluate(v1,u1); + gr->Plot(xx,yy,zz,"b2^"); + + // 2nd section along 'y' direction + mglData u2 = x.Solve(-0.5,'y',u1); + xx = x.Evaluate(v1,u2); yy = y.Evaluate(v1,u2); zz = z.Evaluate(v1,u2); + gr->Plot(xx,yy,zz,"r2v"); + + gr->SubPlot(2,1,1); gr->Title("Accompanied space"); + gr->SetRanges(0,1,0,1); gr->SetOrigin(0,0); + gr->Axis(); gr->Box(); gr->Label('x',"i"); gr->Label('y',"j"); + gr->Grid(z,"h"); + + gr->Plot(u,v,"k2o"); gr->Line(mglPoint(0.4,0.5),mglPoint(0.8,0.5),"kA"); + gr->Plot(v1,u1,"b2^"); gr->Line(mglPoint(0.5,0.15),mglPoint(0.5,0.3),"bA"); + gr->Plot(v1,u2,"r2v"); gr->Line(mglPoint(0.5,0.7),mglPoint(0.5,0.85),"rA"); +} +//----------------------------------------------------------------------------- +const char *mmgl_triangulation="new x 100 '2*rnd-1':new y 100 '2*rnd-1':copy z x^2-y^2\n" +"new g 30 30:triangulate d x y\n" +"title 'Triangulation'\nrotate 50 60:box:light on\n" +"triplot d x y z:triplot d x y z '#k'\ndatagrid g x y z:mesh g 'm'\n"; +void smgl_triangulation(mglGraph *gr) // surface triangulation +{ + mglData x(100), y(100), z(100); + gr->Fill(x,"2*rnd-1"); gr->Fill(y,"2*rnd-1"); gr->Fill(z,"v^2-w^2",x,y); + mglData d = mglTriangulation(x,y), g(30,30); + + if(!mini) gr->Title("Triangulation"); + gr->Rotate(40,60); gr->Box(); gr->Light(true); + gr->TriPlot(d,x,y,z); gr->TriPlot(d,x,y,z,"#k"); + + gr->DataGrid(g,x,y,z); gr->Mesh(g,"m"); +} +//----------------------------------------------------------------------------- +const char *mmgl_alpha="call 'prepare2d'\nsubplot 2 2 0:title 'default':rotate 50 60:box\nsurf a\n" +"subplot 2 2 1:title 'light on':rotate 50 60:box\nlight on:surf a\n" +"subplot 2 2 3:title 'light on; alpha on':rotate 50 60:box\nalpha on:surf a\n" +"subplot 2 2 2:title 'alpha on':rotate 50 60:box\nlight off:surf a\n"; +void smgl_alpha(mglGraph *gr) // alpha and lighting +{ + mglData a; mgls_prepare2d(&a); + gr->SubPlot(2,2,0); gr->Title("default"); gr->Rotate(50,60); + gr->Box(); gr->Surf(a); + gr->SubPlot(2,2,1); gr->Title("light on"); gr->Rotate(50,60); + gr->Box(); gr->Light(true); gr->Surf(a); + gr->SubPlot(2,2,3); gr->Title("alpha on; light on"); gr->Rotate(50,60); + gr->Box(); gr->Alpha(true); gr->Surf(a); + gr->SubPlot(2,2,2); gr->Title("alpha on"); gr->Rotate(50,60); + gr->Box(); gr->Light(false); gr->Surf(a); +} +//----------------------------------------------------------------------------- +const char *mmgl_schemes="call 'sch' 0 'kw'\ncall 'sch' 1 'wk'\ncall 'sch' 2 'kHCcw'\ncall 'sch' 3 'kBbcw'\n" +"call 'sch' 4 'kRryw'\ncall 'sch' 5 'kGgew'\ncall 'sch' 6 'BbwrR'\ncall 'sch' 7 'BbwgG'\n" +"call 'sch' 8 'GgwmM'\ncall 'sch' 9 'UuwqR'\ncall 'sch' 10 'QqwcC'\ncall 'sch' 11 'CcwyY'\n" +"call 'sch' 12 'bcwyr'\ncall 'sch' 13 'bwr'\ncall 'sch' 14 'BbcyrR'\ncall 'sch' 15 'UbcyqR'\n" +"call 'sch' 16 'BbcwyrR'\ncall 'sch' 17 'bgr'\ncall 'sch' 18 'BbcyrR|'\ncall 'sch' 19 'b\\{g,0.3\\}r'\n" +"stop\nfunc 'sch' 2\nsubplot 2 10 $1 '<>_^' 0.2 0:fsurf 'x' '$2'\n" +"text 0.07+0.5*mod($1,2) 0.92-0.1*int($1/2) '$2' 'A'\nreturn\n"; +void smgl_schemes(mglGraph *gr) // Color table +{ + mglData a(256,2); a.Fill(-1,1); + gr->SubPlot(2,10,0,NULL,0.2); gr->Dens(a,"kw"); gr->Puts(0.07, 0.92, "'kw'", "A"); + gr->SubPlot(2,10,1,NULL,0.2); gr->Dens(a,"wk"); gr->Puts(0.57, 0.92, "'wk'", "A"); + gr->SubPlot(2,10,2,NULL,0.2); gr->Dens(a,"kHCcw"); gr->Puts(0.07, 0.82, "'kHCcw'", "A"); + gr->SubPlot(2,10,3,NULL,0.2); gr->Dens(a,"kBbcw"); gr->Puts(0.57, 0.82, "'kBbcw'", "A"); + gr->SubPlot(2,10,4,NULL,0.2); gr->Dens(a,"kRryw"); gr->Puts(0.07, 0.72, "'kRryw'", "A"); + gr->SubPlot(2,10,5,NULL,0.2); gr->Dens(a,"kGgew"); gr->Puts(0.57, 0.72, "'kGgew'", "A"); + gr->SubPlot(2,10,6,NULL,0.2); gr->Dens(a,"BbwrR"); gr->Puts(0.07, 0.62, "'BbwrR'", "A"); + gr->SubPlot(2,10,7,NULL,0.2); gr->Dens(a,"BbwgG"); gr->Puts(0.57, 0.62, "'BbwgG'", "A"); + gr->SubPlot(2,10,8,NULL,0.2); gr->Dens(a,"GgwmM"); gr->Puts(0.07, 0.52, "'GgwmM'", "A"); + gr->SubPlot(2,10,9,NULL,0.2); gr->Dens(a,"UuwqR"); gr->Puts(0.57, 0.52, "'UuwqR'", "A"); + gr->SubPlot(2,10,10,NULL,0.2); gr->Dens(a,"QqwcC"); gr->Puts(0.07, 0.42, "'QqwcC'", "A"); + gr->SubPlot(2,10,11,NULL,0.2); gr->Dens(a,"CcwyY"); gr->Puts(0.57, 0.42, "'CcwyY'", "A"); + gr->SubPlot(2,10,12,NULL,0.2); gr->Dens(a,"bcwyr"); gr->Puts(0.07, 0.32, "'bcwyr'", "A"); + gr->SubPlot(2,10,13,NULL,0.2); gr->Dens(a,"bwr"); gr->Puts(0.57, 0.32, "'bwr'", "A"); + gr->SubPlot(2,10,14,NULL,0.2); gr->Dens(a,"BbcyrR"); gr->Puts(0.07, 0.22, "'BbcyrR'", "A"); + gr->SubPlot(2,10,15,NULL,0.2); gr->Dens(a,"UbcyqR"); gr->Puts(0.57, 0.22, "'UbcyqR'", "A"); + gr->SubPlot(2,10,16,NULL,0.2); gr->Dens(a,"BbcwyrR"); gr->Puts(0.07, 0.12, "'BbcwyrR'", "A"); + gr->SubPlot(2,10,17,NULL,0.2); gr->Dens(a,"bgr"); gr->Puts(0.57, 0.12, "'bgr'", "A"); + gr->SubPlot(2,10,18,NULL,0.2); gr->Dens(a,"BbcyrR|"); gr->Puts(0.07, 0.02, "'BbcyrR|'", "A"); + gr->SubPlot(2,10,19,NULL,0.2); gr->Dens(a,"b{g,0.3}r"); gr->Puts(0.57, 0.02, "'b\\{g,0.3\\}r'", "A"); +} +//----------------------------------------------------------------------------- +const char *mmgl_curvcoor="origin -1 1 -1\nsubplot 2 2 0:title 'Cartesian':rotate 50 60:fplot '2*t-1' '0.5' '0' '2r':axis:grid\n" +"axis 'y*sin(pi*x)' 'y*cos(pi*x)' '':subplot 2 2 1:title 'Cylindrical':rotate 50 60:fplot '2*t-1' '0.5' '0' '2r':axis:grid\n" +"axis '2*y*x' 'y*y - x*x' '':subplot 2 2 2:title 'Parabolic':rotate 50 60:fplot '2*t-1' '0.5' '0' '2r':axis:grid\n" +"axis 'y*sin(pi*x)' 'y*cos(pi*x)' 'x+z':subplot 2 2 3:title 'Spiral':rotate 50 60:fplot '2*t-1' '0.5' '0' '2r':axis:grid\n"; +void smgl_curvcoor(mglGraph *gr) // curvilinear coordinates +{ + gr->SetOrigin(-1,1,-1); + + gr->SubPlot(2,2,0); gr->Title("Cartesian"); gr->Rotate(50,60); + gr->FPlot("2*t-1","0.5","0","r2"); + gr->Axis(); gr->Grid(); + + gr->SetFunc("y*sin(pi*x)","y*cos(pi*x)",0); + gr->SubPlot(2,2,1); gr->Title("Cylindrical"); gr->Rotate(50,60); + gr->FPlot("2*t-1","0.5","0","r2"); + gr->Axis(); gr->Grid(); + + gr->SetFunc("2*y*x","y*y - x*x",0); + gr->SubPlot(2,2,2); gr->Title("Parabolic"); gr->Rotate(50,60); + gr->FPlot("2*t-1","0.5","0","r2"); + gr->Axis(); gr->Grid(); + + gr->SetFunc("y*sin(pi*x)","y*cos(pi*x)","x+z"); + gr->SubPlot(2,2,3); gr->Title("Spiral"); gr->Rotate(50,60); + gr->FPlot("2*t-1","0.5","0","r2"); + gr->Axis(); gr->Grid(); + gr->SetFunc(0,0,0); // set to default Cartesian +} +//----------------------------------------------------------------------------- +const char *mmgl_style=""; +void smgl_style(mglGraph *gr) // pen styles +{ + gr->SubPlot(2,2,0); + double d,x1,x2,x0,y=0.95; + d=0.3, x0=0.2, x1=0.5, x2=0.6; + gr->Line(mglPoint(x0,1-0*d),mglPoint(x1,1-0*d),"k-"); gr->Puts(mglPoint(x2,y-0*d),"Solid '-'",":rL"); + gr->Line(mglPoint(x0,1-1*d),mglPoint(x1,1-1*d),"k|"); gr->Puts(mglPoint(x2,y-1*d),"Long Dash '|'",":rL"); + gr->Line(mglPoint(x0,1-2*d),mglPoint(x1,1-2*d),"k;"); gr->Puts(mglPoint(x2,y-2*d),"Dash ';'",":rL"); + gr->Line(mglPoint(x0,1-3*d),mglPoint(x1,1-3*d),"k="); gr->Puts(mglPoint(x2,y-3*d),"Small dash '='",":rL"); + gr->Line(mglPoint(x0,1-4*d),mglPoint(x1,1-4*d),"kj"); gr->Puts(mglPoint(x2,y-4*d),"Dash-dot 'j'",":rL"); + gr->Line(mglPoint(x0,1-5*d),mglPoint(x1,1-5*d),"ki"); gr->Puts(mglPoint(x2,y-5*d),"Small dash-dot 'i'",":rL"); + gr->Line(mglPoint(x0,1-6*d),mglPoint(x1,1-6*d),"k:"); gr->Puts(mglPoint(x2,y-6*d),"Dots ':'",":rL"); + gr->Line(mglPoint(x0,1-7*d),mglPoint(x1,1-7*d),"k "); gr->Puts(mglPoint(x2,y-7*d),"None ' '",":rL"); + + d=0.25; x1=-1; x0=-0.8; y = -0.05; + gr->Mark(mglPoint(x1,5*d),"k."); gr->Puts(mglPoint(x0,y+5*d),"'.'",":rL"); + gr->Mark(mglPoint(x1,4*d),"k+"); gr->Puts(mglPoint(x0,y+4*d),"'+'",":rL"); + gr->Mark(mglPoint(x1,3*d),"kx"); gr->Puts(mglPoint(x0,y+3*d),"'x'",":rL"); + gr->Mark(mglPoint(x1,2*d),"k*"); gr->Puts(mglPoint(x0,y+2*d),"'*'",":rL"); + gr->Mark(mglPoint(x1,d),"ks"); gr->Puts(mglPoint(x0,y+d),"'s'",":rL"); + gr->Mark(mglPoint(x1,0),"kd"); gr->Puts(mglPoint(x0,y),"'d'",":rL"); + gr->Mark(mglPoint(x1,-d,0),"ko"); gr->Puts(mglPoint(x0,y-d),"'o'",":rL"); + gr->Mark(mglPoint(x1,-2*d,0),"k^"); gr->Puts(mglPoint(x0,y-2*d),"'\\^'",":rL"); + gr->Mark(mglPoint(x1,-3*d,0),"kv"); gr->Puts(mglPoint(x0,y-3*d),"'v'",":rL"); + gr->Mark(mglPoint(x1,-4*d,0),"k<"); gr->Puts(mglPoint(x0,y-4*d),"'<'",":rL"); + gr->Mark(mglPoint(x1,-5*d,0),"k>"); gr->Puts(mglPoint(x0,y-5*d),"'>'",":rL"); + + d=0.25; x1=-0.5; x0=-0.3; y = -0.05; + gr->Mark(mglPoint(x1,5*d),"k#."); gr->Puts(mglPoint(x0,y+5*d),"'\\#.'",":rL"); + gr->Mark(mglPoint(x1,4*d),"k#+"); gr->Puts(mglPoint(x0,y+4*d),"'\\#+'",":rL"); + gr->Mark(mglPoint(x1,3*d),"k#x"); gr->Puts(mglPoint(x0,y+3*d),"'\\#x'",":rL"); + gr->Mark(mglPoint(x1,2*d),"k#*"); gr->Puts(mglPoint(x0,y+2*d),"'\\#*'",":rL"); + gr->Mark(mglPoint(x1,d),"k#s"); gr->Puts(mglPoint(x0,y+d),"'\\#s'",":rL"); + gr->Mark(mglPoint(x1,0),"k#d"); gr->Puts(mglPoint(x0,y),"'\\#d'",":rL"); + gr->Mark(mglPoint(x1,-d,0),"k#o"); gr->Puts(mglPoint(x0,y-d),"'\\#o'",":rL"); + gr->Mark(mglPoint(x1,-2*d,0),"k#^"); gr->Puts(mglPoint(x0,y-2*d),"'\\#\\^'",":rL"); + gr->Mark(mglPoint(x1,-3*d,0),"k#v"); gr->Puts(mglPoint(x0,y-3*d),"'\\#v'",":rL"); + gr->Mark(mglPoint(x1,-4*d,0),"k#<"); gr->Puts(mglPoint(x0,y-4*d),"'\\#<'",":rL"); + gr->Mark(mglPoint(x1,-5*d,0),"k#>"); gr->Puts(mglPoint(x0,y-5*d),"'\\#>'",":rL"); + + gr->SubPlot(2,2,1); + double a=0.1,b=0.4,c=0.5; + gr->Line(mglPoint(a,1),mglPoint(b,1),"k-A"); gr->Puts(mglPoint(c,1),"Style 'A' or 'A\\_'",":rL"); + gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"k-V"); gr->Puts(mglPoint(c,0.8),"Style 'V' or 'V\\_'",":rL"); + gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"k-K"); gr->Puts(mglPoint(c,0.6),"Style 'K' or 'K\\_'",":rL"); + gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"k-I"); gr->Puts(mglPoint(c,0.4),"Style 'I' or 'I\\_'",":rL"); + gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"k-D"); gr->Puts(mglPoint(c,0.2),"Style 'D' or 'D\\_'",":rL"); + gr->Line(mglPoint(a,0),mglPoint(b,0),"k-S"); gr->Puts(mglPoint(c,0),"Style 'S' or 'S\\_'",":rL"); + gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"k-O"); gr->Puts(mglPoint(c,-0.2),"Style 'O' or 'O\\_'",":rL"); + gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"k-T"); gr->Puts(mglPoint(c,-0.4),"Style 'T' or 'T\\_'",":rL"); + gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-_"); gr->Puts(mglPoint(c,-0.6),"Style '\\_' or none",":rL"); + gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-AS"); gr->Puts(mglPoint(c,-0.8),"Style 'AS'",":rL"); + gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-_A"); gr->Puts(mglPoint(c,-1),"Style '\\_A'",":rL"); + + a=-1; b=-0.7; c=-0.6; + gr->Line(mglPoint(a,1),mglPoint(b,1),"kAA"); gr->Puts(mglPoint(c,1),"Style 'AA'",":rL"); + gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"kVV"); gr->Puts(mglPoint(c,0.8),"Style 'VV'",":rL"); + gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"kKK"); gr->Puts(mglPoint(c,0.6),"Style 'KK'",":rL"); + gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"kII"); gr->Puts(mglPoint(c,0.4),"Style 'II'",":rL"); + gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"kDD"); gr->Puts(mglPoint(c,0.2),"Style 'DD'",":rL"); + gr->Line(mglPoint(a,0),mglPoint(b,0),"kSS"); gr->Puts(mglPoint(c,0),"Style 'SS'",":rL"); + gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"kOO"); gr->Puts(mglPoint(c,-0.2),"Style 'OO'",":rL"); + gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"kTT"); gr->Puts(mglPoint(c,-0.4),"Style 'TT'",":rL"); + gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-__"); gr->Puts(mglPoint(c,-0.6),"Style '\\_\\_'",":rL"); + gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-VA"); gr->Puts(mglPoint(c,-0.8),"Style 'VA'",":rL"); + gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-AV"); gr->Puts(mglPoint(c,-1),"Style 'AV'",":rL"); + + gr->SubPlot(2,2,2); + //#LENUQ + gr->FaceZ(mglPoint(-1, -1), 0.4, 0.3, "L#"); gr->Puts(mglPoint(-0.8,-0.9), "L", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.6,-1), 0.4, 0.3, "E#"); gr->Puts(mglPoint(-0.4,-0.9), "E", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.2,-1), 0.4, 0.3, "N#"); gr->Puts(mglPoint(0, -0.9), "N", "w:C", -1.4); + gr->FaceZ(mglPoint(0.2, -1), 0.4, 0.3, "U#"); gr->Puts(mglPoint(0.4,-0.9), "U", "w:C", -1.4); + gr->FaceZ(mglPoint(0.6, -1), 0.4, 0.3, "Q#"); gr->Puts(mglPoint(0.8,-0.9), "Q", "w:C", -1.4); + //#lenuq + gr->FaceZ(mglPoint(-1, -0.7), 0.4, 0.3, "l#"); gr->Puts(mglPoint(-0.8,-0.6), "l", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.6,-0.7), 0.4, 0.3, "e#"); gr->Puts(mglPoint(-0.4,-0.6), "e", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.2,-0.7), 0.4, 0.3, "n#"); gr->Puts(mglPoint(0, -0.6), "n", "k:C", -1.4); + gr->FaceZ(mglPoint(0.2, -0.7), 0.4, 0.3, "u#"); gr->Puts(mglPoint(0.4,-0.6), "u", "k:C", -1.4); + gr->FaceZ(mglPoint(0.6, -0.7), 0.4, 0.3, "q#"); gr->Puts(mglPoint(0.8,-0.6), "q", "k:C", -1.4); + //#CMYkP + gr->FaceZ(mglPoint(-1, -0.4), 0.4, 0.3, "C#"); gr->Puts(mglPoint(-0.8,-0.3), "C", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.6,-0.4), 0.4, 0.3, "M#"); gr->Puts(mglPoint(-0.4,-0.3), "M", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.2,-0.4), 0.4, 0.3, "Y#"); gr->Puts(mglPoint(0, -0.3), "Y", "w:C", -1.4); + gr->FaceZ(mglPoint(0.2, -0.4), 0.4, 0.3, "k#"); gr->Puts(mglPoint(0.4,-0.3), "k", "w:C", -1.4); + gr->FaceZ(mglPoint(0.6, -0.4), 0.4, 0.3, "P#"); gr->Puts(mglPoint(0.8,-0.3), "P", "w:C", -1.4); + //#cmywp + gr->FaceZ(mglPoint(-1, -0.1), 0.4, 0.3, "c#"); gr->Puts(mglPoint(-0.8, 0), "c", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.6,-0.1), 0.4, 0.3, "m#"); gr->Puts(mglPoint(-0.4, 0), "m", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.2,-0.1), 0.4, 0.3, "y#"); gr->Puts(mglPoint(0, 0), "y", "k:C", -1.4); + gr->FaceZ(mglPoint(0.2, -0.1), 0.4, 0.3, "w#"); gr->Puts(mglPoint(0.4, 0), "w", "k:C", -1.4); + gr->FaceZ(mglPoint(0.6, -0.1), 0.4, 0.3, "p#"); gr->Puts(mglPoint(0.8, 0), "p", "k:C", -1.4); + //#BGRHW + gr->FaceZ(mglPoint(-1, 0.2), 0.4, 0.3, "B#"); gr->Puts(mglPoint(-0.8, 0.3), "B", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.6,0.2), 0.4, 0.3, "G#"); gr->Puts(mglPoint(-0.4, 0.3), "G", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.2,0.2), 0.4, 0.3, "R#"); gr->Puts(mglPoint(0, 0.3), "R", "w:C", -1.4); + gr->FaceZ(mglPoint(0.2, 0.2), 0.4, 0.3, "H#"); gr->Puts(mglPoint(0.4, 0.3), "H", "w:C", -1.4); + gr->FaceZ(mglPoint(0.6, 0.2), 0.4, 0.3, "W#"); gr->Puts(mglPoint(0.8, 0.3), "W", "w:C", -1.4); + //#bgrhw + gr->FaceZ(mglPoint(-1, 0.5), 0.4, 0.3, "b#"); gr->Puts(mglPoint(-0.8, 0.6), "b", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.6,0.5), 0.4, 0.3, "g#"); gr->Puts(mglPoint(-0.4, 0.6), "g", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.2,0.5), 0.4, 0.3, "r#"); gr->Puts(mglPoint(0, 0.6), "r", "k:C", -1.4); + gr->FaceZ(mglPoint(0.2, 0.5), 0.4, 0.3, "h#"); gr->Puts(mglPoint(0.4, 0.6), "h", "k:C", -1.4); + gr->FaceZ(mglPoint(0.6, 0.5), 0.4, 0.3, "w#"); gr->Puts(mglPoint(0.8, 0.6), "w", "k:C", -1.4); + //#brighted + gr->FaceZ(mglPoint(-1, 0.8), 0.4, 0.3, "{r1}#"); gr->Puts(mglPoint(-0.8, 0.9), "\\{r1\\}", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.6,0.8), 0.4, 0.3, "{r3}#"); gr->Puts(mglPoint(-0.4, 0.9), "\\{r3\\}", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.2,0.8), 0.4, 0.3, "{r5}#"); gr->Puts(mglPoint(0, 0.9), "\\{r5\\}", "k:C", -1.4); + gr->FaceZ(mglPoint(0.2, 0.8), 0.4, 0.3, "{r7}#"); gr->Puts(mglPoint(0.4, 0.9), "\\{r7\\}", "k:C", -1.4); + gr->FaceZ(mglPoint(0.6, 0.8), 0.4, 0.3, "{r9}#"); gr->Puts(mglPoint(0.8, 0.9), "\\{r9\\}", "k:C", -1.4); + // HEX + gr->FaceZ(mglPoint(-1, -1.3), 1, 0.3, "{xff9966}#"); gr->Puts(mglPoint(-0.5,-1.2), "\\{xff9966\\}", "k:C", -1.4); + gr->FaceZ(mglPoint(0, -1.3), 1, 0.3, "{x83CAFF}#"); gr->Puts(mglPoint( 0.5,-1.2), "\\{x83CAFF\\}", "k:C", -1.4); + + gr->SubPlot(2,2,3); + char stl[3]="r1", txt[4]="'1'"; + for(int i=0;i<10;i++) + { + txt[1]=stl[1]='0'+i; + gr->Line(mglPoint(-1,0.2*i-1),mglPoint(1,0.2*i-1),stl); + gr->Puts(mglPoint(1.05,0.2*i-1),txt,":L"); + } +} +//----------------------------------------------------------------------------- +const char *mmgl_text="call 'prepare1d'\nsubplot 2 2 0 ''\ntext 0 1 'Text can be in ASCII and in Unicode'\n" +"text 0 0.6 'It can be \\wire{wire}, \\big{big} or #r{colored}'\n" +"text 0 0.2 'One can change style in string: \\b{bold}, \\i{italic, \\b{both}}'\n" +"text 0 -0.2 'Easy to \\a{overline} or \\u{underline}'\n" +"text 0 -0.6 'Easy to change indexes ^{up} _{down} @{center}'\n" +"text 0 -1 'It parse TeX: \\int \\alpha \\cdot \\\n\\sqrt3{sin(\\pi x)^2 + \\gamma_{i_k}} dx'\n" +"subplot 2 2 1 ''\n text 0 0.5 '\\sqrt{\\frac{\\alpha^{\\gamma^2}+\\overset 1{\\big\\infty}}{\\sqrt3{2+b}}}' '@' -2\n" +"text 0 -0.5 'Text can be printed\\n{}on several lines'\n" +"subplot 2 2 2 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k'\ntext y 'Another string drawn above a curve' 'Tr'\n" +"subplot 2 2 3 '':line -1 -1 1 -1 'rA':text 0 -1 1 -1 'Horizontal'\n" +"line -1 -1 1 1 'rA':text 0 0 1 1 'At angle' '@'\nline -1 -1 -1 1 'rA':text -1 0 -1 1 'Vertical'\n"; +void smgl_text(mglGraph *gr) // text drawing +{ + if(!mini) gr->SubPlot(2,2,0,""); + gr->Putsw(mglPoint(0,1),L"Text can be in ASCII and in Unicode"); + gr->Puts(mglPoint(0,0.6),"It can be \\wire{wire}, \\big{big} or #r{colored}"); + gr->Puts(mglPoint(0,0.2),"One can change style in string: " + "\\b{bold}, \\i{italic, \\b{both}}"); + gr->Puts(mglPoint(0,-0.2),"Easy to \\a{overline} or " + "\\u{underline}"); + gr->Puts(mglPoint(0,-0.6),"Easy to change indexes ^{up} _{down} @{center}"); + gr->Puts(mglPoint(0,-1),"It parse TeX: \\int \\alpha \\cdot " + "\\sqrt3{sin(\\pi x)^2 + \\gamma_{i_k}} dx"); + if(mini) return; + + gr->SubPlot(2,2,1,""); + gr->Puts(mglPoint(0,0.5), "\\sqrt{\\frac{\\alpha^{\\gamma^2}+\\overset 1{\\big\\infty}}{\\sqrt3{2+b}}}", "@", -2); + gr->Puts(mglPoint(0,-0.5),"Text can be printed\non several lines"); + + gr->SubPlot(2,2,2,""); + mglData y; mgls_prepare1d(&y); + gr->Box(); gr->Plot(y.SubData(-1,0)); + gr->Text(y,"This is very very long string drawn along a curve","k"); + gr->Text(y,"Another string drawn above a curve","Tr"); + + gr->SubPlot(2,2,3,""); + gr->Line(mglPoint(-1,-1),mglPoint(1,-1),"rA"); gr->Puts(mglPoint(0,-1),mglPoint(1,-1),"Horizontal"); + gr->Line(mglPoint(-1,-1),mglPoint(1,1),"rA"); gr->Puts(mglPoint(0,0),mglPoint(1,1),"At angle","@"); + gr->Line(mglPoint(-1,-1),mglPoint(-1,1),"rA"); gr->Puts(mglPoint(-1,0),mglPoint(-1,1),"Vertical"); +} +//----------------------------------------------------------------------------- +const char *mmgl_fonts="define d 0.25\nloadfont 'STIX':text 0 1.1 'default font (STIX)'\nloadfont 'adventor':text 0 1.1-d 'adventor font'\n" +"loadfont 'bonum':text 0 1.1-2*d 'bonum font'\nloadfont 'chorus':text 0 1.1-3*d 'chorus font'\nloadfont 'cursor':text 0 1.1-4*d 'cursor font'\n" +"loadfont 'heros':text 0 1.1-5*d 'heros font'\nloadfont 'heroscn':text 0 1.1-6*d 'heroscn font'\nloadfont 'pagella':text 0 1.1-7*d 'pagella font'\n" +"loadfont 'schola':text 0 1.1-8*d 'schola font'\nloadfont 'termes':text 0 1.1-9*d 'termes font'\nloadfont ''\n"; +void smgl_fonts(mglGraph *gr) // font typefaces +{ + double h=1.1, d=0.25; + gr->LoadFont("STIX"); gr->Puts(mglPoint(0,h), "default font (STIX)"); + gr->LoadFont("adventor"); gr->Puts(mglPoint(0,h-d), "adventor font"); + gr->LoadFont("bonum"); gr->Puts(mglPoint(0,h-2*d), "bonum font"); + gr->LoadFont("chorus"); gr->Puts(mglPoint(0,h-3*d), "chorus font"); + gr->LoadFont("cursor"); gr->Puts(mglPoint(0,h-4*d), "cursor font"); + gr->LoadFont("heros"); gr->Puts(mglPoint(0,h-5*d), "heros font"); + gr->LoadFont("heroscn"); gr->Puts(mglPoint(0,h-6*d), "heroscn font"); + gr->LoadFont("pagella"); gr->Puts(mglPoint(0,h-7*d), "pagella font"); + gr->LoadFont("schola"); gr->Puts(mglPoint(0,h-8*d), "schola font"); + gr->LoadFont("termes"); gr->Puts(mglPoint(0,h-9*d), "termes font"); + gr->LoadFont(""); +} +//----------------------------------------------------------------------------- +const char *mmgl_bars="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 0\n" +"subplot 3 2 0 '':title 'Bars plot (default)':box:bars ys\nsubplot 3 2 1 '':title '2 colors':box:bars ys 'cbgGyr'\n" +"subplot 3 2 4 '':title '\"\\#\" style':box:bars ys '#'\n" +"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 3 2 5:title '3d variant':rotate 50 60:box:bars xc yc z 'r'\n" +"ranges -1 1 -3 3:subplot 3 2 2 '':title '\"a\" style':box:bars ys 'a'\nsubplot 3 2 3 '':title '\"f\" style':box:bars ys 'f'\n"; +void smgl_bars(mglGraph *gr) +{ + mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); + gr->SetOrigin(0,0,0); + if(!mini) { gr->SubPlot(3,2,0,""); gr->Title("Bars plot (default)"); } + gr->Box(); gr->Bars(ys); + if(mini) return; + gr->SubPlot(3,2,1,""); gr->Title("2 colors"); gr->Box(); gr->Bars(ys,"cbgGyr"); + gr->SubPlot(3,2,4,""); gr->Title("'\\#' style"); gr->Box(); gr->Bars(ys,"#"); + gr->SubPlot(3,2,5); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); + mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); + yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); + gr->Bars(xc,yc,z,"r"); + gr->SetRanges(-1,1,-3,3); // increase range since summation can exceed [-1,1] + gr->SubPlot(3,2,2,""); gr->Title("'a' style"); gr->Box(); gr->Bars(ys,"a"); + gr->SubPlot(3,2,3,""); gr->Title("'f' style"); gr->Box(); gr->Bars(ys,"f"); +} +//----------------------------------------------------------------------------- +const char *mmgl_barh="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 0\n" +"subplot 2 2 0 '':title 'Barh plot (default)':box:barh ys\nsubplot 2 2 1 '':title '2 colors':box:barh ys 'cbgGyr'\n" +"ranges -3 3 -1 1:subplot 2 2 2 '':title '\"a\" style':box:barh ys 'a'\nsubplot 2 2 3 '': title '\"f\" style':box:barh ys 'f'\n"; +void smgl_barh(mglGraph *gr) +{ + mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); + gr->SetOrigin(0,0,0); + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Barh plot (default)"); } + gr->Box(); gr->Barh(ys); + if(mini) return; + gr->SubPlot(2,2,1,""); gr->Title("2 colors"); gr->Box(); gr->Barh(ys,"cbgGyr"); + gr->SetRanges(-3,3,-1,1); // increase range since summation can exceed [-1,1] + gr->SubPlot(2,2,2,""); gr->Title("'a' style"); gr->Box(); gr->Barh(ys,"a"); + gr->SubPlot(2,2,3,""); gr->Title("'f' style"); gr->Box(); gr->Barh(ys,"f"); +} +//----------------------------------------------------------------------------- +const char *mmgl_area="call 'prepare1d'\norigin 0 0 0\nsubplot 2 2 0 '':title 'Area plot (default)':box:area y\n" +"subplot 2 2 1 '':title '2 colors':box:area y 'cbgGyr'\nsubplot 2 2 2 '':title '\"!\" style':box:area y '!'\n" +"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 3:title '3d variant':rotate 50 60:box:area xc yc z 'r'\n"; +void smgl_area(mglGraph *gr) +{ + mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Area plot (default)"); } + gr->Box(); gr->Area(y); + if(mini) return; + gr->SubPlot(2,2,1,""); gr->Title("2 colors"); gr->Box(); gr->Area(y,"cbgGyr"); + gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Area(y,"!"); + gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); + mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); + yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); + gr->Area(xc,yc,z,"r"); +} +//----------------------------------------------------------------------------- +const char *mmgl_plot="call 'prepare1d'\nsubplot 2 2 0 '':title 'Plot plot (default)':box:plot y\n" +"subplot 2 2 2 '':title ''!' style; 'rgb' palette':box:plot y 'o!rgb'\nsubplot 2 2 3 '':title 'just markers':box:plot y ' +'\n" +"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:plot xc yc z 'rs'\n"; +void smgl_plot(mglGraph *gr) +{ + mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Plot plot (default)"); } + gr->Box(); gr->Plot(y); + if(mini) return; + gr->SubPlot(2,2,2,""); gr->Title("'!' style; 'rgb' palette"); gr->Box(); gr->Plot(y,"o!rgb"); + gr->SubPlot(2,2,3,""); gr->Title("just markers"); gr->Box(); gr->Plot(y," +"); + gr->SubPlot(2,2,1); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); + mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); + yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); + gr->Plot(xc,yc,z,"rs"); +} +//----------------------------------------------------------------------------- +const char *mmgl_tens="call 'prepare1d'\nsubplot 2 2 0 '':title 'Tens plot (default)':box:tens y(:,0) y(:,1)\n" +"subplot 2 2 2 '':title '" " style':box:tens y(:,0) y(:,1) 'o '\n" +"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\n" +"subplot 2 2 1:title '3d variant':rotate 50 60:box:tens xc yc z z 's'\n"; +void smgl_tens(mglGraph *gr) +{ + mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Tens plot (default)"); } + gr->Box(); gr->Tens(y.SubData(-1,0), y.SubData(-1,1)); + if(mini) return; + gr->SubPlot(2,2,2,""); gr->Title("' ' style"); gr->Box(); gr->Tens(y.SubData(-1,0), y.SubData(-1,1),"o "); + gr->SubPlot(2,2,1); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); + mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); + yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); + gr->Tens(xc,yc,z,z,"s"); +} +//----------------------------------------------------------------------------- +const char *mmgl_region="call 'prepare1d'\ncopy y1 y(:,1):copy y2 y(:,2)\n" +"subplot 2 2 0 '':title 'Region plot (default)':box:region y1 y2:plot y1 'k2':plot y2 'k2'\n" +"subplot 2 2 1 '':title '2 colors':box:region y1 y2 'yr':plot y1 'k2':plot y2 'k2'\n" +"subplot 2 2 2 '':title '\"!\" style':box:region y1 y2 '!':plot y1 'k2':plot y2 'k2'\n" +"subplot 2 2 3 '':title '\"i\" style':box:region y1 y2 'ir':plot y1 'k2':plot y2 'k2'\n"; +void smgl_region(mglGraph *gr) +{ + mglData y; mgls_prepare1d(&y); + mglData y1 = y.SubData(-1,1), y2 = y.SubData(-1,2); gr->SetOrigin(0,0,0); + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Region plot (default)"); } + gr->Box(); gr->Region(y1,y2); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); + if(mini) return; + gr->SubPlot(2,2,1,""); gr->Title("2 colors"); gr->Box(); gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); + gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Region(y1,y2,"!"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); + gr->SubPlot(2,2,3,""); gr->Title("'i' style"); gr->Box(); gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); +} +//----------------------------------------------------------------------------- +const char *mmgl_stem="call 'prepare1d'\norigin 0 0 0:subplot 2 2 0 '':title 'Stem plot (default)':box:stem y\n" +"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:stem xc yc z 'rx'\n" +"subplot 2 2 2 '':title '\"!\" style':box:stem y 'o!rgb'\n"; +void smgl_stem(mglGraph *gr) +{ + mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); + mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); + yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Stem plot (default)"); } + gr->Box(); gr->Stem(y); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("3d variant"); gr->Rotate(50,60); + gr->Box(); gr->Stem(xc,yc,z,"rx"); + gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Stem(y,"o!rgb"); +} +//----------------------------------------------------------------------------- +const char *mmgl_step="call 'prepare1d'\norigin 0 0 0:subplot 2 2 0 '':title 'Step plot (default)':box:step y\n" +"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:step xc yc z 'r'\n" +"subplot 2 2 2 '':title '\"!\" style':box:step y 's!rgb'\n"; +void smgl_step(mglGraph *gr) +{ + mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); + mglData yc(30), xc(30), z(30); z.Modify("2*x-1"); + yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Step plot (default)"); } + gr->Box(); gr->Step(y); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("3d variant"); gr->Rotate(50,60); + gr->Box(); gr->Step(xc,yc,z,"r"); + gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Step(y,"s!rgb"); +} +//----------------------------------------------------------------------------- +const char *mmgl_boxplot="new a 10 7 '(2*rnd-1)^3/2'\nsubplot 1 1 0 '':title 'Boxplot plot':box:boxplot a"; +void smgl_boxplot(mglGraph *gr) // flow threads and density plot +{ + mglData a(10,7); a.Modify("(2*rnd-1)^3/2"); + if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Boxplot plot"); } + gr->Box(); gr->BoxPlot(a); +} +//----------------------------------------------------------------------------- +const char *mmgl_type0="call 'prepare2d'\nalpha on:light on:transptype 0:clf\nsubplot 2 2 0:rotate 50 60:surf a:box\n" +"subplot 2 2 1:rotate 50 60:dens a:box\nsubplot 2 2 2:rotate 50 60:cont a:box\n" +"subplot 2 2 3:rotate 50 60:axial a:box"; +void smgl_type0(mglGraph *gr) // TranspType = 0 +{ + gr->Alpha(true); gr->Light(true); + mglData a; mgls_prepare2d(&a); + gr->SetTranspType(0); gr->Clf(); + gr->SubPlot(2,2,0); gr->Rotate(50,60); gr->Surf(a); gr->Box(); + gr->SubPlot(2,2,1); gr->Rotate(50,60); gr->Dens(a); gr->Box(); + gr->SubPlot(2,2,2); gr->Rotate(50,60); gr->Cont(a); gr->Box(); + gr->SubPlot(2,2,3); gr->Rotate(50,60); gr->Axial(a); gr->Box(); +} +//----------------------------------------------------------------------------- +const char *mmgl_type1="call 'prepare2d'\nalpha on:light on:transptype 1:clf\nsubplot 2 2 0:rotate 50 60:surf a:box\n" +"subplot 2 2 1:rotate 50 60:dens a:box\nsubplot 2 2 2:rotate 50 60:cont a:box\n" +"subplot 2 2 3:rotate 50 60:axial a:box"; +void smgl_type1(mglGraph *gr) // TranspType = 1 +{ + gr->Alpha(true); gr->Light(true); + mglData a; mgls_prepare2d(&a); + gr->SetTranspType(1); gr->Clf(); + gr->SubPlot(2,2,0); gr->Rotate(50,60); gr->Surf(a); gr->Box(); + gr->SubPlot(2,2,1); gr->Rotate(50,60); gr->Dens(a); gr->Box(); + gr->SubPlot(2,2,2); gr->Rotate(50,60); gr->Cont(a); gr->Box(); + gr->SubPlot(2,2,3); gr->Rotate(50,60); gr->Axial(a); gr->Box(); +} +//----------------------------------------------------------------------------- +const char *mmgl_type2="call 'prepare2d'\nalpha on:light on:transptype 2:clf\nsubplot 2 2 0:rotate 50 60:surf a:box\n" +"subplot 2 2 1:rotate 50 60:dens a:box\nsubplot 2 2 2:rotate 50 60:cont a:box\n" +"subplot 2 2 3:rotate 50 60:axial a:box"; +void smgl_type2(mglGraph *gr) // TranspType = 2 +{ + gr->Alpha(true); gr->Light(true); + mglData a; mgls_prepare2d(&a); + gr->SetTranspType(2); gr->Clf(); + gr->SubPlot(2,2,0); gr->Rotate(50,60); gr->Surf(a); gr->Box(); + gr->SubPlot(2,2,1); gr->Rotate(50,60); gr->Dens(a); gr->Box(); + gr->SubPlot(2,2,2); gr->Rotate(50,60); gr->Cont(a); gr->Box(); + gr->SubPlot(2,2,3); gr->Rotate(50,60); gr->Axial(a); gr->Box(); +} +//----------------------------------------------------------------------------- +const char *mmgl_molecule="alpha on:light on\n" +"subplot 2 2 0 '':title 'Methane, CH_4':rotate 60 120\n" +"sphere 0 0 0 0.25 'k':drop 0 0 0 0 0 1 0.35 'h' 1 2:sphere 0 0 0.7 0.25 'g'\n" +"drop 0 0 0 -0.94 0 -0.33 0.35 'h' 1 2:sphere -0.66 0 -0.23 0.25 'g'\n" +"drop 0 0 0 0.47 0.82 -0.33 0.35 'h' 1 2:sphere 0.33 0.57 -0.23 0.25 'g'\n" +"drop 0 0 0 0.47 -0.82 -0.33 0.35 'h' 1 2:sphere 0.33 -0.57 -0.23 0.25 'g'\n" +"subplot 2 2 1 '':title 'Water, H{_2}O':rotate 60 100\n" +"sphere 0 0 0 0.25 'r':drop 0 0 0 0.3 0.5 0 0.3 'm' 1 2:sphere 0.3 0.5 0 0.25 'g'\n" +"drop 0 0 0 0.3 -0.5 0 0.3 'm' 1 2:sphere 0.3 -0.5 0 0.25 'g'\n" +"subplot 2 2 2 '':title 'Oxygen, O_2':rotate 60 120\n" +"drop 0 0.5 0 0 -0.3 0 0.3 'm' 1 2:sphere 0 0.5 0 0.25 'r'\n" +"drop 0 -0.5 0 0 0.3 0 0.3 'm' 1 2:sphere 0 -0.5 0 0.25 'r'\n" +"subplot 2 2 3 '':title 'Ammonia, NH_3':rotate 60 120\n" +"sphere 0 0 0 0.25 'b':drop 0 0 0 0.33 0.57 0 0.32 'n' 1 2\n" +"sphere 0.33 0.57 0 0.25 'g':drop 0 0 0 0.33 -0.57 0 0.32 'n' 1 2\n" +"sphere 0.33 -0.57 0 0.25 'g':drop 0 0 0 -0.65 0 0 0.32 'n' 1 2\n" +"sphere -0.65 0 0 0.25 'g'\n"; +void smgl_molecule(mglGraph *gr) // example of moleculas +{ + gr->VertexColor(false); gr->Compression(false); // per-vertex colors and compression are detrimental to transparency + gr->DoubleSided(false); // we do not get into atoms, while rendering internal surface has negative impact on trasparency + gr->Alpha(true); gr->Light(true); + + gr->SubPlot(2,2,0,""); gr->Title("Methane, CH_4"); + gr->StartGroup("Methane"); + gr->Rotate(60,120); + gr->Sphere(mglPoint(0,0,0),0.25,"k"); + gr->Drop(mglPoint(0,0,0),mglPoint(0,0,1),0.35,"h",1,2); + gr->Sphere(mglPoint(0,0,0.7),0.25,"g"); + gr->Drop(mglPoint(0,0,0),mglPoint(-0.94,0,-0.33),0.35,"h",1,2); + gr->Sphere(mglPoint(-0.66,0,-0.23),0.25,"g"); + gr->Drop(mglPoint(0,0,0),mglPoint(0.47,0.82,-0.33),0.35,"h",1,2); + gr->Sphere(mglPoint(0.33,0.57,-0.23),0.25,"g"); + gr->Drop(mglPoint(0,0,0),mglPoint(0.47,-0.82,-0.33),0.35,"h",1,2); + gr->Sphere(mglPoint(0.33,-0.57,-0.23),0.25,"g"); + gr->EndGroup(); + + gr->SubPlot(2,2,1,""); gr->Title("Water, H_{2}O"); + gr->StartGroup("Water"); + gr->Rotate(60,100); + gr->StartGroup("Water_O"); + gr->Sphere(mglPoint(0,0,0),0.25,"r"); + gr->EndGroup(); + gr->StartGroup("Water_Bond_1"); + gr->Drop(mglPoint(0,0,0),mglPoint(0.3,0.5,0),0.3,"m",1,2); + gr->EndGroup(); + gr->StartGroup("Water_H_1"); + gr->Sphere(mglPoint(0.3,0.5,0),0.25,"g"); + gr->EndGroup(); + gr->StartGroup("Water_Bond_2"); + gr->Drop(mglPoint(0,0,0),mglPoint(0.3,-0.5,0),0.3,"m",1,2); + gr->EndGroup(); + gr->StartGroup("Water_H_2"); + gr->Sphere(mglPoint(0.3,-0.5,0),0.25,"g"); + gr->EndGroup(); + gr->EndGroup(); + + gr->SubPlot(2,2,2,""); gr->Title("Oxygen, O_2"); + gr->StartGroup("Oxygen"); + gr->Rotate(60,120); + gr->Drop(mglPoint(0,0.5,0),mglPoint(0,-0.3,0),0.3,"m",1,2); + gr->Sphere(mglPoint(0,0.5,0),0.25,"r"); + gr->Drop(mglPoint(0,-0.5,0),mglPoint(0,0.3,0),0.3,"m",1,2); + gr->Sphere(mglPoint(0,-0.5,0),0.25,"r"); + gr->EndGroup(); + + gr->SubPlot(2,2,3,""); gr->Title("Ammonia, NH_3"); + gr->StartGroup("Ammonia"); + gr->Rotate(60,120); + gr->Sphere(mglPoint(0,0,0),0.25,"b"); + gr->Drop(mglPoint(0,0,0),mglPoint(0.33,0.57,0),0.32,"n",1,2); + gr->Sphere(mglPoint(0.33,0.57,0),0.25,"g"); + gr->Drop(mglPoint(0,0,0),mglPoint(0.33,-0.57,0),0.32,"n",1,2); + gr->Sphere(mglPoint(0.33,-0.57,0),0.25,"g"); + gr->Drop(mglPoint(0,0,0),mglPoint(-0.65,0,0),0.32,"n",1,2); + gr->Sphere(mglPoint(-0.65,0,0),0.25,"g"); + gr->EndGroup(); + gr->DoubleSided( true ); // put back +} +//----------------------------------------------------------------------------- +const char *mmgl_error="call 'prepare1d'\nnew y 50 '0.7*sin(pi*x-pi) + 0.5*cos(3*pi*(x+1)/2) + 0.2*sin(pi*(x+1)/2)'\n" +"new x0 10 'x + 0.1*rnd-0.05':new ex 10 '0.1':new ey 10 '0.2'\n" +"new y0 10 '0.7*sin(pi*x-pi) + 0.5*cos(3*pi*(x+1)/2) + 0.2*sin(pi*(x+1)/2) + 0.2*rnd-0.1'\n" +"subplot 2 2 0 '':title 'Error plot (default)':box:plot y:error x0 y0 ex ey 'k'\n" +"subplot 2 2 1 '':title '\"!\" style; no e_x':box:plot y:error x0 y0 ey 'o!rgb'\n" +"subplot 2 2 2 '':title '\"\\@\" style':alpha on:box:plot y:error x0 y0 ex ey '@'; alpha 0.5\n" +"subplot 2 2 3:title '3d variant':rotate 50 60:axis\n" +"for $1 0 9\n\terrbox 2*rnd-1 2*rnd-1 2*rnd-1 0.2 0.2 0.2 'bo'\nnext\n"; +void smgl_error(mglGraph *gr) +{ + mglData y; mgls_prepare1d(&y); + mglData x0(10), y0(10), ex0(10), ey0(10); + double x; + for(int i=0;i<10;i++) + { + x = i/9.; + x0.a[i] = 2*x-1 + 0.1*mgl_rnd()-0.05; + y0.a[i] = 0.7*sin(2*M_PI*x)+0.5*cos(3*M_PI*x)+0.2*sin(M_PI*x)+0.2*mgl_rnd()-0.1; + ey0.a[i]=0.2; ex0.a[i]=0.1; + } + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Error plot (default)"); } + gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Error(x0,y0,ex0,ey0,"ko"); + if(mini) return; + gr->SubPlot(2,2,1,""); gr->Title("'!' style; no e_x"); + gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Error(x0,y0,ey0,"o!rgb"); + gr->SubPlot(2,2,2,""); gr->Title("'\\@' style"); gr->Alpha(true); + gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Error(x0,y0,ex0,ey0,"@","alpha 0.5"); + gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); + for(int i=0;i<10;i++) + gr->Error(mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1,2*mgl_rnd()-1), mglPoint(0.2,0.2,0.2),"bo"); + gr->Axis(); +} +//----------------------------------------------------------------------------- +const char *mmgl_chart="new ch 7 2 'rnd+0.1':light on\n" +"subplot 2 2 0:title 'Chart plot (default)':rotate 50 60:box:chart ch\n" +"subplot 2 2 1:title '\"\\#\" style':rotate 50 60:box:chart ch '#'\n" +"subplot 2 2 2:title 'Pie chart; \" \" color':rotate 50 60:\n" +"axis '(y+1)/2*cos(pi*x)' '(y+1)/2*sin(pi*x)' '':box:chart ch 'bgr cmy#'\n" +"subplot 2 2 3:title 'Ring chart; \" \" color':rotate 50 60:\n" +"axis '(y+2)/3*cos(pi*x)' '(y+2)/3*sin(pi*x)' '':box:chart ch 'bgr cmy#'\n"; +void smgl_chart(mglGraph *gr) +{ + mglData ch(7,2); for(int i=0;i<7*2;i++) ch.a[i]=mgl_rnd()+0.1; + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Chart plot (default)"); } + gr->Light(true); gr->Rotate(50,60); gr->Box(); gr->Chart(ch); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("'\\#' style"); + gr->Rotate(50,60); gr->Box(); gr->Chart(ch,"#"); + gr->SubPlot(2,2,2); gr->Title("Pie chart; ' ' color"); + gr->SetFunc("(y+1)/2*cos(pi*x)","(y+1)/2*sin(pi*x)",""); + gr->Rotate(50,60); gr->Box(); gr->Chart(ch,"bgr cmy#"); + gr->SubPlot(2,2,3); gr->Title("Ring chart; ' ' color"); + gr->SetFunc("(y+2)/3*cos(pi*x)","(y+2)/3*sin(pi*x)",""); + gr->Rotate(50,60); gr->Box(); gr->Chart(ch,"bgr cmy#"); +} +//----------------------------------------------------------------------------- +const char *mmgl_mark="call 'prepare1d'\nsubplot 1 1 0 '':title 'Mark plot (default)':box:mark y y1 's'\n"; +void smgl_mark(mglGraph *gr) +{ + mglData y,y1; mgls_prepare1d(&y,&y1); + if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Mark plot (default)"); } + gr->Box(); gr->Mark(y,y1,"s"); +} +//----------------------------------------------------------------------------- +const char *mmgl_radar="new yr 10 3 '0.4*sin(pi*(x+1.5+y/2)+0.1*rnd)'\n" +"subplot 1 1 0 '':title 'Radar plot (with grid, \"\\#\")':radar yr '#'\n"; +void smgl_radar(mglGraph *gr) +{ + mglData yr(10,3); yr.Modify("0.4*sin(pi*(2*x+y))+0.1*rnd"); + if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Radar plot (with grid, '\\#')"); } + gr->Radar(yr,"#"); +} +//----------------------------------------------------------------------------- +const char *mmgl_candle="new y 30 'sin(pi*x/2)^2':copy y1 y/2:copy y2 (y+1)/2\n" +"subplot 1 1 0 '':title 'Candle plot (default)'\nyrange 0 1:box:candle y y1 y2\n"; +void smgl_candle(mglGraph *gr) +{ + mglData y(30); gr->Fill(y,"sin(pi*x/2)^2"); + mglData y1(30); gr->Fill(y1,"v/2",y); + mglData y2(30); gr->Fill(y2,"(1+v)/2",y); + if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Candle plot (default)"); } + gr->SetRange('y',0,1); gr->Box(); gr->Candle(y,y1,y2); +} +//----------------------------------------------------------------------------- +const char *mmgl_textmark="call 'prepare1d'\nsubplot 1 1 0 '':title 'TextMark plot (default)':box:textmark y y1 '\\gamma' 'r'\n"; +void smgl_textmark(mglGraph *gr) +{ + mglData y,y1; mgls_prepare1d(&y,&y1); + if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("TextMark plot (default)"); } + gr->Box(); gr->TextMark(y,y1,"\\gamma","r"); +} +//----------------------------------------------------------------------------- +const char *mmgl_tube="call 'prepare1d'\nlight on\n" +"new yc 50 'sin(pi*x)':new xc 50 'cos(pi*x)':new z 50 'x':divto y1 20\n" +"subplot 2 2 0 '':title 'Tube plot (default)':box:tube y 0.05\n" +"subplot 2 2 1 '':title 'variable radius':box:tube y y1\n" +"subplot 2 2 2 '':title '\"\\#\" style':box:tube y 0.05 '#'\n" +"subplot 2 2 3:title '3d variant':rotate 50 60:box:tube xc yc z y2 'r'\n"; +void smgl_tube(mglGraph *gr) +{ + mglData y,y1,y2; mgls_prepare1d(&y,&y1,&y2); y1/=20; + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Tube plot (default)"); } + gr->Light(true); gr->Box(); gr->Tube(y,0.05); + if(mini) return; + gr->SubPlot(2,2,1,""); gr->Title("variable radius"); gr->Box(); gr->Tube(y,y1); + gr->SubPlot(2,2,2,""); gr->Title("'\\#' style"); gr->Box(); gr->Tube(y,0.05,"#"); + mglData yc(50), xc(50), z(50); z.Modify("2*x-1"); + yc.Modify("sin(pi*(2*x-1))"); xc.Modify("cos(pi*2*x-pi)"); + gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); gr->Box(); gr->Tube(xc,yc,z,y2,"r"); +} +//----------------------------------------------------------------------------- +const char *mmgl_tape="call 'prepare1d'\nnew yc 50 'sin(pi*x)':new xc 50 'cos(pi*x)':new z 50 'x'\n" +"subplot 2 2 0 '':title 'Tape plot (default)':box:tape y:plot y 'k'\n" +"subplot 2 2 1:title '3d variant, 2 colors':rotate 50 60:light on\n" +"box:plot xc yc z 'k':tape xc yc z 'rg'\n" +"subplot 2 2 2:title '3d variant, x only':rotate 50 60\n" +"box:plot xc yc z 'k':tape xc yc z 'xr':tape xc yc z 'xr#'\n" +"subplot 2 2 3:title '3d variant, z only':rotate 50 60\n" +"box:plot xc yc z 'k':tape xc yc z 'zg':tape xc yc z 'zg#'\n"; +void smgl_tape(mglGraph *gr) +{ + mglData y; mgls_prepare1d(&y); + mglData xc(50), yc(50), z(50); + yc.Modify("sin(pi*(2*x-1))"); + xc.Modify("cos(pi*2*x-pi)"); z.Fill(-1,1); + if(!mini) { gr->SubPlot(2,2,0,""); gr->Title("Tape plot (default)"); } + gr->Box(); gr->Tape(y); gr->Plot(y,"k"); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("3d variant, 2 colors"); gr->Rotate(50,60); gr->Light(true); + gr->Box(); gr->Plot(xc,yc,z,"k"); gr->Tape(xc,yc,z,"rg"); + gr->SubPlot(2,2,2); gr->Title("3d variant, x only"); gr->Rotate(50,60); + gr->Box(); gr->Plot(xc,yc,z,"k"); gr->Tape(xc,yc,z,"xr"); gr->Tape(xc,yc,z,"xr#"); + gr->SubPlot(2,2,3); gr->Title("3d variant, z only"); gr->Rotate(50,60); + gr->Box(); gr->Plot(xc,yc,z,"k"); gr->Tape(xc,yc,z,"zg"); gr->Tape(xc,yc,z,"zg#"); +} +//----------------------------------------------------------------------------- +const char *mmgl_fog="call 'prepare2d'\ntitle 'Fog sample':rotate 50 60:light on:fog 1\nbox:surf a\n"; +void smgl_fog(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + if(!mini) gr->Title("Fog sample"); + gr->Light(true); gr->Rotate(50,60); gr->Fog(1); gr->Box(); + gr->Surf(a); +} +//----------------------------------------------------------------------------- +const char *mmgl_map="new a 50 40 'x':new b 50 40 'y':zrange -2 2:text 0 0 '\\to'\n" +"subplot 2 1 0:text 0 1.1 '\\{x, y\\}' '' -2:box:map a b 'brgk' 0 0\n" +"subplot 2 1 1:text 0 1.1 '\\{\\frac{x^3+y^3}{2}, \\frac{x-y}{2}\\}' '' -2\n" +"box:fill a '(x^3+y^3)/2':fill b '(x-y)/2':map a b 'brgk' 0 0\n"; +void smgl_map(mglGraph *gr) // example of mapping +{ + mglData a(50, 40), b(50, 40); + gr->Puts(mglPoint(0, 0), "\\to", ":C", -1.4); + gr->SetRanges(-1,1,-1,1,-2,2); + + gr->SubPlot(2, 1, 0); + gr->Fill(a,"x"); gr->Fill(b,"y"); + gr->Puts(mglPoint(0, 1.1), "\\{x, y\\}", ":C", -2); gr->Box(); + gr->Map(a, b, "brgk"); + + gr->SubPlot(2, 1, 1); + gr->Fill(a,"(x^3+y^3)/2"); gr->Fill(b,"(x-y)/2"); + gr->Puts(mglPoint(0, 1.1), "\\{\\frac{x^3+y^3}{2}, \\frac{x-y}{2}\\}", ":C", -2); + gr->Box(); + gr->Map(a, b, "brgk"); +} +//----------------------------------------------------------------------------- +const char *mmgl_stfa="new a 2000:new b 2000\nfill a 'cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+\\\n" +"cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)'\n" +"subplot 1 2 0 '<_':title 'Initial signal':plot a:axis:xlabel '\\i t'\n" +"subplot 1 2 1 '<_':title 'STFA plot':stfa a b 64:axis:ylabel '\\omega' 0:xlabel '\\i t'\n"; +void smgl_stfa(mglGraph *gr) // STFA sample +{ + mglData a(2000), b(2000); + gr->Fill(a,"cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+\ + cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)"); + gr->SubPlot(1, 2, 0,"<_"); gr->Title("Initial signal"); + gr->Plot(a); + gr->Axis(); + gr->Label('x', "\\i t"); + + gr->SubPlot(1, 2, 1,"<_"); gr->Title("STFA plot"); + gr->STFA(a, b, 64); + gr->Axis(); + gr->Label('x', "\\i t"); + gr->Label('y', "\\omega", 0); +} +//----------------------------------------------------------------------------- +const char *mmgl_qo2d="define $1 'p^2+q^2-x-1+i*0.5*(y+x)*(y>-x)'\n" +"subplot 1 1 0 '<_':title 'Beam and ray tracing'\n" +"ray r $1 -0.7 -1 0 0 0.5 0 0.02 2:plot r(0) r(1) 'k'\naxis:xlabel '\\i x':ylabel '\\i z'\n" +"new re 128 'exp(-48*x^2)':new im 128\nnew xx 1:new yy 1\nqo2d a $1 re im r 1 30 xx yy\n" +"crange 0 1:dens xx yy a 'wyrRk':fplot '-x' 'k|'\n" +"text 0 0.85 'absorption: (x+y)/2 for x+y>0'\ntext 0.7 -0.05 'central ray'"; +void smgl_qo2d(mglGraph *gr) +{ + mglData r, xx, yy, a, im(128), re(128); + const char *ham = "p^2+q^2-x-1+i*0.5*(y+x)*(y>-x)"; + r = mglRay(ham, mglPoint(-0.7, -1), mglPoint(0, 0.5), 0.02, 2); + if(!mini) {gr->SubPlot(1,1,0,"<_"); gr->Title("Beam and ray tracing");} + gr->Plot(r.SubData(0), r.SubData(1), "k"); + gr->Axis(); gr->Label('x', "\\i x"); gr->Label('y', "\\i y"); + // now start beam tracing + gr->Fill(re,"exp(-48*x^2)"); + a = mglQO2d(ham, re, im, r, xx, yy, 1, 30); + gr->SetRange('c',0, 1); + gr->Dens(xx, yy, a, "wyrRk"); + gr->FPlot("-x", "k|"); + gr->Puts(mglPoint(0, 0.85), "absorption: (x+y)/2 for x+y>0"); + gr->Puts(mglPoint(0.7, -0.05), "central ray"); +} +//----------------------------------------------------------------------------- +const char *mmgl_pde="new re 128 'exp(-48*(x+0.7)^2)':new im 128\n" +"pde a 'p^2+q^2-x-1+i*0.5*(z+x)*(z>-x)' re im 0.01 30\ntranspose a\n" +"subplot 1 1 0 '<_':title 'PDE solver'\n" +"axis:xlabel '\\i x':ylabel '\\i z'\ncrange 0 1:dens a 'wyrRk'\n" +"fplot '-x' 'k|'\n" +"text 0 0.95 'Equation: ik_0\\partial_zu + \\Delta u + x\\cdot u + i \\frac{x+z}{2}\\cdot u = 0\\n{}absorption: (x+z)/2 for x+z>0'"; +void smgl_pde(mglGraph *gr) // PDE sample +{ + mglData a,re(128),im(128); + gr->Fill(re,"exp(-48*(x+0.7)^2)"); + a = gr->PDE("p^2+q^2-x-1+i*0.5*(z+x)*(z>-x)", re, im, 0.01, 30); + a.Transpose("yxz"); + if(!mini) {gr->SubPlot(1,1,0,"<_"); gr->Title("PDE solver"); } + gr->SetRange('c',0,1); gr->Dens(a,"wyrRk"); + gr->Axis(); gr->Label('x', "\\i x"); gr->Label('y', "\\i z"); + gr->FPlot("-x", "k|"); + gr->Puts(mglPoint(0, 0.95), "Equation: ik_0\\partial_zu + \\Delta u + x\\cdot u + i \\frac{x+z}{2}\\cdot u = 0\nabsorption: (x+z)/2 for x+z>0"); +} +//----------------------------------------------------------------------------- +const char *mmgl_conta="call 'prepare3d'\ntitle 'Cont3 sample':rotate 50 60:box\ncont3 c 'x':cont3 c:cont3 c 'z'"; +void smgl_conta(mglGraph *gr) +{ + mglData c; mgls_prepare3d(&c); + if(!mini) gr->Title("Cont3 sample"); + gr->Rotate(50,60); gr->Box(); + gr->Cont3(c,"x"); gr->Cont3(c); gr->Cont3(c,"z"); +} +//----------------------------------------------------------------------------- +const char *mmgl_contfa="call 'prepare3d'\ntitle 'Cont3 sample':rotate 50 60:box:light on\n" +"contf3 c 'x':contf3 c:contf3 c 'z'\ncont3 c 'xk':cont3 c 'k':cont3 c 'zk'\n"; +void smgl_contfa(mglGraph *gr) +{ + mglData c; mgls_prepare3d(&c); + if(!mini) gr->Title("ContF3 sample"); + gr->Rotate(50,60); gr->Light(true); gr->Box(); + gr->ContF3(c,"x"); gr->ContF3(c); gr->ContF3(c,"z"); + gr->Cont3(c,"kx"); gr->Cont3(c,"k"); gr->Cont3(c,"kz"); +} +//----------------------------------------------------------------------------- +const char *mmgl_densa="call 'prepare3d'\ntitle 'Dens3 sample':rotate 50 60:alpha on:alphadef 0.7\n" +"origin 0 0 0:box:axis '_xyz'\ndens3 c 'x':dens3 c ':y':dens3 c 'z'"; +void smgl_densa(mglGraph *gr) +{ + mglData c; mgls_prepare3d(&c); + if(!mini) gr->Title("Dens3 sample"); + gr->Rotate(50,60); gr->Alpha(true); gr->SetAlphaDef(0.7); + gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box(); + gr->Dens3(c,"x"); gr->Dens3(c); gr->Dens3(c,"z"); +} +//----------------------------------------------------------------------------- +const char *mmgl_dens_xyz="call 'prepare3d'\ntitle 'Dens[XYZ] sample':rotate 50 60:box\n" +"densx {sum c 'x'} '' -1:densy {sum c 'y'} '' 1:densz {sum c 'z'} '' -1"; +void smgl_dens_xyz(mglGraph *gr) +{ + mglData c; mgls_prepare3d(&c); + if(!mini) gr->Title("Dens[XYZ] sample"); + gr->Rotate(50,60); gr->Box(); gr->DensX(c.Sum("x"),0,-1); + gr->DensY(c.Sum("y"),0,1); gr->DensZ(c.Sum("z"),0,-1); +} +//----------------------------------------------------------------------------- +const char *mmgl_cont_xyz="call 'prepare3d'\ntitle 'Cont[XYZ] sample':rotate 50 60:box\n" +"contx {sum c 'x'} '' -1:conty {sum c 'y'} '' 1:contz {sum c 'z'} '' -1"; +void smgl_cont_xyz(mglGraph *gr) +{ + mglData c; mgls_prepare3d(&c); + if(!mini) gr->Title("Cont[XYZ] sample"); + gr->Rotate(50,60); gr->Box(); gr->ContX(c.Sum("x"),"",-1); + gr->ContY(c.Sum("y"),"",1); gr->ContZ(c.Sum("z"),"",-1); +} +//----------------------------------------------------------------------------- +const char *mmgl_contf_xyz="call 'prepare3d'\ntitle 'ContF[XYZ] sample':rotate 50 60:box\n" +"contfx {sum c 'x'} '' -1:contfy {sum c 'y'} '' 1:contfz {sum c 'z'} '' -1"; +void smgl_contf_xyz(mglGraph *gr) +{ + mglData c; mgls_prepare3d(&c); + if(!mini) gr->Title("ContF[XYZ] sample"); + gr->Rotate(50,60); gr->Box(); gr->ContFX(c.Sum("x"),"",-1); + gr->ContFY(c.Sum("y"),"",1); gr->ContFZ(c.Sum("z"),"",-1); +} +//----------------------------------------------------------------------------- +const char *mmgl_cloud="call 'prepare3d'\nsubplot 2 2 0:title 'Cloud plot':rotate 50 60:alpha on:box:cloud c 'wyrRk'\n" +"subplot 2 2 1:title '\"!\" style':rotate 50 60:box:cloud c '!wyrRk'\n" +"subplot 2 2 2:title '\".\" style':rotate 50 60:box:cloud c '.wyrRk'\n" +"subplot 2 2 3:title 'meshnum 10':rotate 50 60:box:cloud c 'wyrRk'; meshnum 10\n"; +void smgl_cloud(mglGraph *gr) +{ + mglData c; mgls_prepare3d(&c); + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Cloud plot"); } + gr->Rotate(50,60); gr->Alpha(true); + gr->Box(); gr->Cloud(c,"wyrRk"); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("'!' style"); + gr->Rotate(50,60); gr->Box(); gr->Cloud(c,"!wyrRk"); + gr->SubPlot(2,2,2); gr->Title("'.' style"); + gr->Rotate(50,60); gr->Box(); gr->Cloud(c,".wyrRk"); + gr->SubPlot(2,2,3); gr->Title("meshnum 10"); + gr->Rotate(50,60); gr->Box(); gr->Cloud(c,"wyrRk","meshnum 10"); +} +//----------------------------------------------------------------------------- +const char *mmgl_cont="call 'prepare2d'\nlist v -0.5 -0.15 0 0.15 0.5\nsubplot 2 2 0:title 'Cont plot (default)':rotate 50 60:box:cont a\n" +"subplot 2 2 1:title 'manual levels':rotate 50 60:box:cont v a\n" +"subplot 2 2 2:title '\"\\_\" style':rotate 50 60:box:cont a '_'\n" +"subplot 2 2 3 '':title '\"t\" style':box:cont a 't'\n"; +void smgl_cont(mglGraph *gr) +{ + mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5; v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15; v.a[4]=0.5; + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Cont plot (default)"); } + gr->Rotate(50,60); gr->Box(); gr->Cont(a); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("manual levels"); + gr->Rotate(50,60); gr->Box(); gr->Cont(v,a); + gr->SubPlot(2,2,2); gr->Title("'\\_' style"); + gr->Rotate(50,60); gr->Box(); gr->Cont(a,"_"); + gr->SubPlot(2,2,3,""); gr->Title("'t' style"); + gr->Box(); gr->Cont(a,"t"); +} +//----------------------------------------------------------------------------- +const char *mmgl_contf="call 'prepare2d'\nlist v -0.5 -0.15 0 0.15 0.5\n" +"new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'\n" +"subplot 2 2 0:title 'ContF plot (default)':rotate 50 60:box:contf a\n" +"subplot 2 2 1:title 'manual levels':rotate 50 60:box:contf v a\n" +"subplot 2 2 2:title '\"\\_\" style':rotate 50 60:box:contf a '_'\n" +"subplot 2 2 3:title 'several slices':rotate 50 60:box:contf a1\n"; +void smgl_contf(mglGraph *gr) +{ + mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5; + v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15; v.a[4]=0.5; + gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)"); + + if(!mini) { gr->SubPlot(2,2,0); gr->Title("ContF plot (default)"); } + gr->Rotate(50,60); gr->Box(); gr->ContF(a); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("manual levels"); + gr->Rotate(50,60); gr->Box(); gr->ContF(v,a); + gr->SubPlot(2,2,2); gr->Title("'\\_' style"); + gr->Rotate(50,60); gr->Box(); gr->ContF(a,"_"); + gr->SubPlot(2,2,3); gr->Title("several slices"); + gr->Rotate(50,60); gr->Box(); gr->ContF(a1); +} +//----------------------------------------------------------------------------- +const char *mmgl_contd="call 'prepare2d'\nlist v -0.5 -0.15 0 0.15 0.5\n" +"new a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'\n" +"subplot 2 2 0:title 'ContD plot (default)':rotate 50 60:box:contd a\n" +"subplot 2 2 1:title 'manual levels':rotate 50 60:box:contd v a\n" +"subplot 2 2 2:title '\"\\_\" style':rotate 50 60:box:contd a '_'\n" +"subplot 2 2 3:title 'several slices':rotate 50 60:box:contd a1\n"; +void smgl_contd(mglGraph *gr) +{ + mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5; + v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15; v.a[4]=0.5; + gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)"); + + if(!mini) { gr->SubPlot(2,2,0); gr->Title("ContD plot (default)"); } + gr->Rotate(50,60); gr->Box(); gr->ContD(a); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("manual levels"); + gr->Rotate(50,60); gr->Box(); gr->ContD(v,a); + gr->SubPlot(2,2,2); gr->Title("'\\_' style"); + gr->Rotate(50,60); gr->Box(); gr->ContD(a,"_"); + gr->SubPlot(2,2,3); gr->Title("several slices"); + gr->Rotate(50,60); gr->Box(); gr->ContD(a1); +} +//----------------------------------------------------------------------------- +const char *mmgl_contv="call 'prepare2d'\nlist v -0.5 -0.15 0 0.15 0.5\n" +"subplot 2 2 0:title 'ContV plot (default)':rotate 50 60:box:contv a\n" +"subplot 2 2 1:title 'manual levels':rotate 50 60:box:contv v a\n" +"subplot 2 2 2:title '\"\\_\" style':rotate 50 60:box:contv a '_'\n" +"subplot 2 2 3:title 'ContV and ContF':rotate 50 60:light on:box\ncontv a:contf a:cont a 'k'\n"; +void smgl_contv(mglGraph *gr) +{ + mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5; + v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15; v.a[4]=0.5; + if(!mini) { gr->SubPlot(2,2,0); gr->Title("ContV plot (default)"); } + gr->Rotate(50,60); gr->Box(); gr->ContV(a); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("manual levels"); + gr->Rotate(50,60); gr->Box(); gr->ContV(v,a); + gr->SubPlot(2,2,2); gr->Title("'\\_' style"); + gr->Rotate(50,60); gr->Box(); gr->ContV(a,"_"); + gr->SubPlot(2,2,3); gr->Title("ContV and ContF"); + gr->Rotate(50,60); gr->Box(); gr->Light(true); + gr->ContV(a); gr->ContF(a); gr->Cont(a,"k"); +} +//----------------------------------------------------------------------------- +const char *mmgl_torus="call 'prepare1d'\nsubplot 2 2 0:title 'Torus plot (default)':light on:rotate 50 60:box:torus y1 y2\n" +"subplot 2 2 1:title '\"x\" style':light on:rotate 50 60:box:torus y1 y2 'x'\n" +"subplot 2 2 2:title '\"z\" style':light on:rotate 50 60:box:torus y1 y2 'z'\n" +"subplot 2 2 3:title '\"\\#\" style':light on:rotate 50 60:box:torus y1 y2 '#'\n"; +void smgl_torus(mglGraph *gr) +{ + mglData y1,y2; mgls_prepare1d(0,&y1,&y2); + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Torus plot (default)"); } + gr->Light(true); gr->Rotate(50,60); gr->Box(); gr->Torus(y1,y2); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("'x' style"); gr->Rotate(50,60); gr->Box(); gr->Torus(y1,y2,"x"); + gr->SubPlot(2,2,2); gr->Title("'z' style"); gr->Rotate(50,60); gr->Box(); gr->Torus(y1,y2,"z"); + gr->SubPlot(2,2,3); gr->Title("'\\#' style"); gr->Rotate(50,60); gr->Box(); gr->Torus(y1,y2,"#"); +} +//----------------------------------------------------------------------------- +const char *mmgl_axial="call 'prepare2d'\nsubplot 2 2 0:title 'Axial plot (default)':light on:alpha on:rotate 50 60:box:axial a\n" +"subplot 2 2 1:title '\"x\" style;\".\" style':light on:rotate 50 60:box:axial a 'x.'\n" +"subplot 2 2 2:title '\"z\" style':light on:rotate 50 60:box:axial a 'z'\n" +"subplot 2 2 3:title '\"\\#\" style':light on:rotate 50 60:box:axial a '#'\n"; +void smgl_axial(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Axial plot (default)"); } + gr->Light(true); gr->Alpha(true); gr->Rotate(50,60); gr->Box(); gr->Axial(a); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("'x' style; '.'style"); gr->Rotate(50,60); gr->Box(); gr->Axial(a,"x."); + gr->SubPlot(2,2,2); gr->Title("'z' style"); gr->Rotate(50,60); gr->Box(); gr->Axial(a,"z"); + gr->SubPlot(2,2,3); gr->Title("'\\#' style"); gr->Rotate(50,60); gr->Box(); gr->Axial(a,"#"); +} +//----------------------------------------------------------------------------- +const char *mmgl_several_light="call 'prepare2d'\ntitle 'Several light sources':rotate 50 60:light on\n" +"light 1 0 1 0 'c':light 2 1 0 0 'y':light 3 0 -1 0 'm'\nbox:surf a 'h'\n"; +void smgl_several_light(mglGraph *gr) // several light sources +{ + mglData a; mgls_prepare2d(&a); + if(!mini) gr->Title("Several light sources"); + gr->Rotate(50,60); gr->Light(true); gr->AddLight(1,mglPoint(0,1,0),'c'); + gr->AddLight(2,mglPoint(1,0,0),'y'); gr->AddLight(3,mglPoint(0,-1,0),'m'); + gr->Box(); gr->Surf(a,"h"); +} +//----------------------------------------------------------------------------- +const char *mmgl_surf3="call 'prepare3d'\nlight on:alpha on\n" +"subplot 2 2 0:title 'Surf3 plot (default)'\nrotate 50 60:box:surf3 c" +"subplot 2 2 1:title '\"\\#\" style'\nrotate 50 60:box:surf3 c '#'\n" +"subplot 2 2 2:title '\".\" style'\nrotate 50 60:box:surf3 c '.'\n"; +void smgl_surf3(mglGraph *gr) +{ + mglData c; mgls_prepare3d(&c); + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Surf3 plot (default)"); } + gr->Rotate(50,60); gr->Light(true); gr->Alpha(true); + gr->Box(); gr->Surf3(c); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("'\\#' style"); + gr->Rotate(50,60); gr->Box(); gr->Surf3(c,"#"); + gr->SubPlot(2,2,2); gr->Title("'.' style"); + gr->Rotate(50,60); gr->Box(); gr->Surf3(c,"."); +} +//----------------------------------------------------------------------------- +const char *mmgl_surf3a="call 'prepare3d'\ntitle 'Surf3 plot':rotate 50 60:light on:alpha on:box:surf3a c d"; +void smgl_surf3a(mglGraph *gr) +{ + mglData c,d; mgls_prepare3d(&c,&d); + if(!mini) gr->Title("Surf3A plot"); + gr->Rotate(50,60); gr->Light(true); gr->Alpha(true); + gr->Box(); gr->Surf3A(c,d); +} +//----------------------------------------------------------------------------- +const char *mmgl_surf3c="call 'prepare3d'\ntitle 'Surf3 plot':rotate 50 60:light on:alpha on:box:surf3c c d"; +void smgl_surf3c(mglGraph *gr) +{ + mglData c,d; mgls_prepare3d(&c,&d); + if(!mini) gr->Title("Surf3C plot"); + gr->Rotate(50,60); gr->Light(true); gr->Alpha(true); + gr->Box(); gr->Surf3C(c,d); +} +//----------------------------------------------------------------------------- +const char *mmgl_cut="call 'prepare2d'\ncall 'prepare3d'\nsubplot 2 2 0:title 'Cut on (default)':rotate 50 60:light on:box:surf a; zrange -1 0.5\n" +"subplot 2 2 1:title 'Cut off':rotate 50 60:box:surf a; zrange -1 0.5; cut off\n" +"subplot 2 2 2:title 'Cut in box':rotate 50 60:box:alpha on\ncut 0 -1 -1 1 0 1.1:surf3 c\ncut 0 0 0 0 0 0\t# restore back\n" +"subplot 2 2 3:title 'Cut by formula':rotate 50 60:box\ncut '(z>(x+0.5*y-1)^2-1) & (z>(x-0.5*y-1)^2-1)':surf3 c"; +void smgl_cut(mglGraph *gr) // cutting +{ + mglData a,c,v(1); mgls_prepare2d(&a); mgls_prepare3d(&c); v.a[0]=0.5; + gr->SubPlot(2,2,0); gr->Title("Cut on (default)"); gr->Rotate(50,60); gr->Light(true); + gr->Box(); gr->Surf(a,"","zrange -1 0.5"); + gr->SubPlot(2,2,1); gr->Title("Cut off"); gr->Rotate(50,60); + gr->Box(); gr->Surf(a,"","zrange -1 0.5; cut off"); + gr->SubPlot(2,2,2); gr->Title("Cut in box"); gr->Rotate(50,60); + gr->SetCutBox(mglPoint(0,-1,-1), mglPoint(1,0,1.1)); + gr->Alpha(true); gr->Box(); gr->Surf3(c); + gr->SetCutBox(mglPoint(0), mglPoint(0)); // switch it off + gr->SubPlot(2,2,3); gr->Title("Cut by formula"); gr->Rotate(50,60); + gr->CutOff("(z>(x+0.5*y-1)^2-1) & (z>(x-0.5*y-1)^2-1)"); + gr->Box(); gr->Surf3(c); gr->CutOff(""); // switch it off +} +//----------------------------------------------------------------------------- +const char *mmgl_traj="call 'prepare1d'\nsubplot 1 1 0 '':title 'Traj plot':box:plot x1 y:traj x1 y y1 y2\n"; +void smgl_traj(mglGraph *gr) +{ + mglData x,y,y1,y2; mgls_prepare1d(&y,&y1,&y2,&x); + if(!mini) {gr->SubPlot(1,1,0,""); gr->Title("Traj plot");} + gr->Box(); gr->Plot(x,y); gr->Traj(x,y,y1,y2); +} +//----------------------------------------------------------------------------- +const char *mmgl_mesh="call 'prepare2d'\ntitle 'Mesh plot':rotate 50 60:box:mesh a\n"; +void smgl_mesh(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + if(!mini) gr->Title("Mesh plot"); + gr->Rotate(50,60); gr->Box(); gr->Mesh(a); +} +//----------------------------------------------------------------------------- +const char *mmgl_fall="call 'prepare2d'\ntitle 'Fall plot':rotate 50 60:box:fall a\n"; +void smgl_fall(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + if(!mini) gr->Title("Fall plot"); + gr->Rotate(50,60); gr->Box(); gr->Fall(a); +} +//----------------------------------------------------------------------------- +const char *mmgl_surf="call 'prepare2d'\nsubplot 2 2 0:title 'Surf plot (default)':rotate 50 60:light on:box:surf a\n" +"subplot 2 2 1:title '\"\\#\" style; meshnum 10':rotate 50 60:box:surf a '#'; meshnum 10\n" +"subplot 2 2 2:title '\".\" style':rotate 50 60:box:surf a '.'\n" +"new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'\nnew y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)'\nnew z 50 40 '0.8*cos(pi*(y+1)/2)'\n" +"subplot 2 2 3:title 'parametric form':rotate 50 60:box:surf x y z 'BbwrR'\n"; +void smgl_surf(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Surf plot (default)"); } + gr->Light(true); gr->Rotate(50,60); gr->Box(); gr->Surf(a); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("'\\#' style; meshnum 10"); + gr->Rotate(50,60); gr->Box(); gr->Surf(a,"#","meshnum 10"); + gr->SubPlot(2,2,2); gr->Title("'.' style"); + gr->Rotate(50,60); gr->Box(); gr->Surf(a,"."); + gr->SubPlot(2,2,3); gr->Title("parametric form"); + mglData x(50,40),y(50,40),z(50,40); + gr->Fill(x,"0.8*sin(pi*x)*sin(pi*(y+1)/2)"); + gr->Fill(y,"0.8*cos(pi*x)*sin(pi*(y+1)/2)"); + gr->Fill(z,"0.8*cos(pi*(y+1)/2)"); + gr->Rotate(50,60); gr->Box(); gr->Surf(x,y,z,"BbwrR"); +} +//----------------------------------------------------------------------------- +const char *mmgl_parser="title 'MGL parser sample'\ncall 'sample'\nstop\nfunc 'sample'\n" +"new dat 100 'sin(2*pi*(x+1))'\nplot dat; xrange 0 1\nbox\naxis\n" +"xlabel 'x'\nylabel 'y'\nbox\nfor $0 -1 1 0.1\nif $0<0\n" +"line 0 0 -1 $0 'r':else:line 0 0 -1 $0 'g'\nendif\nnext"; +void smgl_parser(mglGraph *gr) // example of MGL parsing +{ + gr->Title("MGL parser sample"); + double a[100]; // let a_i = sin(4*pi*x), x=0...1 + for(int i=0;i<100;i++)a[i]=sin(4*M_PI*i/99); + mglParse *parser = new mglParse; + mglData *d = parser->AddVar("dat"); + d->Set(a,100); // set data to variable + parser->Execute(gr, "plot dat; xrange 0 1\nbox\naxis"); + // you may break script at any line do something + // and continue after that + parser->Execute(gr, "xlabel 'x'\nylabel 'y'\nbox"); + // also you may use cycles or conditions in script + parser->Execute(gr, "for $0 -1 1 0.1\nif $0<0\n" + "line 0 0 -1 $0 'r':else:line 0 0 -1 $0 'g'\n" + "endif\nnext"); + delete parser; +} +//----------------------------------------------------------------------------- +const char *mmgl_belt="call 'prepare2d'\ntitle 'Belt plot':rotate 50 60:box:belt a\n"; +void smgl_belt(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + if(!mini) gr->Title("Belt plot"); + gr->Rotate(50,60); gr->Box(); gr->Belt(a); +} +//----------------------------------------------------------------------------- +const char *mmgl_dens="call 'prepare2d'\nnew a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)'\n" +"subplot 2 2 0 '':title 'Dens plot (default)':box:dens a\n" +"subplot 2 2 1:title '3d variant':rotate 50 60:box:dens a\n" +"subplot 2 2 2 '':title '\"\\#\" style; meshnum 10':box:dens a '#'; meshnum 10\n" +"subplot 2 2 3:title 'several slices':rotate 50 60:box:dens a1\n"; +void smgl_dens(mglGraph *gr) +{ + mglData a,a1(30,40,3); mgls_prepare2d(&a); + gr->Fill(a1,"0.6*sin(2*pi*x+pi*(z+1)/2)*sin(3*pi*y+pi*z) + 0.4*cos(3*pi*(x*y)+pi*(z+1)^2/2)"); + if(!mini) {gr->SubPlot(2,2,0,""); gr->Title("Dens plot (default)");} + gr->Box(); gr->Dens(a); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("3d variant"); + gr->Rotate(50,60); gr->Box(); gr->Dens(a); + gr->SubPlot(2,2,2,""); gr->Title("'\\#' style; meshnum 10"); + gr->Box(); gr->Dens(a,"#","meshnum 10"); + gr->SubPlot(2,2,3); gr->Title("several slices"); + gr->Rotate(50,60); gr->Box(); gr->Dens(a1); +} +//----------------------------------------------------------------------------- +const char *mmgl_surfc="call 'prepare2d'\ntitle 'SurfC plot':rotate 50 60:light on:box:surfc a b\n"; +void smgl_surfc(mglGraph *gr) +{ + mglData a,b; mgls_prepare2d(&a,&b); + if(!mini) gr->Title("SurfC plot"); gr->Rotate(50,60); + gr->Light(true); gr->Box(); gr->SurfC(a,b); +} +//----------------------------------------------------------------------------- +const char *mmgl_surfa="call 'prepare2d'\ntitle 'SurfA plot':rotate 50 60:light on:alpha on:box:surfa a b\n"; +void smgl_surfa(mglGraph *gr) +{ + mglData a,b; mgls_prepare2d(&a,&b); + if(!mini) gr->Title("SurfA plot"); gr->Rotate(50,60); + gr->Alpha(true); gr->Light(true); gr->Box(); gr->SurfA(a,b); +} +//----------------------------------------------------------------------------- +const char *mmgl_tile="call 'prepare2d'\ntitle 'Tile plot':rotate 50 60:box:tile a\n"; +void smgl_tile(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + if(!mini) gr->Title("Tile plot"); + gr->Rotate(40,60); gr->Box(); gr->Tile(a); +} +//----------------------------------------------------------------------------- +const char *mmgl_tiles="call 'prepare2d'\nsubplot 1 1 0 '':title 'Tiles plot':box:tiles a b\n"; +void smgl_tiles(mglGraph *gr) +{ + mglData a,b; mgls_prepare2d(&a,&b); + if(!mini) {gr->SubPlot(1,1,0,""); gr->Title("TileS plot");} + gr->Box(); gr->TileS(a,b); +} +//----------------------------------------------------------------------------- +const char *mmgl_boxs="call 'prepare2d'\norigin 0 0 0\nsubplot 2 2 0:title 'Boxs plot (default)':rotate 40 60:light on:box:boxs a\n" +"subplot 2 2 1:title '\"\\@\" style':rotate 50 60:box:boxs a '@'\n" +"subplot 2 2 2:title '\"\\#\" style':rotate 50 60:box:boxs a '#'\n" +"subplot 2 2 3:title 'compare with Tile':rotate 50 60:box:tile a\n"; +void smgl_boxs(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + gr->SetOrigin(0,0,0); gr->Light(true); + if(!mini) {gr->SubPlot(2,2,0); gr->Title("Boxs plot (default)");} + gr->Rotate(40,60); gr->Box(); gr->Boxs(a); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("'\\@' style"); + gr->Rotate(50,60); gr->Box(); gr->Boxs(a,"@"); + gr->SubPlot(2,2,2); gr->Title("'\\#' style"); + gr->Rotate(50,60); gr->Box(); gr->Boxs(a,"#"); + gr->SubPlot(2,2,3); gr->Title("compare with Tile"); + gr->Rotate(50,60); gr->Box(); gr->Tile(a); +} +//----------------------------------------------------------------------------- +const char *mmgl_fit="new rnd 100 '0.4*rnd+0.1+sin(2*pi*x)'\nnew in 100 '0.3+sin(2*pi*x)'\n" +"list ini 1 1 3:fit res rnd 'a+b*sin(c*x)' 'abc' ini\n" +"title 'Fitting sample':yrange -2 2:box:axis:plot rnd '. '\n" +"plot res 'r':plot in 'b'\ntext -0.9 -1.3 'fitted:' 'r:L'\n" +"putsfit 0 -1.8 'y = ' 'r':text 0 2.2 'initial: y = 0.3+sin(2\\pi x)' 'b'\n"; +void smgl_fit(mglGraph *gr) // nonlinear fitting +{ + mglData rnd(100), in(100), res; + gr->Fill(rnd,"0.4*rnd+0.1+sin(2*pi*x)"); + gr->Fill(in,"0.3+sin(2*pi*x)"); + double ini[3] = {1,1,3}; + mglData Ini(3,ini); + res = gr->Fit(rnd, "a+b*sin(c*x)", "abc", Ini); + if(!mini) gr->Title("Fitting sample"); + gr->SetRange('y',-2,2); gr->Box(); gr->Plot(rnd, ". "); + gr->Axis(); gr->Plot(res, "r"); gr->Plot(in, "b"); + gr->Puts(mglPoint(-0.9, -1.3), "fitted:", "r:L"); + gr->PutsFit(mglPoint(0, -1.8), "y = ", "r"); + gr->Puts(mglPoint(0, 2.2), "initial: y = 0.3+sin(2\\pi x)", "b"); +// gr->SetRanges(mglPoint(-1,-1,-1),mglPoint(1,1,1)); gr->SetOrigin(0,0,0); +} +//----------------------------------------------------------------------------- +const char *mmgl_vecta="call 'prepare3v'\nsubplot 2 1 0:title 'Vect3 sample':rotate 50 60\n" +"origin 0 0 0:box:axis '_xyz'\nvect3 ex ey ez 'x':vect3 ex ey ez:vect3 ex ey ez 'z'\n" +"subplot 2 1 1:title '\"f\" style':rotate 50 60\n" +"origin 0 0 0:box:axis '_xyz'\nvect3 ex ey ez 'fx':vect3 ex ey ez 'f':vect3 ex ey ez 'fz'\n" +"grid3 ex 'Wx':grid3 ex 'W':grid3 ex 'Wz'\n"; +void smgl_vecta(mglGraph *gr) +{ + mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); + if(!mini) { gr->SubPlot(2,1,0); gr->Title("Vect3 sample"); } + gr->Rotate(50,60); gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box(); + gr->Vect3(ex,ey,ez,"x"); gr->Vect3(ex,ey,ez); gr->Vect3(ex,ey,ez,"z"); + if(mini) return; + gr->SubPlot(2,1,1); gr->Title("'f' style"); + gr->Rotate(50,60); gr->SetOrigin(0,0,0); gr->Axis("_xyz"); gr->Box(); + gr->Vect3(ex,ey,ez,"fx"); gr->Vect3(ex,ey,ez,"f"); gr->Vect3(ex,ey,ez,"fz"); + gr->Grid3(ex,"Wx"); gr->Grid3(ex,"W"); gr->Grid3(ex,"Wz"); +} +//----------------------------------------------------------------------------- +const char *mmgl_vect="call 'prepare2v'\ncall 'prepare3v'\nsubplot 3 2 0 '':title 'Vect plot (default)':box:vect a b\n" +"subplot 3 2 1 '':title '\".\" style; \"=\" style':box:vect a b '.='\n" +"subplot 3 2 2 '':title '\"f\" style':box:vect a b 'f'\n" +"subplot 3 2 3 '':title '\">\" style':box:vect a b '>'\n" +"subplot 3 2 4 '':title '\"<\" style':box:vect a b '<'\n" +"subplot 3 2 5:title '3d variant':rotate 50 60:box:vect ex ey ez\n"; +void smgl_vect(mglGraph *gr) +{ + mglData a,b; mgls_prepare2v(&a,&b); + if(!mini) {gr->SubPlot(3,2,0,""); gr->Title("Vect plot (default)");} + gr->Box(); gr->Vect(a,b); + if(mini) return; + gr->SubPlot(3,2,1,""); gr->Title("'.' style; '=' style"); gr->Box(); gr->Vect(a,b,"=."); + gr->SubPlot(3,2,2,""); gr->Title("'f' style"); gr->Box(); gr->Vect(a,b,"f"); + gr->SubPlot(3,2,3,""); gr->Title("'>' style"); gr->Box(); gr->Vect(a,b,">"); + gr->SubPlot(3,2,4,""); gr->Title("'<' style"); gr->Box(); gr->Vect(a,b,"<"); + mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); + gr->SubPlot(3,2,5); gr->Title("3d variant"); gr->Rotate(50,60); + gr->Box(); gr->Vect(ex,ey,ez); +} +//----------------------------------------------------------------------------- +const char *mmgl_flow="call 'prepare2v'\ncall 'prepare3v'\nsubplot 2 2 0 '':title 'Flow plot (default)':box:flow a b\n" +"subplot 2 2 1 '':title '\"v\" style':box:flow a b 'v'\n" +"subplot 2 2 2 '':title 'from edges only':box:flow a b '#'\n" +"subplot 2 2 3:title '3d variant':rotate 50 60:box:flow ex ey ez\n"; +void smgl_flow(mglGraph *gr) +{ + mglData a,b; mgls_prepare2v(&a,&b); + if(!mini) {gr->SubPlot(2,2,0,""); gr->Title("Flow plot (default)");} + gr->Box(); gr->Flow(a,b); + if(mini) return; + gr->SubPlot(2,2,1,""); gr->Title("'v' style"); gr->Box(); gr->Flow(a,b,"v"); + gr->SubPlot(2,2,2,""); gr->Title("'\\#' style"); gr->Box(); gr->Flow(a,b,"#"); + mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); + gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); + gr->Box(); gr->Flow(ex,ey,ez); +} +//----------------------------------------------------------------------------- +const char *mmgl_pipe="call 'prepare2v'\ncall 'prepare3v'\nsubplot 2 2 0 '':title 'Pipe plot (default)':light on:box:pipe a b\n" +"subplot 2 2 1 '':title '\"i\" style':box:pipe a b 'i'\n" +"subplot 2 2 2 '':title 'from edges only':box:pipe a b '#'\n" +"subplot 2 2 3:title '3d variant':rotate 50 60:box:pipe ex ey ez '' 0.1\n"; +void smgl_pipe(mglGraph *gr) +{ + mglData a,b; mgls_prepare2v(&a,&b); + if(!mini) {gr->SubPlot(2,2,0,""); gr->Title("Pipe plot (default)");} + gr->Light(true); gr->Box(); gr->Pipe(a,b); + if(mini) return; + gr->SubPlot(2,2,1,""); gr->Title("'i' style"); gr->Box(); gr->Pipe(a,b,"i"); + gr->SubPlot(2,2,2,""); gr->Title("'\\#' style"); gr->Box(); gr->Pipe(a,b,"#"); + mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); + gr->SubPlot(2,2,3); gr->Title("3d variant"); gr->Rotate(50,60); + gr->Box(); gr->Pipe(ex,ey,ez,"",0.1); +} +//----------------------------------------------------------------------------- +const char *mmgl_dew="call 'prepare2v'\nsubplot 1 1 0 '':title 'Dew plot':light on:box:dew a b\n"; +void smgl_dew(mglGraph *gr) +{ + mglData a,b; mgls_prepare2v(&a,&b); + if(!mini) {gr->SubPlot(1,1,0,""); gr->Title("Dew plot");} + gr->Box(); gr->Light(true); gr->Dew(a,b); +} +//----------------------------------------------------------------------------- +const char *mmgl_grad="call 'prepare2d'\nsubplot 1 1 0 '':title 'Grad plot':box:grad a:dens a '{u8}w{q8}'\n"; +void smgl_grad(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + if(!mini) {gr->SubPlot(1,1,0,""); gr->Title("Grad plot");} + gr->Box(); gr->Grad(a); gr->Dens(a,"{u8}w{q8}"); +} +//----------------------------------------------------------------------------- +const char *mmgl_cones="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd'\n" +"subplot 2 2 0:title 'Cones plot':rotate 50 60:light on:origin 0 0 0:box:cones ys\n" +"subplot 2 2 1:title '2 colors':rotate 50 60:light on:origin 0 0 0:box:cones ys 'cbgGyr'\n" +"subplot 2 2 2:title '\"\\#\" style':rotate 50 60:light on:origin 0 0 0:box:cones ys '#'\n" +"subplot 2 2 3:title '\"a\" style':rotate 50 60:zrange -2 2:light on:origin 0 0 0:box:cones ys 'a'\n"; +void smgl_cones(mglGraph *gr) +{ + mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); + gr->Light(true); gr->SetOrigin(0,0,0); + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Cones plot"); } + gr->Rotate(50,60); gr->Box(); gr->Cones(ys); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("2 colors"); + gr->Rotate(50,60); gr->Box(); gr->Cones(ys,"cbgGyr"); + gr->SubPlot(2,2,2); gr->Title("'\\#' style"); + gr->Rotate(50,60); gr->Box(); gr->Cones(ys,"#"); + gr->SubPlot(2,2,3); gr->Title("'a' style"); + gr->SetRange('z',-2,2); // increase range since summation can exceed [-1,1] + gr->Rotate(50,60); gr->Box(); gr->Cones(ys,"a"); +} +//----------------------------------------------------------------------------- +const char *mmgl_aspect="subplot 2 2 0:box:text -1 1.1 'Just box' ':L'\ninplot 0.2 0.5 0.7 1:box:text 0 1.2 'InPlot example'\n" +"subplot 2 2 1:title 'Rotate only':rotate 50 60:box\nsubplot 2 2 2:title 'Rotate and Aspect':rotate 50 60:aspect 1 1 2:box\n" +"subplot 2 2 3:title 'Aspect in other direction':rotate 50 60:aspect 1 2 2:box\n"; +void smgl_aspect(mglGraph *gr) // transformation +{ + gr->SubPlot(2,2,0); gr->Box(); + gr->Puts(mglPoint(-1,1.1),"Just box",":L"); + gr->InPlot(0.2,0.5,0.7,1,false); gr->Box(); + gr->Puts(mglPoint(0,1.2),"InPlot example"); + gr->SubPlot(2,2,1); gr->Title("Rotate only"); + gr->Rotate(50,60); gr->Box(); + gr->SubPlot(2,2,2); gr->Title("Rotate and Aspect"); + gr->Rotate(50,60); gr->Aspect(1,1,2); gr->Box(); + gr->SubPlot(2,2,3); gr->Title("Aspect in other direction"); + gr->Rotate(50,60); gr->Aspect(1,2,2); gr->Box(); +} +//----------------------------------------------------------------------------- +const char *mmgl_inplot="subplot 3 2 0:title 'StickPlot'\nstickplot 3 0 20 30:box 'r':text 0 0 '0' 'r'\n" +"stickplot 3 1 20 30:box 'g':text 0 0 '1' 'g'\nstickplot 3 2 20 30:box 'b':text 0 0 '2' 'b'\n" +"subplot 3 2 3 '':title 'ColumnPlot'\ncolumnplot 3 0:box 'r':text 0 0 '0' 'r'\n" +"columnplot 3 1:box 'g':text 0 0 '1' 'g'\ncolumnplot 3 2:box 'b':text 0 0 '2' 'b'\n" +"subplot 3 2 4 '':title 'GridPlot'\ngridplot 2 2 0:box 'r':text 0 0 '0' 'r'\n" +"gridplot 2 2 1:box 'g':text 0 0 '1' 'g'\ngridplot 2 2 2:box 'b':text 0 0 '2' 'b'\n" +"gridplot 2 2 3:box 'm':text 0 0 '3' 'm'\nsubplot 3 2 5 '':title 'InPlot':box\n" +"inplot 0.4 1 0.6 1 on:box 'r'\nmultiplot 3 2 1 2 1 '':title 'MultiPlot':box\n"; +void smgl_inplot(mglGraph *gr) +{ + gr->SubPlot(3,2,0); gr->Title("StickPlot"); + gr->StickPlot(3, 0, 20, 30); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); + gr->StickPlot(3, 1, 20, 30); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); + gr->StickPlot(3, 2, 20, 30); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); + gr->SubPlot(3,2,3,""); gr->Title("ColumnPlot"); + gr->ColumnPlot(3, 0); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); + gr->ColumnPlot(3, 1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); + gr->ColumnPlot(3, 2); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); + gr->SubPlot(3,2,4,""); gr->Title("GridPlot"); + gr->GridPlot(2, 2, 0); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); + gr->GridPlot(2, 2, 1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); + gr->GridPlot(2, 2, 2); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); + gr->GridPlot(2, 2, 3); gr->Box("m"); gr->Puts(mglPoint(0),"3","m"); + gr->SubPlot(3,2,5,""); gr->Title("InPlot"); gr->Box(); + gr->InPlot(0.4, 1, 0.6, 1, true); gr->Box("r"); + gr->MultiPlot(3,2,1, 2, 1,""); gr->Title("MultiPlot"); gr->Box(); +} +//----------------------------------------------------------------------------- +const char *mmgl_combined="call 'prepare2v'\ncall 'prepare3d'\nnew v 10:fill v -0.5 1:copy d sqrt(a^2+b^2)\n" +"subplot 2 2 0:title 'Surf + Cont':rotate 50 60:light on:box:surf a:cont a 'y'\n" +"subplot 2 2 1 '':title 'Flow + Dens':light off:box:flow a b 'br':dens d\n" +"subplot 2 2 2:title 'Mesh + Cont':rotate 50 60:box:mesh a:cont a '_'\n" +"subplot 2 2 3:title 'Surf3 + ContF3':rotate 50 60:light on\n" +"box:contf3 v c 'z' 0:contf3 v c 'x':contf3 v c\ncut 0 -1 -1 1 0 1.1\ncontf3 v c 'z' c.nz-1:surf3 c -0.5\n"; +void smgl_combined(mglGraph *gr) // flow threads and density plot +{ + mglData a,b,d; mgls_prepare2v(&a,&b); d = a; + for(int i=0;iSubPlot(2,2,1,""); gr->Title("Flow + Dens"); + gr->Flow(a,b,"br"); gr->Dens(d,"BbcyrR"); gr->Box(); + gr->SubPlot(2,2,0); gr->Title("Surf + Cont"); gr->Rotate(50,60); + gr->Light(true); gr->Surf(a); gr->Cont(a,"y"); gr->Box(); + gr->SubPlot(2,2,2); gr->Title("Mesh + Cont"); gr->Rotate(50,60); + gr->Box(); gr->Mesh(a); gr->Cont(a,"_"); + gr->SubPlot(2,2,3); gr->Title("Surf3 + ContF3");gr->Rotate(50,60); + gr->Box(); gr->ContF3(v,c,"z",0); gr->ContF3(v,c,"x"); gr->ContF3(v,c); + gr->SetCutBox(mglPoint(0,-1,-1), mglPoint(1,0,1.1)); + gr->ContF3(v,c,"z",c.nz-1); gr->Surf3(-0.5,c); +} +//----------------------------------------------------------------------------- +const char *mmgl_axis="subplot 2 2 0:title 'Axis origin, Grid':origin 0 0:axis:grid:fplot 'x^3'\n" +"subplot 2 2 1:title '2 axis':ranges -1 1 -1 1:origin -1 -1:axis:ylabel 'axis_1':fplot 'sin(pi*x)' 'r2'\n" +"ranges 0 1 0 1:origin 1 1:axis:ylabel 'axis_2':fplot 'cos(pi*x)'\n" +"subplot 2 2 3:title 'More axis':origin nan nan:xrange -1 1:axis:xlabel 'x' 0:ylabel 'y_1' 0:fplot 'x^2' 'k'\n" +"yrange -1 1:origin -1.3 -1:axis 'y' 'r':ylabel '#r{y_2}' 0.2:fplot 'x^3' 'r'\n\n" +"subplot 2 2 2:title '4 segments, inverted axis':origin 0 0:\n" +"inplot 0.5 1 0.5 1 on:ranges 0 10 0 2:axis\nfplot 'sqrt(x/2)':xlabel 'W' 1:ylabel 'U' 1\n" +"inplot 0 0.5 0.5 1 on:ranges 1 0 0 2:axis 'x':fplot 'sqrt(x)+x^3':xlabel '\\tau' 1\n" +"inplot 0.5 1 0 0.5 on:ranges 0 10 4 0:axis 'y':fplot 'x/4':ylabel 'L' -1\n" +"inplot 0 0.5 0 0.5 on:ranges 1 0 4 0:fplot '4*x^2'\n"; +void smgl_axis(mglGraph *gr) +{ + gr->SubPlot(2,2,0); gr->Title("Axis origin, Grid"); gr->SetOrigin(0,0); + gr->Axis(); gr->Grid(); gr->FPlot("x^3"); + + gr->SubPlot(2,2,1); gr->Title("2 axis"); + gr->SetRanges(-1,1,-1,1); gr->SetOrigin(-1,-1,-1); // first axis + gr->Axis(); gr->Label('y',"axis 1",0); gr->FPlot("sin(pi*x)","r2"); + gr->SetRanges(0,1,0,1); gr->SetOrigin(1,1,1); // second axis + gr->Axis(); gr->Label('y',"axis 2",0); gr->FPlot("cos(pi*x)"); + + gr->SubPlot(2,2,3); gr->Title("More axis"); gr->SetOrigin(NAN,NAN); gr->SetRange('x',-1,1); + gr->Axis(); gr->Label('x',"x",0); gr->Label('y',"y_1",0); gr->FPlot("x^2","k"); + gr->SetRanges(-1,1,-1,1); gr->SetOrigin(-1.3,-1); // second axis + gr->Axis("y","r"); gr->Label('y',"#r{y_2}",0.2); gr->FPlot("x^3","r"); + + gr->SubPlot(2,2,2); gr->Title("4 segments, inverted axis"); gr->SetOrigin(0,0); + gr->InPlot(0.5,1,0.5,1); gr->SetRanges(0,10,0,2); gr->Axis(); + gr->FPlot("sqrt(x/2)"); gr->Label('x',"W",1); gr->Label('y',"U",1); + gr->InPlot(0,0.5,0.5,1); gr->SetRanges(1,0,0,2); gr->Axis("x"); + gr->FPlot("sqrt(x)+x^3"); gr->Label('x',"\\tau",-1); + gr->InPlot(0.5,1,0,0.5); gr->SetRanges(0,10,4,0); gr->Axis("y"); + gr->FPlot("x/4"); gr->Label('y',"L",-1); + gr->InPlot(0,0.5,0,0.5); gr->SetRanges(1,0,4,0); gr->FPlot("4*x^2"); +} +//----------------------------------------------------------------------------- +const char *mmgl_ticks="subplot 3 2 0:title 'Usual axis':axis\n" +"subplot 3 2 1:title 'Too big/small range':ranges -1000 1000 0 0.001:axis\n" +"subplot 3 2 3:title 'Too narrow range':ranges 100 100.1 10 10.01:axis\n" +"subplot 3 2 4:title 'Disable ticks tuning':tuneticks off:axis\n" +"subplot 3 2 2:title 'Manual ticks':ranges -pi pi 0 2:\n" +"xtick -pi '\\pi' -pi/2 '-\\pi/2' 0 '0' 0.886 'x^*' pi/2 '\\pi/2' pi 'pi'\n" +"# or you can use:\n#list v -pi -pi/2 0 0.886 pi/2 pi:xtick v '-\\pi\\n-\\pi/2\\n{}0\\n{}x^*\\n\\pi/2\\n\\pi'\n" +"axis:grid:fplot '2*cos(x^2)^2' 'r2'\n" +"subplot 3 2 5:title 'Time ticks':xrange 0 3e5:ticktime 'x':axis\n"; +void smgl_ticks(mglGraph *gr) +{ + gr->SubPlot(3,2,0); gr->Title("Usual axis"); gr->Axis(); + gr->SubPlot(3,2,1); gr->Title("Too big/small range"); + gr->SetRanges(-1000,1000,0,0.001); gr->Axis(); + gr->SubPlot(3,2,3); gr->Title("Too narrow range"); + gr->SetRanges(100,100.1,10,10.01); gr->Axis(); + gr->SubPlot(3,2,4); gr->Title("Disable ticks tuning"); + gr->SetTuneTicks(0); gr->Axis(); + + gr->SubPlot(3,2,2); gr->Title("Manual ticks"); gr->SetRanges(-M_PI,M_PI, 0, 2); + double val[]={-M_PI, -M_PI/2, 0, 0.886, M_PI/2, M_PI}; + gr->SetTicksVal('x', mglData(6,val), "-\\pi\n-\\pi/2\n0\nx^*\n\\pi/2\n\\pi"); + gr->Axis(); gr->Grid(); gr->FPlot("2*cos(x^2)^2", "r2"); + + gr->SubPlot(3,2,5); gr->Title("Time ticks"); gr->SetRange('x',0,3e5); + gr->SetTicksTime('x',0); gr->Axis(); +} +//----------------------------------------------------------------------------- +const char *mmgl_box="subplot 2 2 0:title 'Box (default)':rotate 50 60:box\n" +"subplot 2 2 1:title 'colored':rotate 50 60:box 'r'\n" +"subplot 2 2 2:title 'with faces':rotate 50 60:box '@'\n" +"subplot 2 2 3:title 'both':rotate 50 60:box '@cm'\n"; +void smgl_box(mglGraph *gr) +{ + gr->SubPlot(2,2,0); gr->Title("Box (default)"); gr->Rotate(50,60); gr->Box(); + gr->SubPlot(2,2,1); gr->Title("colored"); gr->Rotate(50,60); gr->Box("r"); + gr->SubPlot(2,2,2); gr->Title("with faces"); gr->Rotate(50,60); gr->Box("@"); + gr->SubPlot(2,2,3); gr->Title("both"); gr->Rotate(50,60); gr->Box("@cm"); +} +//----------------------------------------------------------------------------- +const char *mmgl_loglog="subplot 2 2 0 '<_':title 'Semi-log axis':ranges 0.01 100 -1 1:axis 'lg(x)' '' ''\n" +"axis:grid 'xy' 'g':fplot 'sin(1/x)':xlabel 'x' 0:ylabel 'y = sin 1/x' 0\n" +"subplot 2 2 1 '<_':title 'Log-log axis':ranges 0.01 100 0.1 100:axis 'lg(x)' 'lg(y)' ''\n" +"axis:fplot 'sqrt(1+x^2)':xlabel 'x' 0:ylabel 'y = \\sqrt{1+x^2}' 0\n" +"subplot 2 2 2 '<_':title 'Minus-log axis':ranges -100 -0.01 -100 -0.1:axis '-lg(-x)' '-lg(-y)' ''\n" +"axis:fplot '-sqrt(1+x^2)':xlabel 'x' 0:ylabel 'y = -\\sqrt{1+x^2}' 0\n" +"subplot 2 2 3 '<_':title 'Log-ticks':ranges 0.01 100 0 100:axis 'sqrt(x)' '' ''\n" +"axis:fplot 'x':xlabel 'x' 1:ylabel 'y = x' 0\n"; +void smgl_loglog(mglGraph *gr) // log-log axis +{ + gr->SubPlot(2,2,0,"<_"); gr->Title("Semi-log axis"); gr->SetRanges(0.01,100,-1,1); gr->SetFunc("lg(x)",""); + gr->Axis(); gr->Grid("xy","g"); gr->FPlot("sin(1/x)"); gr->Label('x',"x",0); gr->Label('y', "y = sin 1/x",0); + gr->SubPlot(2,2,1,"<_"); gr->Title("Log-log axis"); gr->SetRanges(0.01,100,0.1,100); gr->SetFunc("lg(x)","lg(y)"); + gr->Axis(); gr->FPlot("sqrt(1+x^2)"); gr->Label('x',"x",0); gr->Label('y', "y = \\sqrt{1+x^2}",0); + gr->SubPlot(2,2,2,"<_"); gr->Title("Minus-log axis"); gr->SetRanges(-100,-0.01,-100,-0.1); gr->SetFunc("-lg(-x)","-lg(-y)"); + gr->Axis(); gr->FPlot("-sqrt(1+x^2)"); gr->Label('x',"x",0); gr->Label('y', "y = -\\sqrt{1+x^2}",0); + gr->SubPlot(2,2,3,"<_"); gr->Title("Log-ticks"); gr->SetRanges(0.1,100,0,100); gr->SetFunc("sqrt(x)",""); + gr->Axis(); gr->FPlot("x"); gr->Label('x',"x",1); gr->Label('y', "y = x",0); +} +//----------------------------------------------------------------------------- +const char *mmgl_venn="list x -0.3 0 0.3:list y 0.3 -0.3 0.3:list e 0.7 0.7 0.7\n" +"subplot 1 1 0:title 'Venn-like diagram':alpha on:error x y e e '!rgb@#o'"; +void smgl_venn(mglGraph *gr) +{ + double xx[3]={-0.3,0,0.3}, yy[3]={0.3,-0.3,0.3}, ee[3]={0.7,0.7,0.7}; + mglData x(3,xx), y(3,yy), e(3,ee); + gr->SubPlot(1,1,0); gr->Title("Venn-like diagram"); gr->Alpha(true); gr->Error(x,y,e,e,"!rgb@#o"); +} +//----------------------------------------------------------------------------- +const char *mmgl_stereo="call 'prepare2d'\nlight on\nsubplot 2 1 0:rotate 50 60+1:box:surf a\nsubplot 2 1 1:rotate 50 60-1:box:surf a\n"; +void smgl_stereo(mglGraph *gr) +{ + mglData a; mgls_prepare2d(&a); + gr->Light(true); + gr->SubPlot(2,1,0); gr->Rotate(50,60+1); + gr->Box(); gr->Surf(a); + gr->SubPlot(2,1,1); gr->Rotate(50,60-1); + gr->Box(); gr->Surf(a); +} +//----------------------------------------------------------------------------- +const char *mmgl_hist="new x 10000 '2*rnd-1':new y 10000 '2*rnd-1':copy z exp(-6*(x^2+y^2))\n" +"hist xx x z:norm xx 0 1:hist yy y z:norm yy 0 1\nmultiplot 3 3 3 2 2 '':ranges -1 1 -1 1 0 1:box:dots x y z 'wyrRk'\n" +"multiplot 3 3 0 2 1 '':ranges -1 1 0 1:box:bars xx\nmultiplot 3 3 5 1 2 '':ranges 0 1 -1 1:box:barh yy\n" +"subplot 3 3 2:text 0.5 0.5 'Hist and\\n{}MultiPlot\\n{}sample' 'a' -3\n"; +void smgl_hist(mglGraph *gr) +{ + mglData x(10000), y(10000), z(10000); gr->Fill(x,"2*rnd-1"); gr->Fill(y,"2*rnd-1"); gr->Fill(z,"exp(-6*(v^2+w^2))",x,y); + mglData xx=gr->Hist(x,z), yy=gr->Hist(y,z); xx.Norm(0,1); yy.Norm(0,1); + gr->MultiPlot(3,3,3,2,2,""); gr->SetRanges(-1,1,-1,1,0,1); gr->Box(); gr->Dots(x,y,z,"wyrRk"); + gr->MultiPlot(3,3,0,2,1,""); gr->SetRanges(-1,1,0,1); gr->Box(); gr->Bars(xx); + gr->MultiPlot(3,3,5,1,2,""); gr->SetRanges(0,1,-1,1); gr->Box(); gr->Barh(yy); + gr->SubPlot(3,3,2); gr->Puts(mglPoint(0.5,0.5),"Hist and\nMultiPlot\nsample","a",-3); +} +//----------------------------------------------------------------------------- +const char *mmgl_primitives="subplot 2 2 0 '':title 'Line, Curve, Rhomb, Ellipse' '' -1.5\n" +"line -1 -1 -0.5 1 'qAI'\ncurve -0.6 -1 1 1 0 1 1 1 'rA'\nball 0 -0.5 '*':ball 1 -0.1 '*'\n" +"rhomb 0 0.4 1 0.9 0.2 'b#'\nrhomb 0 0 1 0.4 0.2 'cg@'\n" +"ellipse 0 -0.5 1 -0.1 0.2 'u#'\nellipse 0 -1 1 -0.6 0.2 'm@'\n\n" +"light on\nsubplot 2 2 1:title 'Face[xyz]':rotate 50 60:box\n" +"facex 1 0 -1 1 1 'r':facey -1 -1 -1 1 1 'g':facez 1 -1 -1 -1 1 'b'\n" +"face -1 -1 1 -1 1 1 1 -1 0 1 1 1 'm'\n\n" +"subplot 2 2 3 '':title 'Cone'\n" +"cone -0.7 -0.3 0 -0.7 0.7 0.5 0.2 0.1 'b':text -0.7 -0.7 'no edges\\n(default)'\n" +"cone 0 -0.3 0 0 0.7 0.5 0.2 0.1 'g@':text 0 -0.7 'with edges\\n('\\@' style)'\n" +"cone 0.7 -0.3 0 0.7 0.7 0.5 0.2 0.1 'ry':text 0.7 -0.7 '\"arrow\" with\\n{}gradient'\n\n" +"subplot 2 2 2 '':title 'Sphere and Drop'\nline -0.9 0 1 0.9 0 1\n" +"text -0.9 0.4 'sh=0':drop -0.9 0 0 1 0.5 'r' 0:ball -0.9 0 1 'k'n" +"text -0.3 0.6 'sh=0.33':drop -0.3 0 0 1 0.5 'r' 0.33:ball -0.3 0 1 'k'n" +"text 0.3 0.8 'sh=0.67':drop 0.3 0 0 1 0.5 'r' 0.67:ball 0.3 0 1 'k'n" +"text 0.9 1. 'sh=1':drop 0.9 0 0 1 0.5 'r' 1:ball 0.9 0 1 'k'\n\n" +"text -0.9 -1.1 'asp=0.33':drop -0.9 -0.7 0 1 0.5 'b' 0 0.33\n" +"text -0.3 -1.1 'asp=0.67':drop -0.3 -0.7 0 1 0.5 'b' 0 0.67\n" +"text 0.3 -1.1 'asp=1':drop 0.3 -0.7 0 1 0.5 'b' 0 1\n" +"text 0.9 -1.1 'asp=1.5':drop 0.9 -0.7 0 1 0.5 'b' 0 1.5\n"; +void smgl_primitives(mglGraph *gr) // flag # +{ + gr->SubPlot(2,2,0,""); gr->Title("Line, Curve, Rhomb, Ellipse","",-1.5); + gr->Line(mglPoint(-1,-1),mglPoint(-0.5,1),"qAI"); + gr->Curve(mglPoint(-0.6,-1),mglPoint(1,1),mglPoint(0,1),mglPoint(1,1),"rA"); + gr->Rhomb(mglPoint(0,0.4),mglPoint(1,0.9),0.2,"b#"); + gr->Rhomb(mglPoint(0,0),mglPoint(1,0.4),0.2,"cg@"); + gr->Ellipse(mglPoint(0,-0.5),mglPoint(1,-0.1),0.2,"u#"); + gr->Ellipse(mglPoint(0,-1),mglPoint(1,-0.6),0.2,"m@"); + gr->Mark(mglPoint(0,-0.5),"*"); gr->Mark(mglPoint(1,-0.1),"*"); + + gr->Light(true); + gr->SubPlot(2,2,1); gr->Title("Face[xyz]"); gr->Rotate(50,60); gr->Box(); + gr->FaceX(mglPoint(1,0,-1),1,1,"r"); + gr->FaceY(mglPoint(-1,-1,-1),1,1,"g"); + gr->FaceZ(mglPoint(1,-1,-1),-1,1,"b"); + gr->Face(mglPoint(-1,-1,1),mglPoint(-1,1,1),mglPoint(1,-1,0),mglPoint(1,1,1),"m"); + + gr->SubPlot(2,2,3,""); gr->Title("Cone"); + gr->Cone(mglPoint(-0.7,-0.3),mglPoint(-0.7,0.7,0.5),0.2,0.1,"b"); + gr->Puts(mglPoint(-0.7,-0.7),"no edges\n(default)"); + gr->Cone(mglPoint(0,-0.3),mglPoint(0,0.7,0.5),0.2,0.1,"g@"); + gr->Puts(mglPoint(0,-0.7),"with edges\n('\\@' style)"); + gr->Cone(mglPoint(0.7,-0.3),mglPoint(0.7,0.7,0.5),0.2,0,"ry"); + gr->Puts(mglPoint(0.7,-0.7),"'arrow' with\ngradient"); + + gr->SubPlot(2,2,2,""); gr->Title("Sphere and Drop"); gr->Alpha(false); + gr->Puts(mglPoint(-0.9,0.4),"sh=0"); gr->Ball(mglPoint(-0.9,0,1),'k'); + gr->Drop(mglPoint(-0.9,0),mglPoint(0,1),0.5,"r",0); + gr->Puts(mglPoint(-0.3,0.6),"sh=0.33"); gr->Ball(mglPoint(-0.3,0,1),'k'); + gr->Drop(mglPoint(-0.3,0),mglPoint(0,1),0.5,"r",0.33); + gr->Puts(mglPoint(0.3,0.8),"sh=0.67"); gr->Ball(mglPoint(0.3,0,1),'k'); + gr->Drop(mglPoint(0.3,0),mglPoint(0,1),0.5,"r",0.67); + gr->Puts(mglPoint(0.9,1),"sh=1"); gr->Ball(mglPoint(0.9,0,1),'k'); + gr->Drop(mglPoint(0.9,0),mglPoint(0,1),0.5,"r",1); + gr->Line(mglPoint(-0.9,0,1),mglPoint(0.9,0,1),"b"); + + gr->Puts(mglPoint(-0.9,-1.1),"asp=0.33"); + gr->Drop(mglPoint(-0.9,-0.7),mglPoint(0,1),0.5,"b",0,0.33); + gr->Puts(mglPoint(-0.3,-1.1),"asp=0.67"); + gr->Drop(mglPoint(-0.3,-0.7),mglPoint(0,1),0.5,"b",0,0.67); + gr->Puts(mglPoint(0.3,-1.1),"asp=1"); + gr->Drop(mglPoint(0.3,-0.7),mglPoint(0,1),0.5,"b",0,1); + gr->Puts(mglPoint(0.9,-1.1),"asp=1.5"); + gr->Drop(mglPoint(0.9,-0.7),mglPoint(0,1),0.5,"b",0,1.5); +} +//----------------------------------------------------------------------------- +const char *mmgl_table="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd'\n" +"subplot 2 2 0:title 'Table sample':box\ntable ys 'y_1\\n{}y_2\\n{}y_3'\n\n" +"subplot 2 2 1:title 'no borders, colored'\ntable ys 'y_1\\n{}y_2\\n{}y_3' 'r|'\n\n" +"subplot 2 2 2:title 'no font decrease'\ntable ys 'y_1\\n{}y_2\\n{}y_3' '#'\n\n" +"subplot 2 2 3:title 'manual width and position':box\n" +"table 0.5 0.95 ys 'y_1\\n{}y_2\\n{}y_3' '#';value 0.7\n"; +void smgl_table(mglGraph *gr) +{ + mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Table plot"); } + gr->Table(ys,"y_1\ny_2\ny_3"); gr->Box(); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("no borders, colored"); + gr->Table(ys,"y_1\ny_2\ny_3","r|"); + gr->SubPlot(2,2,2); gr->Title("no font decrease"); + gr->Table(ys,"y_1\ny_2\ny_3","#"); + gr->SubPlot(2,2,3); gr->Title("manual width, position"); + gr->Table(0.5, 0.95, ys,"y_1\ny_2\ny_3","#", "value 0.7"); gr->Box(); +} +//----------------------------------------------------------------------------- +const char *mmgl_label="new ys 10 '0.2*rnd-0.8*sin(pi*x)'\n" +"subplot 1 1 0 '':title 'Label plot':box:plot ys ' *':label ys 'y=%y'\n"; +void smgl_label(mglGraph *gr) +{ + mglData ys(10); ys.Modify("0.8*sin(pi*2*x)+0.2*rnd"); + if(!mini) { gr->SubPlot(1,1,0,""); gr->Title("Label plot"); } + gr->Box(); gr->Plot(ys," *"); gr->Label(ys,"y=%y"); +} +//----------------------------------------------------------------------------- +const char *mmgl_colorbar="call 'prepare2d'\nnew v 9 'x'\nsubplot 2 2 0:title 'Colorbar out of box':box\n" +"colorbar '<':colorbar '>':colorbar '_':colorbar '^'\n" +"subplot 2 2 1:title 'Colorbar near box':box\n" +"colorbar 'I':colorbar '_I':colorbar '^I'\n" +"subplot 2 2 2:title 'manual colors':box:contd v a\n" +"colorbar v '<':colorbar v '>':colorbar v '_':colorbar v '^'\n" +"subplot 2 2 3:title '':text -0.5 1.55 'Color positions' ':C' -2\n" +"colorbar 'bwr>' 0.25 0:text -0.9 1.2 'Default'\n" +"colorbar 'b{w,0.3}r>' 0.5 0:text -0.1 1.2 'Manual'\ncrange 0.01 1e3\n" +"colorbar '>' 0.75 0:text 0.65 1.2 'Normal scale':colorbar '>':text 1.35 1.2 'Log scale'\n"; +void smgl_colorbar(mglGraph *gr) +{ + gr->SubPlot(2,2,0); gr->Title("Colorbar out of box"); gr->Box(); + gr->Colorbar("<"); gr->Colorbar(">"); gr->Colorbar("_"); gr->Colorbar("^"); + gr->SubPlot(2,2,1); gr->Title("Colorbar near box"); gr->Box(); + gr->Colorbar("Colorbar(">I"); gr->Colorbar("_I"); gr->Colorbar("^I"); + gr->SubPlot(2,2,2); gr->Title("manual colors"); + mglData a,v; mgls_prepare2d(&a,0,&v); + gr->Box(); gr->ContD(v,a); + gr->Colorbar(v,"<"); gr->Colorbar(v,">"); gr->Colorbar(v,"_"); gr->Colorbar(v,"^"); + + gr->SubPlot(2,2,3); gr->Title(" "); + gr->Puts(mglPoint(-0.5,1.55),"Color positions",":C",-2); + gr->Colorbar("bwr>",0.25,0); gr->Puts(mglPoint(-0.9,1.2),"Default"); + gr->Colorbar("b{w,0.3}r>",0.5,0); gr->Puts(mglPoint(-0.1,1.2),"Manual"); + + gr->Puts(mglPoint(1,1.55),"log-scale",":C",-2); + gr->SetRange('c',0.01,1e3); + gr->Colorbar(">",0.75,0); gr->Puts(mglPoint(0.65,1.2),"Normal scale"); + gr->SetFunc("","","","lg(c)"); + gr->Colorbar(">"); gr->Puts(mglPoint(1.35,1.2),"Log scale"); +} +//----------------------------------------------------------------------------- +const char *mmgl_legend="addlegend 'sin(\\pi {x^2})' 'b':addlegend 'sin(\\pi x)' 'g*'\n" +"addlegend 'sin(\\pi \\sqrt{x})' 'rd':addlegend 'jsut text' ' ':addlegend 'no indent for this' ''\n" +"subplot 2 2 0 '':title 'Legend (default)':box:legend\n" +"legend 3 'A#':text 0.75 0.65 'Absolute position' 'A'\n" +"subplot 2 2 2 '':title 'coloring':box:legend 0 'r#':legend 1 'Wb#':legend 2 'ygr#'\n" +"subplot 2 2 3 '':title 'manual position':box\n" +"legend 0.5 1:text 0.5 0.55 'at x=0.5, y=1' 'a'\n" +"legend 1 '#-':text 0.75 0.25 'Horizontal legend' 'a'\n"; +void smgl_legend(mglGraph *gr) +{ + gr->AddLegend("sin(\\pi {x^2})","b"); + gr->AddLegend("sin(\\pi x)","g*"); + gr->AddLegend("sin(\\pi \\sqrt{x})","rd"); + gr->AddLegend("just text"," "); + gr->AddLegend("no indent for this",""); + if(!mini) {gr->SubPlot(2,2,0,""); gr->Title("Legend (default)");} + gr->Box(); gr->Legend(); + if(mini) return; + gr->Legend(3,"A#"); + gr->Puts(mglPoint(0.75,0.65),"Absolute position","A"); + gr->SubPlot(2,2,2,""); gr->Title("coloring"); gr->Box(); + gr->Legend(0,"r#"); gr->Legend(1,"Wb#"); gr->Legend(2,"ygr#"); + gr->SubPlot(2,2,3,""); gr->Title("manual position"); gr->Box(); + gr->Legend(0.5,1); + gr->Puts(mglPoint(0.5,0.55),"at x=0.5, y=1","a"); + gr->Legend(1,"#-"); + gr->Puts(mglPoint(0.75,0.25),"Horizontal legend","a"); +} +//----------------------------------------------------------------------------- +const char *mmgl_dat_diff="ranges 0 1 0 1 0 1:new a 30 40 'x*y'\n" +"subplot 2 2 0:title 'a(x,y)':rotate 60 40:surf a:box\n" +"subplot 2 2 1:title 'da/dx':rotate 60 40:diff a 'x':surf a:box\n" +"subplot 2 2 2:title '\\int da/dx dxdy':rotate 60 40:integrate a 'xy':surf a:box\n" +"subplot 2 2 3:title '\\int {d^2}a/dxdy dx':rotate 60 40:diff2 a 'y':surf a:box\n"; +void smgl_dat_diff(mglGraph *gr) // differentiate +{ + gr->SetRanges(0,1,0,1,0,1); + mglData a(30,40); a.Modify("x*y"); + gr->SubPlot(2,2,0); gr->Title("a(x,y)"); gr->Rotate(60,40); + gr->Surf(a); gr->Box(); + gr->SubPlot(2,2,1); gr->Title("da/dx"); gr->Rotate(60,40); + a.Diff("x"); gr->Surf(a); gr->Box(); + gr->SubPlot(2,2,2); gr->Title("\\int da/dx dxdy"); gr->Rotate(60,40); + a.Integral("xy"); gr->Surf(a); gr->Box(); + gr->SubPlot(2,2,3); gr->Title("\\int {d^2}a/dxdy dx"); gr->Rotate(60,40); + a.Diff2("y"); gr->Surf(a); gr->Box(); +} +//----------------------------------------------------------------------------- +const char *mmgl_dat_extra="subplot 2 2 0 '':title 'Envelop sample':new d1 1000 'exp(-8*x^2)*sin(10*pi*x)'\n" +"axis:plot d1 'b':envelop d1 'x':plot d1 'r'\n" +"subplot 2 2 1 '':title 'Smooth sample':ranges 0 1 0 1\nnew y0 30 '0.4*sin(pi*x) + 0.3*cos(1.5*pi*x) - 0.4*sin(2*pi*x)+0.5*rnd'\n" +"copy y1 y0:smooth y1 'x3':plot y1 'r';legend '\"3\" style'\ncopy y2 y0:smooth y2 'x5':plot y2 'g';legend '\"5\" style'\n" +"copy y3 y0:smooth y3 'x':plot y3 'b';legend 'default'\nplot y0 '{m7}:s';legend 'none'\nlegend:box\n" +"subplot 2 2 2:title 'Sew sample':rotate 50 60:light on:alpha on\nnew d2 100 100 'mod((y^2-(1-x)^2)/2,0.1)'\n" +"box:surf d2 'b':sew d2 'xy' 0.1:surf d2 'r'\n" +"subplot 2 2 3:title 'Resize sample (interpolation)'\nnew x0 10 'rnd':new v0 10 'rnd'\n" +"resize x1 x0 100:resize v1 v0 100\nplot x0 v0 'b+ ':plot x1 v1 'r-':label x0 v0 '%n'\n"; +void smgl_dat_extra(mglGraph *gr) // differentiate +{ + gr->SubPlot(2,2,0,""); gr->Title("Envelop sample"); + mglData d1(1000); gr->Fill(d1,"exp(-8*x^2)*sin(10*pi*x)"); + gr->Axis(); gr->Plot(d1, "b"); + d1.Envelop('x'); gr->Plot(d1, "r"); + + gr->SubPlot(2,2,1,""); gr->Title("Smooth sample"); + mglData y0(30),y1,y2,y3; + gr->SetRanges(0,1,0,1); + gr->Fill(y0, "0.4*sin(pi*x) + 0.3*cos(1.5*pi*x) - 0.4*sin(2*pi*x)+0.5*rnd"); + + y1=y0; y1.Smooth("x3"); + y2=y0; y2.Smooth("x5"); + y3=y0; y3.Smooth("x"); + + gr->Plot(y0,"{m7}:s", "legend 'none'"); //gr->AddLegend("none","k"); + gr->Plot(y1,"r", "legend ''3' style'"); + gr->Plot(y2,"g", "legend ''5' style'"); + gr->Plot(y3,"b", "legend 'default'"); + gr->Legend(); gr->Box(); + + gr->SubPlot(2,2,2); gr->Title("Sew sample"); + mglData d2(100, 100); gr->Fill(d2, "mod((y^2-(1-x)^2)/2,0.1)"); + gr->Rotate(50, 60); gr->Light(true); gr->Alpha(true); + gr->Box(); gr->Surf(d2, "b"); + d2.Sew("xy", 0.1); gr->Surf(d2, "r"); + + gr->SubPlot(2,2,3); gr->Title("Resize sample (interpolation)"); + mglData x0(10), v0(10), x1, v1; + gr->Fill(x0,"rnd"); gr->Fill(v0,"rnd"); + x1 = x0.Resize(100); v1 = v0.Resize(100); + gr->Plot(x0,v0,"b+ "); gr->Plot(x1,v1,"r-"); + gr->Label(x0,v0,"%n"); +} +//----------------------------------------------------------------------------- +const char *mmgl_ternary="ranges 0 1 0 1 0 1\nnew x 50 '0.25*(1+cos(2*pi*x))'\n" +"new y 50 '0.25*(1+sin(2*pi*x))'\nnew z 50 'x'\nnew a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)'\n" +"new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx\nlight on\n\n" +"subplot 2 2 0:title 'Ordinary axis 3D':rotate 50 60\nbox:axis:grid\n" +"plot x y z 'r2':surf a '#'\nxlabel 'B':ylabel 'C':zlabel 'Z'\n\n" +"subplot 2 2 1:title 'Ternary axis (x+y+t=1)':ternary 1\nbox:axis:grid 'xyz' 'B;'\n" +"plot x y 'r2':plot rx ry 'q^ ':cont a:line 0.5 0 0 0.75 'g2'\nxlabel 'B':ylabel 'C':tlabel 'A'\n\n" +"subplot 2 2 2:title 'Quaternary axis 3D':rotate 50 60:ternary 2\nbox:axis:grid 'xyz' 'B;'\n" +"plot x y z 'r2':surf a '#'\nxlabel 'B':ylabel 'C':tlabel 'A':zlabel 'D'\n\n" +"subplot 2 2 3:title 'Ternary axis 3D':rotate 50 60:ternary 1\nbox:axis:grid 'xyz' 'B;'\n" +"plot x y z 'r2':surf a '#'\nxlabel 'B':ylabel 'C':tlabel 'A':zlabel 'Z'\n"; +void smgl_ternary(mglGraph *gr) // flag # +{ + gr->SetRanges(0,1,0,1,0,1); + mglData x(50),y(50),z(50),rx(10),ry(10), a(20,30); + a.Modify("30*x*y*(1-x-y)^2*(x+y<1)"); + x.Modify("0.25*(1+cos(2*pi*x))"); + y.Modify("0.25*(1+sin(2*pi*x))"); + rx.Modify("rnd"); ry.Modify("(1-v)*rnd",rx); + z.Modify("x"); + + gr->SubPlot(2,2,0); gr->Title("Ordinary axis 3D"); + gr->Rotate(50,60); gr->Light(true); + gr->Plot(x,y,z,"r2"); gr->Surf(a,"BbcyrR#"); + gr->Axis(); gr->Grid(); gr->Box(); + gr->Label('x',"B",1); gr->Label('y',"C",1); gr->Label('z',"Z",1); + + gr->SubPlot(2,2,1); gr->Title("Ternary axis (x+y+t=1)"); + gr->Ternary(1); + gr->Plot(x,y,"r2"); gr->Plot(rx,ry,"q^ "); gr->Cont(a,"BbcyrR"); + gr->Line(mglPoint(0.5,0), mglPoint(0,0.75), "g2"); + gr->Axis(); gr->Grid("xyz","B;"); + gr->Label('x',"B"); gr->Label('y',"C"); gr->Label('t',"A"); + + gr->SubPlot(2,2,2); gr->Title("Quaternary axis 3D"); + gr->Rotate(50,60); gr->Light(true); + gr->Ternary(2); + gr->Plot(x,y,z,"r2"); gr->Surf(a,"BbcyrR#"); + gr->Axis(); gr->Grid(); gr->Box(); + gr->Label('t',"A",1); gr->Label('x',"B",1); + gr->Label('y',"C",1); gr->Label('z',"D",1); + + gr->SubPlot(2,2,3); gr->Title("Ternary axis 3D"); + gr->Rotate(50,60); gr->Light(true); + gr->Ternary(1); + gr->Plot(x,y,z,"r2"); gr->Surf(a,"BbcyrR#"); + gr->Axis(); gr->Grid(); gr->Box(); + gr->Label('t',"A",1); gr->Label('x',"B",1); + gr->Label('y',"C",1); gr->Label('z',"Z",1); +} +//----------------------------------------------------------------------------- +const char *mmgl_projection="ranges 0 1 0 1 0 1\nnew x 50 '0.25*(1+cos(2*pi*x))'\n" +"new y 50 '0.25*(1+sin(2*pi*x))'\nnew z 50 'x'\nnew a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)'\n" +"new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx\nlight on\n\n" +"title 'Projection sample':ternary 4:rotate 50 60\nbox:axis:grid\n" +"plot x y z 'r2':surf a '#'\nxlabel 'X':ylabel 'Y':zlabel 'Z'\n"; +void smgl_projection(mglGraph *gr) // flag # +{ + gr->SetRanges(0,1,0,1,0,1); + mglData x(50),y(50),z(50),rx(10),ry(10), a(20,30); + a.Modify("30*x*y*(1-x-y)^2*(x+y<1)"); + x.Modify("0.25*(1+cos(2*pi*x))"); + y.Modify("0.25*(1+sin(2*pi*x))"); + rx.Modify("rnd"); ry.Modify("(1-v)*rnd",rx); + z.Modify("x"); + + if(!mini) gr->Title("Projection sample"); + gr->Ternary(4); + gr->Rotate(50,60); gr->Light(true); + gr->Plot(x,y,z,"r2"); gr->Surf(a,"#"); + gr->Axis(); gr->Grid(); gr->Box(); + gr->Label('x',"X",1); gr->Label('y',"Y",1); gr->Label('z',"Z",1); +} +//----------------------------------------------------------------------------- +const char *mmgl_projection5="ranges 0 1 0 1 0 1\nnew x 50 '0.25*(1+cos(2*pi*x))'\n" +"new y 50 '0.25*(1+sin(2*pi*x))'\nnew z 50 'x'\nnew a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)'\n" +"new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx\nlight on\n\n" +"title 'Projection sample (ternary)':ternary 5:rotate 50 60\nbox:axis:grid\n" +"plot x y z 'r2':surf a '#'\nxlabel 'X':ylabel 'Y':zlabel 'Z'\n"; +void smgl_projection5(mglGraph *gr) // flag # +{ + gr->SetRanges(0,1,0,1,0,1); + mglData x(50),y(50),z(50),rx(10),ry(10), a(20,30); + a.Modify("30*x*y*(1-x-y)^2*(x+y<1)"); + x.Modify("0.25*(1+cos(2*pi*x))"); + y.Modify("0.25*(1+sin(2*pi*x))"); + rx.Modify("rnd"); ry.Modify("(1-v)*rnd",rx); + z.Modify("x"); + + if(!mini) gr->Title("Projection sample (ternary)"); + gr->Ternary(5); + gr->Rotate(50,60); gr->Light(true); + gr->Plot(x,y,z,"r2"); gr->Surf(a,"#"); + gr->Axis(); gr->Grid(); gr->Box(); + gr->Label('x',"X",1); gr->Label('y',"Y",1); gr->Label('z',"Z",1); +} +//----------------------------------------------------------------------------- +const char *mmgl_triplot="list q 0 1 2 3 | 4 5 6 7 | 0 2 4 6 | 1 3 5 7 | 0 4 1 5 | 2 6 3 7\n" +"list xq -1 1 -1 1 -1 1 -1 1\nlist yq -1 -1 1 1 -1 -1 1 1\nlist zq -1 -1 -1 -1 1 1 1 1\nlight on\n" +"subplot 2 1 0:title 'QuadPlot sample':rotate 50 60\n" +"quadplot q xq yq zq 'yr'\nquadplot q xq yq zq '#k'\n" +"list t 0 1 2 | 0 1 3 | 0 2 3 | 1 2 3\n" +"list xt -1 1 0 0\nlist yt -1 -1 1 0\nlist zt -1 -1 -1 1\n" +"subplot 2 1 1:title 'TriPlot sample':rotate 50 60\n" +"triplot t xt yt zt 'b'\ntriplot t xt yt zt '#k'\n"; +void smgl_triplot(mglGraph *gr) +{ + double q[] = {0,1,2,3, 4,5,6,7, 0,2,4,6, 1,3,5,7, 0,4,1,5, 2,6,3,7}; + double xc[] = {-1,1,-1,1,-1,1,-1,1}, yc[] = {-1,-1,1,1,-1,-1,1,1}, zc[] = {-1,-1,-1,-1,1,1,1,1}; + mglData qq(6,4,q), xx(8,xc), yy(8,yc), zz(8,zc); + gr->Light(true); //gr->Alpha(true); + gr->SubPlot(2,1,0); gr->Title("QuadPlot sample"); gr->Rotate(50,60); + gr->QuadPlot(qq,xx,yy,zz,"yr"); + gr->QuadPlot(qq,xx,yy,zz,"k#"); + + double t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3}; + double xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1}; + mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt); + gr->SubPlot(2,1,1); gr->Title("TriPlot sample"); gr->Rotate(50,60); + gr->TriPlot(tt,uu,vv,ww,"b"); + gr->TriPlot(tt,uu,vv,ww,"k#"); +} +//----------------------------------------------------------------------------- +const char *mmgl_dots="new t 1000 'pi*(rnd-0.5)':new f 1000 '2*pi*rnd'\n" +"copy x 0.9*cos(t)*cos(f):copy y 0.9*cos(t)*sin(f):copy z 0.6*sin(t)\n" +"title 'Dots sample':rotate 50 60\nbox:dots x y z\n"; +void smgl_dots(mglGraph *gr) +{ + int i, n=1000; + mglData x(n),y(n),z(n); + for(i=0;iTitle("Dots sample"); + gr->Rotate(50,60); gr->Box(); gr->Dots(x,y,z); +} +//----------------------------------------------------------------------------- +/*void smgl_surf3_rgbd(mglGraph *gr) +{ + mglData c; mgls_prepare3d(&c); + gr->Rotate(40,60); gr->VertexColor(true); + gr->Box(); gr->Surf3(c,"bgrd"); +}*/ +//----------------------------------------------------------------------------- +const char *mmgl_mirror="new a 31 41 '-pi*x*exp(-(y+1)^2-4*x^2)'\n" +"subplot 2 2 0:title 'Options for coordinates':alpha on:light on:rotate 40 60:box\n" +"surf a 'r';yrange 0 1:surf a 'b';yrange 0 -1\n" +"subplot 2 2 1:title 'Option \"meshnum\"':rotate 40 60:box\n" +"mesh a 'r'; yrange 0 1:mesh a 'b';yrange 0 -1; meshnum 5\n" +"subplot 2 2 2:title 'Option \"alpha\"':rotate 40 60:box\n" +"surf a 'r';yrange 0 1; alpha 0.7:surf a 'b';yrange 0 -1; alpha 0.3\n" +"subplot 2 2 3 '<_':title 'Option \"legend\"'\n" +"fplot 'x^3' 'r'; legend 'y = x^3':fplot 'cos(pi*x)' 'b'; legend 'y = cos \\pi x'\n" +"box:axis:legend 2\n"; +void smgl_mirror(mglGraph *gr) // flag # +{ + mglData a(31,41); + gr->Fill(a,"-pi*x*exp(-(y+1)^2-4*x^2)"); + + if(!mini) { gr->SubPlot(2,2,0); gr->Title("Options for coordinates"); } + gr->Alpha(true); gr->Light(true); + gr->Rotate(40,60); gr->Box(); + gr->Surf(a,"r","yrange 0 1"); gr->Surf(a,"b","yrange 0 -1"); + if(mini) return; + gr->SubPlot(2,2,1); gr->Title("Option 'meshnum'"); + gr->Rotate(40,60); gr->Box(); + gr->Mesh(a,"r","yrange 0 1"); gr->Mesh(a,"b","yrange 0 -1; meshnum 5"); + gr->SubPlot(2,2,2); gr->Title("Option 'alpha'"); + gr->Rotate(40,60); gr->Box(); + gr->Surf(a,"r","yrange 0 1; alpha 0.7"); gr->Surf(a,"b","yrange 0 -1; alpha 0.3"); + gr->SubPlot(2,2,3,"<_"); gr->Title("Option 'legend'"); + gr->FPlot("x^3","r","legend 'y = x^3'"); gr->FPlot("cos(pi*x)","b","legend 'y = cos \\pi x'"); + gr->Box(); gr->Axis(); gr->Legend(2,""); +} +//----------------------------------------------------------------------------- +mglSample samp[] = { + {"alpha", smgl_alpha, mmgl_alpha }, + {"area", smgl_area, mmgl_area}, + {"aspect", smgl_aspect, mmgl_aspect }, + {"axial", smgl_axial, mmgl_axial }, + {"axis", smgl_axis, mmgl_axis}, + {"barh", smgl_barh, mmgl_barh}, + {"bars", smgl_bars, mmgl_bars}, + {"belt", smgl_belt, mmgl_belt}, + {"box", smgl_box, mmgl_box}, + {"boxplot", smgl_boxplot, mmgl_boxplot}, + {"boxs", smgl_boxs, mmgl_boxs}, + {"candle", smgl_candle, mmgl_candle}, + {"chart", smgl_chart, mmgl_chart}, + {"cloud", smgl_cloud, mmgl_cloud }, + {"colorbar", smgl_colorbar, mmgl_colorbar}, + {"combined", smgl_combined, mmgl_combined }, + {"cones", smgl_cones, mmgl_cones}, + {"cont", smgl_cont, mmgl_cont}, + {"cont_xyz", smgl_cont_xyz, mmgl_cont_xyz}, + {"conta", smgl_conta, mmgl_conta}, + {"contd", smgl_contd, mmgl_contd}, + {"contf", smgl_contf, mmgl_contf}, + {"contf_xyz", smgl_contf_xyz, mmgl_contf_xyz}, + {"contfa", smgl_contfa, mmgl_contfa}, + {"contv", smgl_contv, mmgl_contv}, +// {"crust", smgl_crust, mmgl_crust}, // TODO: open after triangulation + {"curvcoor", smgl_curvcoor, mmgl_curvcoor}, + {"cut", smgl_cut, mmgl_cut}, + {"dat_diff", smgl_dat_diff, mmgl_dat_diff}, + {"dat_extra", smgl_dat_extra, mmgl_dat_extra }, + {"dens", smgl_dens, mmgl_dens}, + {"dens_xyz", smgl_dens_xyz, mmgl_dens_xyz}, + {"densa", smgl_densa, mmgl_densa}, + {"dew", smgl_dew, mmgl_dew}, + {"dots", smgl_dots, mmgl_dots}, + {"error", smgl_error, mmgl_error }, + {"fall", smgl_fall, mmgl_fall}, + {"fit", smgl_fit, mmgl_fit}, + {"flow", smgl_flow, mmgl_flow}, + {"fog", smgl_fog, mmgl_fog}, + {"fonts", smgl_fonts, mmgl_fonts}, + {"grad", smgl_grad, mmgl_grad}, + {"hist", smgl_hist, mmgl_hist}, + {"inplot", smgl_inplot, mmgl_inplot}, + {"label", smgl_label, mmgl_label}, + {"legend", smgl_legend, mmgl_legend }, + {"loglog", smgl_loglog, mmgl_loglog}, + {"map", smgl_map, mmgl_map}, + {"mark", smgl_mark, mmgl_mark}, + {"mesh", smgl_mesh, mmgl_mesh}, + {"mirror", smgl_mirror, mmgl_mirror }, + {"molecule", smgl_molecule, mmgl_molecule }, + {"parser", smgl_parser, mmgl_parser}, + {"pde", smgl_pde, mmgl_pde}, + {"pipe", smgl_pipe, mmgl_pipe}, + {"plot", smgl_plot, mmgl_plot}, + {"primitives", smgl_primitives, mmgl_primitives }, + {"projection", smgl_projection, mmgl_projection }, + {"projection5", smgl_projection5, mmgl_projection5 }, + {"qo2d", smgl_qo2d, mmgl_qo2d}, + {"radar", smgl_radar, mmgl_radar}, + {"region", smgl_region, mmgl_region}, + {"schemes", smgl_schemes, mmgl_schemes }, + {"several_light", smgl_several_light, mmgl_several_light }, + {"solve", smgl_solve, mmgl_solve}, + {"stem", smgl_stem, mmgl_stem}, + {"step", smgl_step, mmgl_step}, + {"stereo", smgl_stereo, mmgl_stereo}, + {"stfa", smgl_stfa, mmgl_stfa}, + {"style", smgl_style, mmgl_style }, + {"surf", smgl_surf, mmgl_surf}, + {"surf3", smgl_surf3, mmgl_surf3}, + {"surf3a", smgl_surf3a, mmgl_surf3a}, + {"surf3c", smgl_surf3c, mmgl_surf3c}, + {"surfa", smgl_surfa, mmgl_surfa}, + {"surfc", smgl_surfc, mmgl_surfc}, + {"table", smgl_table, mmgl_table}, + {"tape", smgl_tape, mmgl_tape}, + {"tens", smgl_tens, mmgl_tens}, + {"ternary", smgl_ternary, mmgl_ternary }, + {"text", smgl_text, mmgl_text}, + {"textmark", smgl_textmark, mmgl_textmark}, + {"ticks", smgl_ticks, mmgl_ticks}, + {"tile", smgl_tile, mmgl_tile}, + {"tiles", smgl_tiles, mmgl_tiles}, + {"torus", smgl_torus, mmgl_torus }, + {"traj", smgl_traj, mmgl_traj}, + {"triangulation",smgl_triangulation, mmgl_triangulation }, + {"triplot", smgl_triplot, mmgl_triplot}, + {"tube", smgl_tube, mmgl_tube}, + {"type0", smgl_type0, mmgl_type0}, + {"type1", smgl_type1, mmgl_type1}, + {"type2", smgl_type2, mmgl_type2}, + {"vect", smgl_vect, mmgl_vect}, + {"vecta", smgl_vecta, mmgl_vecta}, + {"venn", smgl_venn, mmgl_venn}, +{"", NULL}}; +//----------------------------------------------------------------------------- diff --git a/examples/wnd_samples.cpp b/examples/wnd_samples.cpp index 92b160c..4d751e4 100644 --- a/examples/wnd_samples.cpp +++ b/examples/wnd_samples.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * wnd_sample.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -19,7 +19,6 @@ ***************************************************************************/ //----------------------------------------------------------------------------- #include "mgl2/mgl.h" -#include "mgl2/parser.h" //----------------------------------------------------------------------------- void mgls_prepare1d(mglData *y, mglData *y1=0, mglData *y2=0, mglData *x1=0, mglData *x2=0); void mgls_prepare2d(mglData *a, mglData *b=0, mglData *v=0); @@ -30,8 +29,28 @@ void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez); int test_wnd(mglGraph *gr) { mgl_set_test_mode(true); - gr->SetQuality(6); +// gr->SetQuality(6); + gr->NewFrame(); // 0 gr->Box(); + gr->EndFrame(); + gr->NewFrame(); // 1 + gr->Axis(); + gr->EndFrame(); + gr->NewFrame(); // 2 + gr->Label('x',"XXXX",0); + gr->Label('y',"YYYY",0); + gr->EndFrame(); + gr->NewFrame(); // 3 + gr->Puts(mglPoint(0,0),"0"); + gr->EndFrame(); + + gr->Clf(); + gr->ShowFrame(0); + gr->ShowFrame(1); + gr->ShowFrame(2); + gr->ShowFrame(3); + // gr->Puts(mglPoint(0,1),"1"); + gr->Finish(); return 0; } //----------------------------------------------------------------------------- diff --git a/examples/wx_example.cpp b/examples/wx_example.cpp index 3611237..c7a8685 100644 --- a/examples/wx_example.cpp +++ b/examples/wx_example.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * wx_example.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index 08b063a..794601d 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -7,6 +7,8 @@ install(DIRECTORY mgl2/ DESTINATION ${MGL_INCLUDE_PATH} PATTERN "glut.h" EXCLUDE PATTERN "wx.h" EXCLUDE PATTERN "qt.h" EXCLUDE + PATTERN "qmathgl.h" EXCLUDE + PATTERN "window.h" EXCLUDE PATTERN "*~" EXCLUDE PATTERN "*.fs" PATTERN "*.pas" @@ -23,5 +25,11 @@ if(MGL_HAVE_WX) install(FILES mgl2/wx.h DESTINATION ${MGL_INCLUDE_PATH}) endif(MGL_HAVE_WX) if(MGL_HAVE_QT) - install(FILES mgl2/qt.h DESTINATION ${MGL_INCLUDE_PATH}) + install(FILES mgl2/qt.h mgl2/qmathgl.h DESTINATION ${MGL_INCLUDE_PATH}) endif(MGL_HAVE_QT) + +#if(MGL_HAVE_FLTK AND MGL_HAVE_WX AND MGL_HAVE_QT) +if(MGL_HAVE_FLTK AND MGL_HAVE_QT) + install(FILES mgl2/window.h DESTINATION ${MGL_INCLUDE_PATH}) +#endif(MGL_HAVE_FLTK AND MGL_HAVE_WX AND MGL_HAVE_QT) +endif(MGL_HAVE_FLTK AND MGL_HAVE_QT) diff --git a/include/config.h.in b/include/config.h.in index 78639f8..629342d 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -1,7 +1,6 @@ #ifndef _MGL_CONFIG_H_ #define _MGL_CONFIG_H_ -/* This define enables double precision in MathGL */ #define MGL_USE_DOUBLE ${MGL_USE_DOUBLE} #define MGL_NO_DATA_A ${MGL_NO_DATA_A} @@ -14,21 +13,13 @@ #endif #define MGL_HAVE_HDF4 ${MGL_HAVE_HDF4} #define MGL_HAVE_HDF5 ${MGL_HAVE_HDF5} -#define MGL_HAVE_HDF5_18 ${MGL_HAVE_HDF5_18} #define MGL_HAVE_JPEG ${MGL_HAVE_JPEG} #define MGL_HAVE_PNG ${MGL_HAVE_PNG} #define MGL_HAVE_ZLIB ${MGL_HAVE_ZLIB} -#define MGL_HAVE_U3D ${MGL_HAVE_U3D} #define MGL_HAVE_PDF ${MGL_HAVE_PDF} #define MGL_HAVE_GIF ${MGL_HAVE_GIF} #define MGL_HAVE_OPENGL ${MGL_HAVE_OPENGL} -#define MGL_HAVE_GLUT ${MGL_HAVE_GLUT} -#define MGL_HAVE_FLTK ${MGL_HAVE_FLTK} -#define MGL_HAVE_WX ${MGL_HAVE_WX} -#define MGL_HAVE_QT ${MGL_HAVE_QT} -#define MGL_HAVE_PYTHON ${MGL_HAVE_PYTHON} -#define MGL_HAVE_OCTAVE ${MGL_HAVE_OCTAVE} -#define MGL_HAVE_DOC ${MGL_HAVE_DOC} #define MGL_HAVE_MPI ${MGL_HAVE_MPI} +#define MGL_FONT_PATH "${MGL_FONT_PATH}" #endif diff --git a/include/mgl2/addon.h b/include/mgl2/addon.h index c5fa787..3b25e2e 100644 --- a/include/mgl2/addon.h +++ b/include/mgl2/addon.h @@ -1,6 +1,6 @@ /*************************************************************************** * addon.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -19,48 +19,44 @@ ***************************************************************************/ #ifndef _MGL_ADDON_H_ #define _MGL_ADDON_H_ -/***************************************************************************/ +//----------------------------------------------------------------------------- +#include "mgl2/define.h" #ifdef __cplusplus -/***************************************************************************/ -#include -#ifndef dual -#define dual std::complex -#endif -//--------------------------------------------------------------------------- +//----------------------------------------------------------------------------- dual mgl_ipowc(dual x,int n); dual expi(dual a); dual expi(double a); -//--------------------------------------------------------------------------- + /// Explicit scheme for 1 step of axial diffraction bool mgl_difr_axial(dual *a, int n, dual q, int Border,dual *b, dual *d, int kk, double di); /// Explicit scheme for 1 step of plane diffraction bool mgl_difr_grid(dual *a,int n,dual q,int Border,dual *b,dual *d,int kk); -/***************************************************************************/ +//----------------------------------------------------------------------------- extern "C" { #endif -/***************************************************************************/ + double mgl_gauss_rnd(); -void mgl_fft_freq(double *freq,unsigned nn); -/***************************************************************************/ -/** Remove double spaces from the string */ +void mgl_fft_freq(double *freq,size_t nn); + +/// Remove double spaces from the string void mgl_strcls(char *str); -/** Get position of substring or return -1 if not found */ +/// Get position of substring or return -1 if not found int mgl_strpos(const char *str,char *fnd); -/** Get position of symbol or return -1 if not found */ +/// Get position of symbol or return -1 if not found int mgl_chrpos(const char *str,char fnd); -/***************************************************************************/ -/** Get uncommented string from file (NOTE: it is not thread safe!!!) */ + +/// Get uncommented string from file (NOTE: it is not thread safe!!!) char *mgl_fgetstr(FILE *fp); -/** Check if symbol denote true */ +/// Check if symbol denote true int mgl_istrue(char ch); -/** Print test message */ +/// Print test message void mgl_test(const char *str, ...); -/** Print info message */ +/// Print info message void mgl_info(const char *str, ...); -/** Locate next data block (block started by -----) */ +/// Locate next data block (block started by -----) FILE *mgl_next_data(const char *fname,int p); -/***************************************************************************/ + #ifdef __cplusplus -}; +} #endif #endif diff --git a/include/mgl2/base.h b/include/mgl2/base.h index ff57b3f..d66fbe7 100644 --- a/include/mgl2/base.h +++ b/include/mgl2/base.h @@ -1,6 +1,6 @@ /*************************************************************************** * base.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -19,22 +19,22 @@ ***************************************************************************/ #ifndef _MGL_BASE_H_ #define _MGL_BASE_H_ -#if !defined(_MSC_VER) && !defined(__BORLANDC__) +#if !defined(_MSC_VER) #include #endif #include "mgl2/define.h" -/*****************************************************************************/ + #ifdef __cplusplus #include #include #include "mgl2/type.h" #include "mgl2/eval.h" -#include "mgl2/font.h" //----------------------------------------------------------------------------- class mglBase; class mglData; class mglParser; class mglFormula; +class mglFont; typedef mglBase* HMGL; typedef mglData* HMDT; typedef mglParser* HMPR; @@ -45,11 +45,12 @@ typedef mglFormula* HMEX; typedef const mglData* HCDT; #include "mgl2/data.h" #else +//----------------------------------------------------------------------------- /// Abstract class for data array class mglDataA { public: - virtual ~mglDataA() {}; + virtual ~mglDataA() {} virtual mreal v(long i,long j=0,long k=0) const = 0; virtual mreal vthr(long i) const = 0; virtual long GetNx() const = 0; @@ -95,9 +96,9 @@ bool operator>(const mglPrim &a,const mglPrim &b); /// Structure for group of primitives struct mglGroup { - std::vector p;///< list of primitives (not filled!!!) + std::vector p; ///< list of primitives (not filled!!!) int Id; ///< Current list of primitives - std::string Lbl; ///< Group label + std::string Lbl; ///< Group label mglGroup(const char *lbl="", int id=0) { Lbl=lbl; Id=id; } }; //----------------------------------------------------------------------------- @@ -107,17 +108,17 @@ struct mglText std::wstring text; std::string stl; mreal val; - mglText(const wchar_t *txt=0, const char *fnt=0, mreal v=0) { text=txt; stl=fnt; val=v; } + mglText(const wchar_t *txt=L"", const char *fnt="", mreal v=0) { text=txt; stl=fnt; val=v; } mglText(const std::wstring &txt, mreal v=0) { text=txt; val=v; } }; //----------------------------------------------------------------------------- -/// Structure for internal point represenatation +/// Structure for internal point representation struct mglPnt // NOTE: use float for reducing memory size { float xx,yy,zz; // original coordinates - float x,y,z; // coordinates + float x,y,z; // coordinates float c,t,ta; // index in color scheme - float u,v,w; // normales + float u,v,w; // normales float r,g,b,a; // RGBA color mglPnt() { xx=yy=zz=x=y=z=c=t=ta=u=v=w=r=g=b=a=0; } }; @@ -138,6 +139,25 @@ inline mglPnt operator*(float b, const mglPnt &a) c.x*=b; c.y*=b; c.z*=b; c.u*=b; c.v*=b; c.w*=b; c.r*=b; c.g*=b; c.b*=b; c.a*=b; return c; } //----------------------------------------------------------------------------- +/// Structure for glyph representation +struct mglGlyph +{ + long nt, nl; ///< number of triangles and lines + short *trig, *line; ///< vertexes of triangles and lines + + mglGlyph() { nl=nt=0; trig=line=0; } + mglGlyph(const mglGlyph &a) { trig=line=0; *this=a; } + mglGlyph(long Nt, long Nl) { trig=line=0; Create(Nt,Nl); } + ~mglGlyph() { if(trig) delete []trig; if(line) delete []line; } + + void Create(long Nt, long Nl); + bool operator==(const mglGlyph &g); + inline mglGlyph &operator=(const mglGlyph &a) + { Create(a.nt, a.nl); memcpy(trig, a.trig, 6*nt*sizeof(short)); + memcpy(line, a.line, 2*nl*sizeof(short)); return *this; } +}; +//----------------------------------------------------------------------------- +/// Structure for texture (color scheme + palette) representation struct mglTexture { mglColor col[512]; ///< Colors itself @@ -152,10 +172,13 @@ struct mglTexture { n=0; Set(cols,smooth,alpha); } void Clear() { n=0; } void Set(const char *cols, int smooth=0,mreal alpha=1); + void Set(HCDT val, const char *cols); void GetC(mreal u,mreal v,mglPnt &p) const; + mglColor GetC(mreal u,mreal v=0) const; inline bool IsSame(const mglTexture &t) const { return n==t.n && !memcmp(col,t.col,512*sizeof(mglColor)); } - void GetRGBA(unsigned char *f) const; // Write as BGRA for fastest export to TGA + void GetRGBA(unsigned char *f) const; + void GetRGBAOBJ(unsigned char *f) const; // Export repeating border colors, since OBJ by default wraps textures and we need an extra boundary to work around implementation quirks }; //----------------------------------------------------------------------------- const mglColor NC(-1,-1,-1); @@ -171,6 +194,15 @@ struct mglColorID mglColor col; }; extern mglColorID mglColorIds[31]; +extern std::string mglGlobalMess; ///< Buffer for receiving global messages +//----------------------------------------------------------------------------- +/// Structure active points +struct mglActivePos +{ + int x,y; ///< coordinates of active point + int id; ///< object id for active point + int n; ///< position of active point in command (object id) +}; //----------------------------------------------------------------------------- /// Base class for canvas which handle all basic drawing class mglBase @@ -186,13 +218,15 @@ public: std::string Mess; ///< Buffer for receiving messages int ObjId; ///< object id for mglPrim int HighId; ///< object id to be highlited - std::vector Grp; ///< List of groups with names -- need for export + std::vector Grp; ///< List of groups with names -- need for export + std::vector Act; ///< Position of active points std::string PlotId; ///< Id of plot for saving filename (in GLUT window for example) mreal CDef; ///< Default (current) color in texture mreal AlphaDef; ///< Default value of alpha channel (transparency) mreal BarWidth; ///< Relative width of rectangles in Bars(). - int MeshNum; ///< Set approximate number of lines in Mesh and Grid. By default (=0) it draw all lines. + int MeshNum; ///< Set approximate number of lines in Mesh and Grid. By default (=0) it draw all lines. + int FaceNum; ///< Set approximate number of visible faces and lines. By default (=0) it draw everything. char Arrow1, Arrow2;///< Style of arrows at end and at start of curve long InUse; ///< Smart pointer (number of users) long Flag; ///< Flags for controlling drawing @@ -202,6 +236,8 @@ public: inline void clr(long fl) { Flag &=~fl; } inline void set(bool v,long fl) { Flag = v ? Flag|fl : Flag&(~fl); } + /// Set axis range scaling -- simplified way to shift/zoom axis range -- need to replot whole image! + inline void ZoomAxis(mglPoint p1=mglPoint(0,0,0,0), mglPoint p2=mglPoint(1,1,1,1)) { AMin = p1; AMax = p2; } /// Set values of mglGraph::Min and mglGraph::Max inline void SetRanges(mreal x1, mreal x2, mreal y1, mreal y2, mreal z1=0, mreal z2=0, mreal c1=0, mreal c2=0) { SetRanges(mglPoint(x1,y1,z1,c1),mglPoint(x2,y2,z2,c2)); } @@ -221,14 +257,13 @@ public: /// Set ranges for automatic variables void SetAutoRanges(mreal x1, mreal x2, mreal y1=0, mreal y2=0, mreal z1=0, mreal z2=0, mreal c1=0, mreal c2=0); /// Set axis origin - inline void SetOrigin(mreal x0, mreal y0, mreal z0=NAN, mreal c0=NAN) - { Org=mglPoint(x0,y0,z0,c0); } + void SetOrigin(mreal x0, mreal y0, mreal z0=NAN, mreal c0=NAN); /// Save ranges into internal variable and put parsed mreal SaveState(const char *opt); /// Load ranges from internal variable void LoadState(); /// Increase ZMin - mreal AdjustZMin() { ZMin /= MGL_EPSILON; return Max.z - ZMin*(Max.z-Min.z); } + mreal AdjustZMin() { ZMin /= MGL_FEPSILON; return Max.z - ZMin*(Max.z-Min.z); } /// Safetly set the transformation formulas for coordinate. void SetFunc(const char *EqX, const char *EqY, const char *EqZ=0, const char *EqA=0); @@ -257,19 +292,19 @@ public: virtual bool Alpha(bool enable) { bool t=get(MGL_ENABLE_ALPHA); set(enable,MGL_ENABLE_ALPHA); return t; } /// Set default value of alpha-channel - inline void SetAlphaDef(mreal val) { AlphaDef=val; }; + inline void SetAlphaDef(mreal val) { AlphaDef=val; } /// Set default palette inline void SetPalette(const char *colors) { Txt[0].Set(mgl_have_color(colors)?colors:MGL_DEF_PAL,-1); } - inline long GetNumPal(long id) const { return Txt[abs(id)/256].n; } + inline long GetNumPal(long id) const { return Txt[labs(id)/256].n; } /// Set default color scheme inline void SetDefScheme(const char *colors) { Txt[1].Set(mgl_have_color(colors)?colors:"BbcyrR"); } /// Set number of mesh lines - inline void SetMeshNum(int val) { MeshNum=val; }; + inline void SetMeshNum(int val) { MeshNum=val; } /// Set relative width of rectangles in Bars, Barh, BoxPlot - inline void SetBarWidth(mreal val) { BarWidth=val; }; + inline void SetBarWidth(mreal val) { BarWidth=val; } /// Set size of marks inline void SetMarkSize(mreal val) { MarkSize=0.02*val; } /// Set size of arrows @@ -288,33 +323,34 @@ public: /// Set FontSize by size in pt and picture DPI (default is 16 pt for dpi=72) virtual void SetFontSizePT(mreal pt, int dpi=72){ FontSize = pt*27.f/dpi; } /// Set FontSize by size in centimeters and picture DPI (default is 0.56 cm = 16 pt) - inline void SetFontSizeCM(mreal cm, int dpi=72) { SetFontSizePT(cm*28.45f,dpi); }; + inline void SetFontSizeCM(mreal cm, int dpi=72) { SetFontSizePT(cm*28.45f,dpi); } /// Set FontSize by size in inch and picture DPI (default is 0.22 in = 16 pt) - inline void SetFontSizeIN(mreal in, int dpi=72) { SetFontSizePT(in*72.27f,dpi); }; + inline void SetFontSizeIN(mreal in, int dpi=72) { SetFontSizePT(in*72.27f,dpi); } /// Set font typeface. Note that each mglFont instance can be used with ONLY ONE mglGraph instance at a moment of time! void SetFont(mglFont *f); /// Get current typeface. Note that this variable can be deleted at next SetFont() call! inline mglFont *GetFont() { return fnt; } /// Restore font - inline void RestoreFont() { fnt->Restore(); } + void RestoreFont(); /// Load font from file - inline void LoadFont (const char *name, const char *path=NULL) - { fnt->Load(name,path); }; + void LoadFont (const char *name, const char *path=NULL); /// Copy font from another mglGraph instance - inline void CopyFont(mglBase *gr) { fnt->Copy(gr->GetFont()); } + void CopyFont(mglBase *gr); /// Set default font size - inline void SetFontSize(mreal val) { FontSize=val>0 ? val:FontSize*val; } - inline mreal GetFontSize() const { return FontSize; }; - inline mreal TextWidth(const wchar_t *text, const char *font, mreal size) const - { return (size<0?-size*FontSize:size)*font_factor*fnt->Width(text,(font&&*font)?font:FontDef)/8; } - inline mreal TextHeight(const char *font, mreal size) const - { return (size<0?-size*FontSize:size)*font_factor*fnt->Height(font?font:FontDef)/8; } + inline void SetFontSize(mreal val) { FontSize=val>0 ? val:-FontSize*val; } + inline mreal GetFontSize() const { return FontSize; } + mreal TextWidth(const char *text, const char *font, mreal size) const; + mreal TextWidth(const wchar_t *text, const char *font, mreal size) const; + mreal TextHeight(const char *font, mreal size) const; inline mreal FontFactor() const { return font_factor; } virtual mreal GetRatio() const; + virtual int GetWidth() const; + virtual int GetHeight() const; + /// Set to use or not text rotation inline void SetRotatedText(bool val) { set(val,MGL_ENABLE_RTEXT); } /// Set default font style and color - inline void SetFontDef(const char *font) { strncpy(FontDef, font, 31); } + void SetFontDef(const char *font); /// Set to use or not text rotation inline void SetTickRotate(bool val) { set(val,MGL_TICKS_ROTATE); } /// Set to use or not text rotation @@ -331,25 +367,34 @@ public: inline int GetQuality() const { return Quality; } // ~~~~~~~~~~~~~~~~~~~~~~ Developer functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - /// Add point to the pntN and return its position + /// Add point to the Pnt and return its position long AddPnt(mglPoint p, mreal c=-1, mglPoint n=mglPoint(NAN), mreal a=-1, int scl=1); long CopyNtoC(long k, mreal c); long CopyProj(long from, mglPoint p, mglPoint n); - virtual void Reserve(long n); ///< Allocate n-cells for pntC and return current position - /// Set to reduce accuracy of points (to reduc size of output files) + virtual void Reserve(long n); ///< Allocate n-cells for Pnt and return current position + /// Set to reduce accuracy of points (to reduce size of output files) inline void SetReduceAcc(bool val) { set(val, MGL_REDUCEACC); } - -// inline long GetPos() { return Pnt.size()-1; } + /// Add glyph of current font to the Glf and return its position + long AddGlyph(int s, long j); + /// Add active point as k-th element of Pnt + void AddActive(long k,int n=0); + /// Clear unused points and primitives + void ClearUnused(); + inline mglPoint GetPntP(long i) const { const mglPnt &p=Pnt[i]; return mglPoint(p.x,p.y,p.z); } + inline mglPoint GetPntN(long i) const + { const mglPnt &p=Pnt[i]; return mglPoint(p.u,p.v,p.w); } inline float GetClrC(long i) const { return Pnt[i].c; } - inline const mglPnt &GetPnt(long i) const { return Pnt[i]; } + inline const mglGlyph &GetGlf(long i) const { return Glf[i]; } + inline long GetGlfNum() const { return Glf.size(); } + inline const mglPnt &GetPnt(long i) const { return Pnt[i]; } inline long GetPntNum() const { return Pnt.size(); } inline mglPrim &GetPrm(long i) { return Prm[i]; } inline long GetPrmNum() const { return Prm.size(); } - inline const mglText &GetPtx(long i) const { return Ptx[i]; } + inline const mglText &GetPtx(long i) const { return Ptx[i]; } inline long GetPtxNum() const { return Ptx.size(); } - inline const mglTexture &GetTxt(long i) const { return Txt[i]; } + inline const mglTexture &GetTxt(long i) const { return Txt[i]; } inline long GetTxtNum() const { return Txt.size(); } /// Scale coordinates and cut off some points virtual bool ScalePoint(mglPoint &p, mglPoint &n, bool use_nan=true) const; @@ -360,14 +405,14 @@ public: /// Get color depending on single variable z, which should be scaled if scale=true inline mreal GetC(long s,mreal z,bool scale = true) const - { return s+(scale?GetA(z):(z>0?z/MGL_EPSILON:0)); } - /// Get alpha value depending on single variable \a a + { return s+(scale?GetA(z):(z>0?z/MGL_FEPSILON:0)); } + /// Get alpha value depending on single variable a mreal GetA(mreal a) const; /// Set pen/palette char SetPenPal(const char *stl, long *id=0); /// Add texture (like color scheme) and return the position of first color long AddTexture(const char *cols, int smooth=0); -// inline mreal AddTexture(char col) { return AddTexture(mglColor(col)); }; +// inline mreal AddTexture(char col) { return AddTexture(mglColor(col)); } mreal AddTexture(mglColor col); inline void DefColor(mglColor col) { CDef = AddTexture(col); } /// Set next color from palette @@ -386,18 +431,24 @@ public: inline const char *last_line() { return last_style; } protected: + mglPoint OMin; ///< Lower edge for original axis (before scaling) + mglPoint OMax; ///< Upper edge for original axis (before scaling) + mglPoint AMin; ///< Lower edge for axis scaling + mglPoint AMax; ///< Upper edge for axis scaling mglPoint FMin; ///< Actual lower edge after transformation formulas. mglPoint FMax; ///< Actual upper edge after transformation formulas. mglPoint Org; ///< Center of axis cross section. int WarnCode; ///< Warning code - std::vector Pnt; ///< Internal points + std::vector Pnt; ///< Internal points std::vector Prm; ///< Primitives (lines, triangles and so on) -- need for export std::vector Sub; ///< InPlot regions {n1=x1,n2=x2,n3=y1,n4=y2,id} std::vector Ptx; ///< Text labels for mglPrim std::vector Leg; ///< Text labels for legend - std::vector Txt;///< Pointer to textures + std::vector Glf; ///< Glyphs data + std::vector Txt; ///< Pointer to textures #if MGL_HAVE_PTHREAD - pthread_mutex_t mutexPnt, mutexTxt, mutexLeg; + pthread_mutex_t mutexPnt, mutexTxt, mutexLeg, mutexGlf, mutexAct, mutexDrw; + pthread_mutex_t mutexSub, mutexPrm, mutexPtx, mutexStk, mutexGrp; #endif int TernAxis; ///< Flag that Ternary axis is used @@ -430,6 +481,7 @@ private: mglPoint MinS; ///< Saved lower edge of bounding box for graphics. mglPoint MaxS; ///< Saved upper edge of bounding box for graphics. mreal MSS, ASS, FSS, ADS, MNS, LSS; ///< Saved state + mreal PrevState; ///< Previous value of SaveState() long CSS; ///< Saved flags bool saved; ///< State is saved std::string leg_str;///< text to be save in legend @@ -443,6 +495,7 @@ private: void ClearEq(); ///< Clear the used variables for axis transformation }; //----------------------------------------------------------------------------- +bool mgl_check_dim0(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *name, bool less=false); bool mgl_check_dim1(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *name, bool less=false); bool mgl_check_dim2(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, bool less=false); bool mgl_check_dim3(HMGL gr, bool both, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *name); @@ -465,5 +518,4 @@ typedef void *HMEX; typedef void *HMPR; typedef const void *HCDT; #endif -/*****************************************************************************/ #endif diff --git a/include/mgl2/base_cf.h b/include/mgl2/base_cf.h index 1391d2e..f4b2b69 100644 --- a/include/mgl2/base_cf.h +++ b/include/mgl2/base_cf.h @@ -1,6 +1,6 @@ /*************************************************************************** * base_cf.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,111 +20,148 @@ #ifndef _MGL_BASE_CF_H_ #define _MGL_BASE_CF_H_ #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ + +/// Get last warning code int mgl_get_warn(HMGL gr); +int mgl_get_warn_(uintptr_t *gr); +/// Set warning code ant fill message void mgl_set_warn(HMGL gr, int code, const char *text); +void mgl_set_warn_(uintptr_t *gr, int *code, const char *text,int); +/// Set buffer for warning messages const char *mgl_get_mess(HMGL gr); + +/// Get bit-value flag of HMGL state (for advanced users only) int mgl_get_flag(HMGL gr, long flag); +/// Set bit-value flag of HMGL state (for advanced users only) void mgl_set_flag(HMGL gr, int val, long flag); - +/// Change counter of HMGL uses (for advanced users only). Non-zero counter prevent automatic object removing. long mgl_use_graph(HMGL gr, int inc); +long mgl_use_graph_(uintptr_t *gr, int *inc); +void mgl_set_rdc_acc(HMGL gr, int reduce); // TODO +void mgl_set_rdc_acc_(uintptr_t *gr, int *reduce); + +/// Start group of objects void mgl_start_group(HMGL gr, const char *); +void mgl_start_group_(uintptr_t *gr, const char *,int); +/// End group of objects void mgl_end_group(HMGL gr); +void mgl_end_group_(uintptr_t *gr); +/// Highlight objects with given id void mgl_highlight(HMGL gr, int id); +void mgl_highlight_(uintptr_t *gr, int *id); +/// Set default palette void mgl_set_palette(HMGL gr, const char *colors); -void mgl_set_alpha_default(HMGL graph, mreal alpha); -void mgl_set_bar_width(HMGL graph, mreal width); -void mgl_set_meshnum(HMGL graph, int num); -void mgl_set_ambbr(HMGL gr, mreal i); -void mgl_set_light_dif(HMGL gr, int enable); - -void mgl_set_rdc_acc(HMGL graph, int reduce); -void mgl_set_cut(HMGL graph, int cut); -void mgl_set_cut_box(HMGL gr, mreal x1,mreal y1,mreal z1,mreal x2,mreal y2,mreal z2); -void mgl_set_ranges(HMGL graph, mreal x1, mreal x2, mreal y1, mreal y2, mreal z1, mreal z2); -void mgl_set_range_val(HMGL gr, char dir, mreal v1,mreal v2); -void mgl_set_range_dat(HMGL gr, char dir, HCDT a, int add); - -void mgl_set_origin(HMGL graph, mreal x0, mreal y0, mreal z0); -void mgl_set_func(HMGL graph, const char *EqX,const char *EqY,const char *EqZ,const char *EqA); -void mgl_set_coor(HMGL gr, int how); -void mgl_set_ternary(HMGL gr, int enable); -void mgl_set_cutoff(HMGL graph, const char *EqC); - -void mgl_set_tick_rotate(HMGL graph, int enable); -void mgl_set_tick_skip(HMGL graph, int enable); - -mreal mgl_data_get_value(HCDT d, long i, long j, long k); -long mgl_data_get_nx(HCDT d); -long mgl_data_get_ny(HCDT d); -long mgl_data_get_nz(HCDT d); - -void mgl_set_mark_size(HMGL graph, mreal size); -void mgl_set_arrow_size(HMGL graph, mreal size); -void mgl_set_font_size(HMGL graph, mreal size); -void mgl_set_font_def(HMGL graph, const char *fnt); -void mgl_set_rotated_text(HMGL graph, int enable); -void mgl_load_font(HMGL gr, const char *name, const char *path); -void mgl_copy_font(HMGL gr, HMGL gr_from); -void mgl_restore_font(HMGL gr); -void mgl_set_color(char id, mreal r, mreal g, mreal b); +void mgl_set_palette_(uintptr_t *gr, const char *colors, int); +void mgl_set_pal_color_(uintptr_t *gr, int *n, mreal *r, mreal *g, mreal *b); +void mgl_set_pal_num_(uintptr_t *gr, int *num); +/// Sets RGB values for color with given id +void mgl_set_color(char id, double r, double g, double b); +void mgl_set_color_(char *id, mreal *r, mreal *g, mreal *b, int); +/// Set default color scheme void mgl_set_def_sch(HMGL gr, const char *sch); -/*****************************************************************************/ void mgl_set_def_sch_(uintptr_t *gr, const char *sch,int); -void mgl_set_color_(char *id, mreal *r, mreal *g, mreal *b, int); -int mgl_get_warn_(uintptr_t *gr); -void mgl_set_warn_(uintptr_t *gr, int *code, const char *text,int); -long mgl_use_graph_(uintptr_t *gr, int *inc); -void mgl_start_group_(uintptr_t *gr, const char *,int); -void mgl_end_group_(uintptr_t *gr); -void mgl_highlight_(uintptr_t *gr, int *id); -void mgl_set_palette_(uintptr_t *gr, const char *colors, int); -void mgl_set_pal_color_(uintptr_t *graph, int *n, mreal *r, mreal *g, mreal *b); -void mgl_set_pal_num_(uintptr_t *graph, int *num); -void mgl_set_alpha_default_(uintptr_t *graph, mreal *alpha); -void mgl_set_bar_width_(uintptr_t *graph, mreal *width); -void mgl_set_meshnum_(uintptr_t *graph, int *num); +/// Set default value of alpha-channel +void mgl_set_alpha_default(HMGL gr, double alpha); +void mgl_set_alpha_default_(uintptr_t *gr, mreal *alpha); +/// Set relative width of rectangles in Bars, Barh, BoxPlot +void mgl_set_bar_width(HMGL gr, double width); +void mgl_set_bar_width_(uintptr_t *gr, mreal *width); +/// Set number of mesh lines (use 0 to draw all of them) +void mgl_set_meshnum(HMGL gr, int num); +void mgl_set_meshnum_(uintptr_t *gr, int *num); +/// Set number of visible faces (use 0 to draw all of them) +void mgl_set_facenum(HMGL gr, int num); +void mgl_set_facenum_(uintptr_t *gr, int *num); +/// Clear unused points and primitives. Useful only in combination with mgl_set_facenum(). +void mgl_clear_unused(HMGL gr); +void mgl_clear_unused_(uintptr_t *gr); + +/// Set ambient light brightness +void mgl_set_ambbr(HMGL gr, double i); void mgl_set_ambbr_(uintptr_t *gr, mreal *i); -void mgl_set_light_dif_(uintptr_t *graph, int *enable); +/// Use diffusive light (only for local light sources) +void mgl_set_light_dif(HMGL gr, int enable); +void mgl_set_light_dif_(uintptr_t *gr, int *enable); + +/// Set cutting for points outside of bounding box +void mgl_set_cut(HMGL gr, int cut); +void mgl_set_cut_(uintptr_t *gr, int *cut); +/// Set additional cutting box +void mgl_set_cut_box(HMGL gr, double x1,double y1,double z1,double x2,double y2,double z2); +void mgl_set_cut_box_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2); +/// Set the cutting off condition (formula) +void mgl_set_cutoff(HMGL gr, const char *EqC); +void mgl_set_cutoff_(uintptr_t *gr, const char *EqC, int); -void mgl_set_rdc_acc_(uintptr_t *graph, int *reduce); -void mgl_set_cut_(uintptr_t *graph, int *cut); -void mgl_set_cut_box_(uintptr_t *gr, mreal *x1,mreal *y1,mreal *z1,mreal *x2,mreal *y2,mreal *z2); -void mgl_set_ranges_(uintptr_t *graph, mreal *x1, mreal *x2, mreal *y1, mreal *y2, mreal *z1, mreal *z2); -void mgl_set_range_val_(uintptr_t *gr, const char *dir, mreal *v1,mreal *v2,int); +/// Set values of axis range +void mgl_set_ranges(HMGL gr, double x1, double x2, double y1, double y2, double z1, double z2); +void mgl_set_ranges_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2, mreal *z1, mreal *z2); +/// Set range in direction dir as [v1, v2] +void mgl_set_range_val(HMGL gr, char dir, double v1,double v2); +void mgl_set_range_val_(uintptr_t *gr, const char *dir, mreal *v1, mreal *v2,int); +/// Set range in direction dir as minimal and maximal values of data a +void mgl_set_range_dat(HMGL gr, char dir, HCDT a, int add); void mgl_set_range_dat_(uintptr_t *gr, const char *dir, uintptr_t *a, int *add,int); +/// Set axis range scaling -- simplified way to shift/zoom axis range -- need to redraw whole image! +void mgl_zoom_axis(HMGL gr, double x1,double y1,double z1,double c1,double x2,double y2,double z2,double c2); +void mgl_zoom_axis_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *c1, mreal *x2, mreal *y2, mreal *z2, mreal *c2); +/// Set axis origin +void mgl_set_origin(HMGL gr, double x0, double y0, double z0); void mgl_set_origin_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0); -void mgl_set_func_(uintptr_t *graph, const char *EqX, const char *EqY, const char *EqZ, const char *EqA, int, int, int, int); +/// Set the transformation formulas for coordinate +void mgl_set_func(HMGL gr, const char *EqX,const char *EqY,const char *EqZ,const char *EqA); +void mgl_set_func_(uintptr_t *gr, const char *EqX, const char *EqY, const char *EqZ, const char *EqA, int, int, int, int); +/// Set one of predefined transformation rule +void mgl_set_coor(HMGL gr, int how); void mgl_set_coor_(uintptr_t *gr, int *how); -void mgl_set_ternary_(uintptr_t *graph, int *enable); -void mgl_set_cutoff_(uintptr_t *graph, const char *EqC, int); - -void mgl_set_tick_rotate_(uintptr_t *graph, int *enable); -void mgl_set_tick_skip_(uintptr_t *graph, int *enable); +/// Set to draw Ternary axis (triangle like axis, grid and so on) +void mgl_set_ternary(HMGL gr, int enable); +void mgl_set_ternary_(uintptr_t *gr, int *enable); -mreal mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k); -long mgl_data_get_nx_(uintptr_t *d); -long mgl_data_get_ny_(uintptr_t *d); -long mgl_data_get_nz_(uintptr_t *d); +/// Set to use or not tick labels rotation +void mgl_set_tick_rotate(HMGL gr, int enable); +void mgl_set_tick_rotate_(uintptr_t *gr, int *enable); +/// Set to use or not tick labels skipping +void mgl_set_tick_skip(HMGL gr, int enable); +void mgl_set_tick_skip_(uintptr_t *gr, int *enable); -void mgl_set_mark_size_(uintptr_t *graph, mreal *size); -void mgl_set_arrow_size_(uintptr_t *graph, mreal *size); -void mgl_set_font_size_(uintptr_t *graph, mreal *size); -void mgl_set_font_def_(uintptr_t *graph, const char *fnt, int); -void mgl_set_rotated_text_(uintptr_t *graph, int *enable); +/// Set default font for all new HMGL objects +void mgl_def_font(const char *name, const char *path); +void mgl_def_font_(const char *name, const char *path,int,int); +/// Set default size of marks (locally you can use "size" option) +void mgl_set_mark_size(HMGL gr, double size); +void mgl_set_mark_size_(uintptr_t *gr, mreal *size); +/// Set default size of arrows (locally you can use "size" option) +void mgl_set_arrow_size(HMGL gr, double size); +void mgl_set_arrow_size_(uintptr_t *gr, mreal *size); +/// Set default font size +void mgl_set_font_size(HMGL gr, double size); +void mgl_set_font_size_(uintptr_t *gr, mreal *size); +/// Set default font style and color +void mgl_set_font_def(HMGL gr, const char *fnt); +void mgl_set_font_def_(uintptr_t *gr, const char *fnt, int); +/// Set to use or not text rotation +void mgl_set_rotated_text(HMGL gr, int enable); +void mgl_set_rotated_text_(uintptr_t *gr, int *enable); +/// Load font from file +void mgl_load_font(HMGL gr, const char *name, const char *path); void mgl_load_font_(uintptr_t *gr, char *name, char *path, int l, int n); +/// Copy font from another mglGraph instance +void mgl_copy_font(HMGL gr, HMGL gr_from); void mgl_copy_font_(uintptr_t *gr, uintptr_t *gr_from); +/// Restore font (load default font for new HMGL objects) +void mgl_restore_font(HMGL gr); void mgl_restore_font_(uintptr_t *gr); -/*****************************************************************************/ + #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/canvas.h b/include/mgl2/canvas.h index 8937e3b..2189f66 100644 --- a/include/mgl2/canvas.h +++ b/include/mgl2/canvas.h @@ -1,6 +1,6 @@ /*************************************************************************** * canvas.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -45,10 +45,10 @@ struct mglMatrix /// Structure for drawing axis and ticks struct mglAxis { - mglAxis() { dv=ds=d=v0=v1=v2=o=sh=0; ns=f=ch=*t=0; } + mglAxis() { dv=ds=d=v0=v1=v2=o=sh=0; ns=f=ch=*t=0; pos = 't'; } mglAxis(const mglAxis &aa) { dv=aa.dv; ds=aa.ds; d=aa.d; dir=aa.dir; sh=aa.sh; - v0=aa.v0; v1=aa.v1; v2=aa.v2; o=aa.o; + v0=aa.v0; v1=aa.v1; v2=aa.v2; o=aa.o; pos=aa.pos; a = aa.a; b = aa.b; org=aa.org; txt=aa.txt; ns=aa.ns; f=aa.f; ch=aa.ch; wcscpy(t,aa.t); } inline void AddLabel(const wchar_t *lbl, mreal v) @@ -59,7 +59,7 @@ struct mglAxis mreal dv,ds; ///< Actual step for ticks and subticks. mreal d; ///< Step for axis ticks (if positive) or its number (if negative). int ns; ///< Number of axis subticks. - wchar_t t[256]; ///< Tick template (set NULL to use default one ("%.2g" in simplest case)) + wchar_t t[256]; ///< Tick template (set "" to use default one ("%.2g" in simplest case)) mglPoint dir; ///< Axis direction mglPoint a,b; ///< Directions of over axis mglPoint org; @@ -70,6 +70,7 @@ struct mglAxis int f; ///< Flag 0x1 - time, 0x2 - manual, 0x4 - fixed dv std::vector txt; ///< Axis labels char ch; ///< Character of axis (like 'x','y','z','c') + char pos; ///< Text position ('t' by default, or 'T' for opposite) mreal sh; ///< Extra shift of ticks and axis labels }; //----------------------------------------------------------------------------- @@ -91,6 +92,9 @@ class mglCanvas; /// Structure for light source struct mglDrawReg { + unsigned PDef; + int ObjId; + mreal PenWidth, pPos; int x1,x2,y1,y2; void set(mglCanvas *gr, int nx, int ny, int m); }; @@ -98,13 +102,11 @@ struct mglDrawReg /// Structure contains everything for drawing struct mglDrawDat { - std::vector Grp; ///< List of groups with names -- need for export - std::vector Pnt; ///< Internal points + std::vector Pnt; ///< Internal points std::vector Prm; ///< Primitives (lines, triangles and so on) -- need for export - std::vector Sub; ///< InPlot regions {n1=x1,n2=x2,n3=y1,n4=y2,id} std::vector Ptx; ///< Text labels for mglPrim - std::vector Leg; ///< Text labels for legend - std::vector Txt;///< Pointer to textures + std::vector Glf; ///< Glyphs data + std::vector Txt; ///< Pointer to textures }; //----------------------------------------------------------------------------- /// Class contains all functionality for creating different mathematical plots @@ -125,12 +127,12 @@ using mglBase::Light; /// Zoom in or zoom out (if Zoom(0, 0, 1, 1)) a part of picture virtual void Zoom(mreal x1, mreal y1, mreal x2, mreal y2); /// Restore image after View() and Zoom() - virtual void Restore() { Bp.clear(); Bp.pf=0; } + inline void Restore() { Zoom(0,0,1,1); } /// Clear transformation matrix. inline void Identity(bool rel=false) { InPlot(0,1,0,1,rel); } /// Push transformation matrix into stack - inline void Push() { stack.push_back(B); } + inline void Push() { MGL_PUSH(stack,B,mutexStk); } /// Set PlotFactor inline void SetPlotFactor(mreal val) { if(val<=0) {B.pf=1.55; set(MGL_AUTO_FACTOR);} else {B.pf=val; clr(MGL_AUTO_FACTOR);} } @@ -182,17 +184,19 @@ using mglBase::Light; inline void SetDelay(mreal d) { Delay=d; } /// Calculate 3D coordinate {x,y,z} for screen point {xs,ys} - mglPoint CalcXYZ(int xs, int ys) const; + mglPoint CalcXYZ(int xs, int ys, bool real=false) const; /// Calculate screen point {xs,ys} for 3D coordinate {x,y,z} void CalcScr(mglPoint p, int *xs, int *ys) const; mglPoint CalcScr(mglPoint p) const; /// Set object/subplot id inline void SetObjId(long id) { ObjId = id; } /// Get object id - inline int GetObjId(long x,long y) const { return OI[x+Width*y]; } + inline int GetObjId(long xs,long ys) const { return OI[xs+Width*ys]; } /// Get subplot id - int GetSplId(long x,long y) const; - + int GetSplId(long xs,long ys) const; + /// Check if there is active point or primitive (n=-1) + int IsActive(int xs, int ys,int &n); + /// Create new frame. virtual int NewFrame(); /// Finish frame drawing @@ -200,8 +204,16 @@ using mglBase::Light; /// Get the number of created frames inline int GetNumFrame() const { return CurFrameId; } /// Reset frames counter (start it from zero) - inline void ResetFrames() { CurFrameId=0; DrwDat.clear(); } - + virtual void ResetFrames(); + /// Delete primitives for i-th frame + virtual void DelFrame(long i); + /// Get drawing data for i-th frame. + void GetFrame(long i); + /// Set drawing data for i-th frame. This work as EndFrame() but don't add frame to GIF image. + virtual void SetFrame(long i); + /// Add drawing data from i-th frame to the current drawing + void ShowFrame(long i); + /// Start write frames to cinema using GIF format void StartGIF(const char *fname, int ms=100); /// Stop writing cinema using GIF format @@ -212,6 +224,8 @@ using mglBase::Light; bool ExportMGLD(const char *fname, const char *descr=0); /// Import points and primitives from file using MGLD format bool ImportMGLD(const char *fname, bool add=false); + /// Export in JSON format suitable for later drawing by JavaScript + bool WriteJSON(const char *fname); /// Set the transparency type inline void SetTranspType(int val) @@ -243,21 +257,21 @@ using mglBase::Light; void AdjustTicks(const char *dir="xyzc", bool force=false); /// Tune ticks inline void SetTuneTicks(int tune, mreal pos=1.15) - { TuneTicks = tune; FactorPos = pos; }; + { TuneTicks = tune; FactorPos = pos; } /// Set ticks styles void SetAxisStl(const char *stl="k", const char *tck=0, const char *sub=0); /// Set ticks length void SetTickLen(mreal tlen, mreal stt=1.); - /// Draws bounding box outside the plotting volume with color \a c. + /// Draws bounding box outside the plotting volume with color c. void Box(const char *col=0, bool ticks=true); - /// Draw axises with ticks in directions determined by string parameter \a dir. - void Axis(const char *dir="xyzt", const char *stl=""); - /// Draw grid lines perpendicular to direction determined by string parameter \a dir. - void Grid(const char *dir="xyzt",const char *pen="B-"); - /// Print the label \a text for axis \a dir. - void Label(char dir, const char *text, mreal pos=0, mreal shift=0); - void Labelw(char dir, const wchar_t *text, mreal pos=0, mreal shift=0); + /// Draw axises with ticks in directions determined by string parameter dir. + void Axis(const char *dir="xyzt", const char *stl="", const char *opt=""); + /// Draw grid lines perpendicular to direction determined by string parameter dir. + void Grid(const char *dir="xyzt",const char *pen="B-", const char *opt=""); + /// Print the label text for axis dir. + void Label(char dir, const char *text, mreal pos=0, const char *opt=""); + void Labelw(char dir, const wchar_t *text, mreal pos=0, const char *opt=""); /// Draw colorbar at edge of axis void Colorbar(const char *sch=0); @@ -266,19 +280,22 @@ using mglBase::Light; void Colorbar(HCDT v, const char *sch=0); void Colorbar(HCDT v, const char *sch, mreal x, mreal y, mreal w, mreal h); - /// Draw legend of accumulated strings at position (x, y) by \a font with \a size - inline void Legend(mreal x, mreal y, const char *font="#", mreal size=-0.8, mreal llen=0.1) - { Legend(Leg,x,y,font,size,llen); } - /// Draw legend of accumulated strings by \a font with \a size - inline void Legend(int where=0x3, const char *font="#", mreal size=-0.8, mreal llen=0.1) - { Legend(Leg,(where&1)?1:0,(where&2)?1:0,font,size,llen); } - /// Draw legend of accumulated strings by \a font with \a size - inline void Legend(const std::vector &leg, int where=3, const char *font="#", mreal size=-0.8, mreal llen=0) - { Legend(leg,(where&1)?1:0,(where&2)?1:0,font,size,llen); } - /// Draw legend strings \a text at position (x, y) by \a font with \a size - void Legend(const std::vector &leg, mreal x, mreal y, const char *font="#", mreal size=-0.8, mreal llen=0); + /// Draw legend of accumulated strings at position (x, y) by font with size + inline void Legend(mreal x, mreal y, const char *font="#", const char *opt="") + { Legend(Leg,x,y,font,opt); } + /// Draw legend of accumulated strings by font with size + inline void Legend(int where=0x3, const char *font="#", const char *opt="") + { Legend(Leg,(where&1)?1:0,(where&2)?1:0,font,opt); } + /// Draw legend of accumulated strings by font with size + inline void Legend(const std::vector &leg, int where=3, const char *font="#", const char *opt="") + { Legend(leg,(where&1)?1:0,(where&2)?1:0,font,opt); } + /// Draw legend strings text at position (x, y) by font with size + void Legend(const std::vector &leg, mreal x, mreal y, const char *font="#", const char *opt=""); /// Number of marks in legend sample - inline void SetLegendMarks(int num=1) { LegendMarks = num>0?num:1; }; + inline void SetLegendMarks(int num=1) { LegendMarks = num>0?num:1; } + + /// Draw table for values val along given direction with row labels text at given position + void Table(mreal x, mreal y, HCDT val, const wchar_t *text, const char *fnt, const char *opt); void StartAutoGroup (const char *); void EndGroup(); @@ -297,9 +314,6 @@ protected: unsigned char *G4; ///< Final picture in RGBA format. Prepared in Finish(). unsigned char *G; ///< Final picture in RGB format. Prepared in Finish(). std::vector DrwDat; ///< Set of ALL drawing data for each frames -#if MGL_HAVE_PTHREAD - pthread_mutex_t mutexSub, mutexPrm, mutexPtx, mutexStk, mutexGrp; -#endif int LegendMarks; ///< Number of marks in the Legend unsigned char BDef[4]; ///< Background color @@ -321,6 +335,7 @@ protected: mglMatrix B; ///< Transformation matrix mglMatrix B1; ///< Transformation matrix for colorbar mreal inW, inH; ///< Width and height of last InPlot + mreal inX, inY; ///< Coordinates of last InPlot mglLight light[10]; ///< Light sources mreal FogDist; ///< Inverse fog distance (fog ~ exp(-FogDist*Z)) mreal FogDz; ///< Relative shift of fog @@ -330,7 +345,7 @@ protected: /// Prepare labels for ticks void LabelTicks(mglAxis &aa); /// Draw axis - void DrawAxis(mglAxis &aa, bool text=true, char arr=0,const char *stl=""); + void DrawAxis(mglAxis &aa, bool text=true, char arr=0,const char *stl="",const char *opt=""); /// Draw axis grid lines void DrawGrid(mglAxis &aa); /// Update axis ranges @@ -340,27 +355,24 @@ protected: ax.v2=Max.x; ay.v2=Max.y; az.v2=Max.z; ac.v2=Max.c; } /// Clear ZBuffer only - void ClfZB(); + void ClfZB(bool force=false); /// Scale coordinates and cut off some points bool ScalePoint(mglPoint &p, mglPoint &n, bool use_nan=true) const; void LightScale(); ///< Additionally scale positions of light sources - /// Push drawing data (for frames only). NOTE: can be VERY large long PushDrwDat(); - /// Get drawing data for i-th frame. - void GetDrwDat(long i); - + mreal GetOrgX(char dir) const; ///< Get Org.x (parse NAN value) mreal GetOrgY(char dir) const; ///< Get Org.y (parse NAN value) mreal GetOrgZ(char dir) const; ///< Get Org.z (parse NAN value) - void mark_plot(long p, char type, mreal size=1); // position in pntC - void arrow_plot(long p1, long p2, char st); // position in pntC - void line_plot(long p1, long p2); // position in pntC - void trig_plot(long p1, long p2, long p3); // position in pntN - void quad_plot(long p1, long p2, long p3, long p4); // position in pntN + void mark_plot(long p, char type, mreal size=1); + void arrow_plot(long p1, long p2, char st); + void line_plot(long p1, long p2); + void trig_plot(long p1, long p2, long p3); + void quad_plot(long p1, long p2, long p3, long p4); void Glyph(mreal x, mreal y, mreal f, int style, long icode, mreal col); - mreal text_plot(long p,const wchar_t *text,const char *fnt,mreal size=-1,mreal sh=0,mreal col=-('k'), bool rot=true); // position in pntN + mreal text_plot(long p,const wchar_t *text,const char *fnt,mreal size=-1,mreal sh=0,mreal col=-('k'), bool rot=true); void add_prim(mglPrim &a); ///< add primitive to list void mark_draw(long p, char type, mreal size, mglDrawReg *d); @@ -369,19 +381,24 @@ protected: virtual void trig_draw(long p1, long p2, long p3, bool anorm, mglDrawReg *d); virtual void quad_draw(long p1, long p2, long p3, long p4, mglDrawReg *d); virtual void pnt_draw(long p, mglDrawReg *d); + void arrow_draw(long n1, long n2, char st, float ll); + void arrow_plot_3d(long p1, long p2, char st, float ll); void glyph_draw(const mglPrim *P, mglDrawReg *d); bool IsSame(const mglPrim &pr,mreal wp,mglColor cp,int st); + // restore normalized coordinates from screen ones + mglPoint RestorePnt(mglPoint ps, bool norm=false) const; + // functions for multi-threading void PreparePrim(bool fast); - void pxl_combine(unsigned long id, unsigned long n, const void *); - void pxl_memcpy(unsigned long id, unsigned long n, const void *); - void pxl_backgr(unsigned long id, unsigned long n, const void *); - void pxl_primdr(unsigned long id, unsigned long n, const void *); - void pxl_transform(unsigned long id, unsigned long n, const void *); - void pxl_setz(unsigned long id, unsigned long n, const void *); - void pxl_setz_adv(unsigned long id, unsigned long n, const void *); - void pxl_other(unsigned long id, unsigned long n, const void *p); + void pxl_combine(size_t id, size_t n, const void *); + void pxl_memcpy(size_t id, size_t n, const void *); + void pxl_backgr(size_t id, size_t n, const void *); + void pxl_primdr(size_t id, size_t n, const void *); + void pxl_transform(size_t id, size_t n, const void *); + void pxl_setz(size_t id, size_t n, const void *); + void pxl_setz_adv(size_t id, size_t n, const void *); + void pxl_other(size_t id, size_t n, const void *p); /// Put drawing from other mglCanvas (for multithreading, like subplots) void PutDrawReg(mglDrawReg *d, const mglCanvas *gr); @@ -391,44 +408,50 @@ private: int dr_nx1, dr_nx2, dr_ny1, dr_ny2; // Allowed drawing region GifFileType *gif; mreal fscl,ftet; ///< last scale and rotation for glyphs + long forg; ///< original point (for directions) + size_t grp_counter; ///< Counter for StartGroup(); EndGroup(); /// Draw generic colorbar void colorbar(HCDT v, const mreal *s, int where, mreal x, mreal y, mreal w, mreal h); /// Draw labels for ticks void DrawLabels(mglAxis &aa); + /// Get label style + char GetLabelPos(mreal c, long kk, mglAxis &aa); /// Draw tick void tick_draw(mglPoint o, mglPoint d1, mglPoint d2, int f, const char *stl); - /// Plot point \a p with color \a c - void pnt_plot(long x,long y,mreal z,const unsigned char c[4]); + /// Plot point p with color c + void pnt_plot(long x,long y,mreal z,const unsigned char c[4], int obj_id); mreal FindOptOrg(char dir, int ind) const; /// Transform mreal color and alpha to bits format - unsigned char* col2int(const mglPnt &p, unsigned char *r); + unsigned char* col2int(const mglPnt &p, unsigned char *r, int obj_id); /// Combine colors in 2 plane. - void combine(unsigned char *c1,unsigned char *c2); + void combine(unsigned char *c1, const unsigned char *c2); /// Fast drawing of line between 2 points void fast_draw(long p1, long p2, mglDrawReg *d); - /// Additionally scale points \a p for positioning in image + /// Additionally scale points p for positioning in image void PostScale(mglPoint &p) const; - /// Scale points \a p for projection to the face number \a nface in image - long ProjScale(int nface, long p); + /// Scale points p for projection to the face number nface in image + long ProjScale(int nface, long p, bool text=false); inline void PostScale(mglPoint *p,long n) const { for(long i=0;i * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,336 +20,493 @@ #ifndef MGL_CANVAS_CF_H #define MGL_CANVAS_CF_H #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ + +/// Create HMGL object with specified sizes HMGL mgl_create_graph(int width, int height); -void mgl_delete_graph(HMGL graph); +uintptr_t mgl_create_graph_(int *width, int *height); +/// Delete HMGL object +void mgl_delete_graph(HMGL gr); +void mgl_delete_graph_(uintptr_t *gr); +/// Set size of frame in pixels. Normally this function is called internally. void mgl_set_size(HMGL gr, int width, int height); +void mgl_set_size_(uintptr_t *gr, int *width, int *height); +/// Set default parameters for plotting void mgl_set_def_param(HMGL gr); +void mgl_set_def_param_(uintptr_t *gr); +/// Set plot quality void mgl_set_quality(HMGL gr, int qual); +void mgl_set_quality_(uintptr_t *gr, int *qual); +/// Combine plots from 2 canvases. Result will be saved into gr void mgl_combine_gr(HMGL gr, HMGL in); +void mgl_combine_gr_(uintptr_t *gr, uintptr_t *in); +/// Force preparing the image. It can be useful for OpenGL mode mostly. +void mgl_finish(HMGL gr); +void mgl_finish_(uintptr_t *gr); -void mgl_set_tick_len(HMGL gr, mreal len, mreal stt); +/// Set tick length +void mgl_set_tick_len(HMGL gr, double len, double stt); +void mgl_set_tick_len_(uintptr_t *gr, mreal *len, mreal *stt); +/// Set axis and ticks style void mgl_set_axis_stl(HMGL gr, const char *stl, const char *tck, const char *sub); +void mgl_set_axis_stl_(uintptr_t *gr, const char *stl, const char *tck, const char *sub, int,int,int); + +/// Auto adjust ticks void mgl_adjust_ticks(HMGL gr, const char *dir); -void mgl_set_ticks(HMGL gr, char dir, mreal d, int ns, mreal org); +void mgl_adjust_ticks_(uintptr_t *gr, const char *dir, int); +/// Set the ticks parameters +void mgl_set_ticks(HMGL gr, char dir, double d, int ns, double org); +void mgl_set_ticks_(uintptr_t *gr, char *dir, mreal *d, int *ns, mreal *org, int); +/// Set ticks text (\n separated). Use "" to disable this feature. void mgl_set_ticks_str(HMGL gr, char dir, const char *lbl, int add); +void mgl_set_ticks_str_(uintptr_t *gr, const char *dir, const char *lbl, int *add,int,int); void mgl_set_ticks_wcs(HMGL gr, char dir, const wchar_t *lbl, int add); +/// Set ticks position and text (\n separated). Use "" to disable this feature. void mgl_set_ticks_val(HMGL gr, char dir, HCDT val, const char *lbl, int add); +void mgl_set_ticks_val_(uintptr_t *gr, const char *dir, uintptr_t *val, const char *lbl, int *add,int,int); void mgl_set_ticks_valw(HMGL gr, char dir, HCDT val, const wchar_t *lbl, int add); -void mgl_tune_ticks(HMGL gr, int tune, mreal fact_pos); +/// Tune ticks +void mgl_tune_ticks(HMGL gr, int tune, double fact_pos); +void mgl_tune_ticks_(uintptr_t *gr, int *tune, mreal *fact_pos); +/// Set templates for ticks void mgl_set_tick_templ(HMGL gr, char dir, const char *templ); +void mgl_set_tick_templ_(uintptr_t *gr, const char *dir, const char *templ,int,int); void mgl_set_tick_templw(HMGL gr, char dir, const wchar_t *templ); -void mgl_set_ticks_time(HMGL gr, char dir, mreal d, const char *t); -void mgl_set_tick_shift(HMGL gr, mreal sx, mreal sy, mreal sz, mreal sc); +/// Set time templates for ticks +void mgl_set_ticks_time(HMGL gr, char dir, double d, const char *t); +void mgl_set_ticks_time_(uintptr_t *gr, const char *dir, mreal *d, const char *t,int,int); +/// Set additional shift of tick labels +void mgl_set_tick_shift(HMGL gr, double sx, double sy, double sz, double sc); +void mgl_set_tick_shift_(uintptr_t *gr, mreal *sx, mreal *sy, mreal *sz, mreal *sc); -void mgl_box(HMGL graph); +/// Draws bounding box outside the plotting volume +void mgl_box(HMGL gr); +void mgl_box_(uintptr_t *gr); +/// Draws bounding box outside the plotting volume with color c void mgl_box_str(HMGL gr, const char *col, int ticks); -void mgl_axis(HMGL gr, const char *dir, const char *stl); -void mgl_axis_grid(HMGL gr, const char *dir,const char *pen); -void mgl_label(HMGL gr, char dir, const char *text); -void mgl_label_ext(HMGL gr, char dir, const char *text, mreal pos, mreal shift); -void mgl_labelw_ext(HMGL gr, char dir, const wchar_t *text, mreal pos, mreal shift); +void mgl_box_str_(uintptr_t *gr, const char *col, int *ticks, int); +/// Draw axises with ticks in direction(s) dir. +void mgl_axis(HMGL gr, const char *dir, const char *stl, const char *opt); +void mgl_axis_(uintptr_t *gr, const char *dir, const char *stl, const char *opt,int,int,int); +/// Draw grid lines perpendicular to direction(s) dir. +void mgl_axis_grid(HMGL gr, const char *dir,const char *pen, const char *opt); +void mgl_axis_grid_(uintptr_t *gr, const char *dir,const char *pen, const char *opt,int,int,int); +/// Print the label text for axis dir. +void mgl_label(HMGL gr, char dir, const char *text, double pos, const char *opt); +void mgl_label_(uintptr_t *gr, const char *dir, const char *text, const char *opt,int,int,int); +void mgl_labelw(HMGL gr, char dir, const wchar_t *text, double pos, const char *opt); +/// Draw colorbar at edge of axis void mgl_colorbar(HMGL gr, const char *sch); -void mgl_colorbar_ext(HMGL gr, const char *sch, mreal x, mreal y, mreal w, mreal h); +void mgl_colorbar_(uintptr_t *gr, const char *sch,int); +/// Draw colorbar at manual position +void mgl_colorbar_ext(HMGL gr, const char *sch, double x, double y, double w, double h); +void mgl_colorbar_ext_(uintptr_t *gr, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, int); +/// Draw colorbar with manual colors at edge of axis void mgl_colorbar_val(HMGL gr, HCDT dat, const char *sch); -void mgl_colorbar_val_ext(HMGL gr, HCDT dat, const char *sch,mreal x, mreal y, mreal w, mreal h); +void mgl_colorbar_val_(uintptr_t *gr, uintptr_t *dat, const char *sch,int); +/// Draw colorbar with manual colors at manual position +void mgl_colorbar_val_ext(HMGL gr, HCDT dat, const char *sch,double x, double y, double w, double h); +void mgl_colorbar_val_ext_(uintptr_t *gr, uintptr_t *dat, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, int); +/// Add string to legend void mgl_add_legend(HMGL gr, const char *text,const char *style); +void mgl_add_legend_(uintptr_t *gr, const char *text,const char *style,int,int); void mgl_add_legendw(HMGL gr, const wchar_t *text,const char *style); -void mgl_clear_legend(HMGL graph); -void mgl_legend_pos(HMGL gr, mreal x, mreal y, const char *font, mreal size, mreal llen); -void mgl_legend(HMGL gr, int where, const char *font, mreal size, mreal llen); +/// Clear saved legend string +void mgl_clear_legend(HMGL gr); +void mgl_clear_legend_(uintptr_t *gr); +/// Draw legend of accumulated strings at position {x,y} +void mgl_legend_pos(HMGL gr, double x, double y, const char *font, const char *opt); +void mgl_legend_pos_(uintptr_t *gr, mreal *x, mreal *y, const char *font, const char *opt,int,int); +/// Draw legend of accumulated strings +void mgl_legend(HMGL gr, int where, const char *font, const char *opt); +void mgl_legend_(uintptr_t *gr, int *where, const char *font, const char *opt,int,int); +/// Set number of marks in legend sample void mgl_set_legend_marks(HMGL gr, int num); +void mgl_set_legend_marks_(uintptr_t *gr, int *num); -HMEX mgl_create_expr(const char *expr); -void mgl_delete_expr(HMEX ex); -mreal mgl_expr_eval(HMEX ex, mreal x, mreal y,mreal z); -mreal mgl_expr_eval_v(HMEX ex, mreal *var); -mreal mgl_expr_diff(HMEX ex, char dir, mreal x, mreal y,mreal z); -mreal mgl_expr_diff_v(HMEX ex, char dir, mreal *var); - +/// Show current image void mgl_show_image(HMGL gr, const char *viewer, int keep); +void mgl_show_image_(uintptr_t *gr, const char *viewer, int *keep, int); +/// Write the frame in file (depending extension, write current frame if fname is empty) void mgl_write_frame(HMGL gr, const char *fname,const char *descr); +void mgl_write_frame_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using BMP format void mgl_write_tga(HMGL gr, const char *fname,const char *descr); +void mgl_write_tga_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using BMP format void mgl_write_bmp(HMGL gr, const char *fname,const char *descr); +void mgl_write_bmp_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using JPEG format void mgl_write_jpg(HMGL gr, const char *fname,const char *descr); +void mgl_write_jpg_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using PNG format with transparency void mgl_write_png(HMGL gr, const char *fname,const char *descr); +void mgl_write_png_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using PNG format without transparency void mgl_write_png_solid(HMGL gr, const char *fname,const char *descr); +void mgl_write_png_solid_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using PostScript format as bitmap void mgl_write_bps(HMGL gr, const char *fname,const char *descr); +void mgl_write_bps_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using PostScript format void mgl_write_eps(HMGL gr, const char *fname,const char *descr); +void mgl_write_eps_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using SVG format void mgl_write_svg(HMGL gr, const char *fname,const char *descr); +void mgl_write_svg_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using LaTeX format void mgl_write_tex(HMGL gr, const char *fname,const char *descr); +void mgl_write_tex_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using OBJ format void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png); +void mgl_write_obj_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int,int); +/// Write the frame in file using STL format (faces only) void mgl_write_stl(HMGL gr, const char *fname,const char *descr); +void mgl_write_stl_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Write the frame in file using OFF format void mgl_write_off(HMGL gr, const char *fname,const char *descr, int colored); +void mgl_write_off_(uintptr_t *gr, const char *fname,const char *descr,int *colored,int,int); +/// Write the frame in file using XYZ format void mgl_write_xyz(HMGL gr, const char *fname,const char *descr); -//void mgl_write_x3d(HMGL gr, const char *fname,const char *descr); +void mgl_write_xyz_(uintptr_t *gr, const char *fname,const char *descr,int,int); + +/*void mgl_write_x3d(HMGL gr, const char *fname,const char *descr); +void mgl_write_x3d_(uintptr_t *gr, const char *fname,const char *descr,int,int); void mgl_write_wgl(HMGL gr, const char *fname,const char *descr); +void mgl_write_wgl_(uintptr_t *gr, const char *fname,const char *descr,int,int);*/ + +/// Write the frame in file using PRC format void mgl_write_prc(HMGL gr, const char *fname,const char *descr, int make_pdf); +void mgl_write_prc_(uintptr_t *gr, const char *fname,const char *descr, int *make_pdf,int,int); +/// Write the frame in file using GIF format (only for current frame!) void mgl_write_gif(HMGL gr, const char *fname,const char *descr); +void mgl_write_gif_(uintptr_t *gr, const char *fname,const char *descr,int,int); + +/// Start write frames to cinema using GIF format void mgl_start_gif(HMGL gr, const char *fname,int ms); -void mgl_close_gif(HMGL graph); +void mgl_start_gif_(uintptr_t *gr, const char *fname,int *ms,int); +/// Stop writing cinema using GIF format +void mgl_close_gif(HMGL gr); +void mgl_close_gif_(uintptr_t *gr); +/// Set name of plot for saving filename void mgl_set_plotid(HMGL gr, const char *id); +void mgl_set_plotid_(uintptr_t *gr, const char *id,int); + +/// Export points and primitives in file using MGLD format void mgl_export_mgld(HMGL gr, const char *fname,const char *descr); +void mgl_export_mgld_(uintptr_t *gr, const char *fname,const char *descr,int,int); +/// Import points and primitives from file using MGLD format void mgl_import_mgld(HMGL gr, const char *fname, int add); +void mgl_import_mgld_(uintptr_t *gr, const char *fname, int *add, int); +/// Export in JSON format suitable for later drawing by JavaScript +void mgl_write_json(HMGL gr, const char *fname,const char *descr); +void mgl_write_json_(uintptr_t *gr, const char *fname,const char *descr,int,int); -const unsigned char *mgl_get_rgb(HMGL graph); -const unsigned char *mgl_get_rgba(HMGL graph); +/// Get RGB values of current bitmap +const unsigned char *mgl_get_rgb(HMGL gr); +const unsigned char *mgl_get_rgb_(uintptr_t *gr); +/// Get RGBA values of current bitmap +const unsigned char *mgl_get_rgba(HMGL gr); +const unsigned char *mgl_get_rgba_(uintptr_t *gr); +/// Set object/subplot id void mgl_set_obj_id(HMGL gr, int id); -int mgl_get_obj_id(HMGL gr, long x, long y); -int mgl_get_spl_id(HMGL gr, long x, long y); -int mgl_get_width(HMGL graph); -int mgl_get_height(HMGL graph); +void mgl_set_obj_id_(uintptr_t *gr, int *id); +/// Get object id +int mgl_get_obj_id(HMGL gr, int x, int y); +int mgl_get_obj_id_(uintptr_t *gr, int *x, int *y); +/// Get subplot id +int mgl_get_spl_id(HMGL gr, int x, int y); +int mgl_get_spl_id_(uintptr_t *gr, int *x, int *y); +/// Get width of the image +int mgl_get_width(HMGL gr); +int mgl_get_width_(uintptr_t *gr); +/// Get height of the image +int mgl_get_height(HMGL gr); +int mgl_get_height_(uintptr_t *gr); +/// Calculate 3D coordinate {x,y,z} for screen point {xs,ys} void mgl_calc_xyz(HMGL gr, int xs, int ys, mreal *x, mreal *y, mreal *z); -void mgl_calc_scr(HMGL gr, mreal x, mreal y, mreal z, int *xs, int *ys); +void mgl_calc_xyz_(uintptr_t *gr, int *xs, int *ys, mreal *x, mreal *y, mreal *z); +/// Calculate screen point {xs,ys} for 3D coordinate {x,y,z} +void mgl_calc_scr(HMGL gr, double x, double y, double z, int *xs, int *ys); +void mgl_calc_scr_(uintptr_t *gr, mreal *x, mreal *y, mreal *z, int *xs, int *ys); +/// Check if {xs,ys} is close to active point with accuracy d, and return its position or -1 +long mgl_is_active(HMGL gr, int xs, int ys, int d); +long mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d); -int mgl_new_frame(HMGL graph); -void mgl_end_frame(HMGL graph); -int mgl_get_num_frame(HMGL graph); -void mgl_reset_frames(HMGL graph); +/// Create new frame. +int mgl_new_frame(HMGL gr); +int mgl_new_frame_(uintptr_t *gr); +/// Finish frame drawing +void mgl_end_frame(HMGL gr); +void mgl_end_frame_(uintptr_t *gr); +/// Get the number of created frames +int mgl_get_num_frame(HMGL gr); +int mgl_get_num_frame_(uintptr_t *gr); +/// Reset frames counter (start it from zero) +void mgl_reset_frames(HMGL gr); +void mgl_reset_frames_(uintptr_t *gr); +/// Get drawing data for i-th frame (work if MGL_VECT_FRAME is set on) +void mgl_get_frame(HMGL gr, int i); +void mgl_get_frame_(uintptr_t *gr, int *i); +/// Set drawing data for i-th frame (work if MGL_VECT_FRAME is set on) +void mgl_set_frame(HMGL gr, int i); +void mgl_set_frame_(uintptr_t *gr, int *i); +/// Append drawing data from i-th frame (work if MGL_VECT_FRAME is set on) +void mgl_show_frame(HMGL gr, int i); +void mgl_show_frame_(uintptr_t *gr, int *i); +/// Delete primitives for i-th frame (work if MGL_VECT_FRAME is set on) +void mgl_del_frame(HMGL gr, int i); +void mgl_del_frame_(uintptr_t *gr, int *i); +/// Set the transparency type (0 - usual, 1 - glass, 2 - lamp) void mgl_set_transp_type(HMGL gr, int type); +void mgl_set_transp_type_(uintptr_t *gr, int *type); +/// Set the transparency on/off. void mgl_set_alpha(HMGL gr, int enable); -void mgl_set_fog(HMGL gr, mreal d, mreal dz); +void mgl_set_alpha_(uintptr_t *gr, int *enable); +/// Set the fog distance or switch it off (if d=0). +void mgl_set_fog(HMGL gr, double d, double dz); +void mgl_set_fog_(uintptr_t *gr, mreal *dist, mreal *dz); +/// Set the using of light on/off. void mgl_set_light(HMGL gr, int enable); +void mgl_set_light_(uintptr_t *gr, int *enable); +/// Switch on/off the specified light source. void mgl_set_light_n(HMGL gr, int n, int enable); +void mgl_set_light_n_(uintptr_t *gr, int *n, int *enable); + +/// Add white light source at infinity. +void mgl_add_light(HMGL gr, int n, double x, double y, double z); +void mgl_add_light_(uintptr_t *gr, int *n, mreal *x, mreal *y, mreal *z); +/// Add light source at infinity (more settings). +void mgl_add_light_ext(HMGL gr, int n, double x, double y, double z, char c, double br, double ap); +void mgl_add_light_ext_(uintptr_t *gr, int *n, mreal *x, mreal *y, mreal *z, char *c, mreal *br, mreal *ap, int); +/// Add local light source. +void mgl_add_light_loc(HMGL gr, int n, double x, double y, double z, double dx, double dy, double dz, char c, double br, double ap); +void mgl_add_light_loc_(uintptr_t *gr, int *n, mreal *x, mreal *y, mreal *z, mreal *dx, mreal *dy, mreal *dz, char *c, mreal *br, mreal *ap, int); +/// Pop transformation matrix from stack void mgl_mat_pop(HMGL gr); +void mgl_mat_pop_(uintptr_t *gr); +/// Push transformation matrix into stack void mgl_mat_push(HMGL gr); -void mgl_clf(HMGL graph); -void mgl_clf_rgb(HMGL gr, mreal r, mreal g, mreal b); +void mgl_mat_push_(uintptr_t *gr); -void mgl_subplot_d(HMGL gr, int nx,int ny,int m,const char *style, mreal dx, mreal dy); +/// Clear up the frame +void mgl_clf(HMGL gr); +void mgl_clf_(uintptr_t *gr); +/// Clear up the frame and fill background by specified color +void mgl_clf_rgb(HMGL gr, double r, double g, double b); +void mgl_clf_rgb_(uintptr_t *gr, mreal *r, mreal *g, mreal *b); + +/// Put further plotting in some region of whole frame. void mgl_subplot(HMGL gr, int nx,int ny,int m,const char *style); +void mgl_subplot_(uintptr_t *gr, int *nx,int *ny,int *m, const char *s,int); +/// Put further plotting in some region of whole frame and shift it by distance {dx,dy}. +void mgl_subplot_d(HMGL gr, int nx,int ny,int m,const char *style, double dx, double dy); +void mgl_subplot_d_(uintptr_t *gr, int *nx,int *ny,int *m, mreal *dx, mreal *dy); +/// Like mgl_subplot() but "join" several cells void mgl_multiplot(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style); -void mgl_inplot(HMGL gr, mreal x1,mreal x2,mreal y1,mreal y2); -void mgl_relplot(HMGL gr, mreal x1,mreal x2,mreal y1,mreal y2); -void mgl_columnplot(HMGL gr, int num, int ind, mreal d); -void mgl_gridplot(HMGL gr, int nx, int ny, int m, mreal d); -void mgl_stickplot(HMGL gr, int num, int ind, mreal tet, mreal phi); -void mgl_title(HMGL gr, const char *title, const char *stl, mreal size); -void mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, mreal size); -void mgl_set_plotfactor(HMGL gr, mreal val); - -void mgl_aspect(HMGL gr, mreal Ax,mreal Ay,mreal Az); -void mgl_rotate(HMGL gr, mreal TetX,mreal TetZ,mreal TetY); -void mgl_view(HMGL gr, mreal TetX,mreal TetZ,mreal TetY); -void mgl_zoom(HMGL gr, mreal x1, mreal y1, mreal x2, mreal y2); -void mgl_rotate_vector(HMGL gr, mreal Tet,mreal x,mreal y,mreal z); -void mgl_perspective(HMGL gr, mreal val); - -void mgl_draw_thr(void *); -/*****************************************************************************/ -uintptr_t mgl_create_graph_(int *width, int *height); -void mgl_delete_graph_(uintptr_t *graph); -void mgl_set_size_(uintptr_t *graph, int *width, int *height); -void mgl_set_def_param_(uintptr_t *gr); -void mgl_set_quality_(uintptr_t *gr, int *qual); -void mgl_combine_gr_(uintptr_t *gr, uintptr_t *in); - -void mgl_set_tick_len_(uintptr_t *graph, mreal *len, mreal *stt); -void mgl_set_axis_stl_(uintptr_t *graph, const char *stl, const char *tck, const char *sub, int,int,int); -void mgl_set_tick_shift_(uintptr_t *gr, mreal *sx, mreal *sy, mreal *sz, mreal *sc); - -void mgl_adjust_ticks_(uintptr_t *gr, const char *dir, int l); -void mgl_set_ticks_(uintptr_t *gr, char *dir, mreal *d, int *ns, mreal *org, int); -void mgl_set_ticks_str_(uintptr_t *gr, const char *dir, const char *lbl, int *add,int,int l); -void mgl_set_ticks_val_(uintptr_t *gr, const char *dir, uintptr_t *val, const char *lbl, int *add,int,int l); -void mgl_tune_ticks_(uintptr_t *gr, int *tune, mreal *fact_pos); -void mgl_set_tick_templ_(uintptr_t *gr, const char *dir, const char *templ,int,int l); -void mgl_set_ticks_time_(uintptr_t *gr, const char *dir, mreal *d, const char *t,int,int l); -void mgl_box_(uintptr_t *gr); -void mgl_box_str_(uintptr_t *gr, const char *col, int *ticks, int l); -void mgl_axis_(uintptr_t *gr, const char *dir, const char *stl,int,int); -void mgl_axis_grid_(uintptr_t *gr, const char *dir,const char *pen,int l,int n); -void mgl_label_(uintptr_t *gr, const char *dir, const char *text,int,int l); -void mgl_label_ext_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, mreal *shift,int,int l); -/*****************************************************************************/ -void mgl_colorbar_(uintptr_t *gr, const char *sch,int l); -void mgl_colorbar_ext_(uintptr_t *gr, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, int l); -void mgl_colorbar_val_(uintptr_t *gr, uintptr_t *dat, const char *sch,int l); -void mgl_colorbar_val_ext_(uintptr_t *gr, uintptr_t *dat, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, int l); - -void mgl_add_legend_(uintptr_t *gr, const char *text,const char *style,int l,int n); -void mgl_clear_legend_(uintptr_t *gr); -void mgl_legend_pos_(uintptr_t *gr, mreal *x, mreal *y, const char *font, mreal *size, mreal *llen,int l); -void mgl_legend_(uintptr_t *gr, int *where, const char *font, mreal *size, mreal *llen,int l); -void mgl_set_legend_marks_(uintptr_t *gr, int *num); - -uintptr_t mgl_create_expr_(const char *expr, int); -void mgl_delete_expr_(uintptr_t *ex); -mreal mgl_eval_expr_(uintptr_t *ex, mreal *x, mreal *y,mreal *z); -mreal mgl_diff_expr_(uintptr_t *ex, const char *dir, mreal *x, mreal *y,mreal *z, int); - -void mgl_show_image_(uintptr_t *graph, const char *viewer, int *keep, int); -void mgl_write_frame_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_tga_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_bmp_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_jpg_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_png_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_png_solid_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_eps_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_svg_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_prc_(uintptr_t *graph, const char *fname,const char *descr, int *make_pdf,int lf,int ld); -void mgl_write_gif_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_start_gif_(uintptr_t *graph, const char *fname,int *ms,int l); -void mgl_close_gif_(uintptr_t *graph); -void mgl_write_obj_(uintptr_t *graph, const char *fname,const char *descr, int *use_png,int lf,int ld); -void mgl_write_stl_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_off_(uintptr_t *graph, const char *fname,const char *descr,int *colored,int lf,int ld); -void mgl_write_xyz_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -//void mgl_write_x3d_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_tex_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_write_wgl_(uintptr_t *graph, const char *fname,const char *descr,int lf,int ld); -void mgl_set_plotid_(uintptr_t *gr, const char *id,int l); -void mgl_export_mgld_(uintptr_t *gr, const char *fname,const char *descr,int l,int n); -void mgl_import_mgld_(uintptr_t *gr, const char *fname, int *add, int l); - -const unsigned char *mgl_get_rgb_(uintptr_t *graph); -const unsigned char *mgl_get_rgba_(uintptr_t *graph); -void mgl_set_obj_id_(uintptr_t *graph, int *id); -int mgl_get_obj_id_(uintptr_t *graph, int *x, int *y); -int mgl_get_spl_id_(uintptr_t *graph, int *x, int *y); -int mgl_get_width_(uintptr_t *graph); -int mgl_get_height_(uintptr_t *graph); -void mgl_calc_xyz_(uintptr_t *gr, int *xs, int *ys, mreal *x, mreal *y, mreal *z); -void mgl_calc_scr_(uintptr_t *gr, mreal *x, mreal *y, mreal *z, int *xs, int *ys); - -int mgl_new_frame_(uintptr_t *graph); -void mgl_end_frame_(uintptr_t *graph); -int mgl_get_num_frame_(uintptr_t *graph); -void mgl_reset_frames_(uintptr_t *graph); +void mgl_multiplot_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy, const char *s,int); +/// Put further plotting in a region of whole frame. +void mgl_inplot(HMGL gr, double x1,double x2,double y1,double y2); +void mgl_inplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2); +/// Put further plotting in a region of current subplot/inplot. +void mgl_relplot(HMGL gr, double x1,double x2,double y1,double y2); +void mgl_relplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2); +/// Put further plotting in column cell of previous subplot/inplot. +void mgl_columnplot(HMGL gr, int num, int ind, double d); +void mgl_columnplot_(uintptr_t *gr, int *num, int *i, mreal *d); +/// Put further plotting in matrix cell of previous subplot/inplot. +void mgl_gridplot(HMGL gr, int nx, int ny, int m, double d); +void mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *i, mreal *d); +/// Put further plotting in cell of stick rotated on angles tet, phi. +void mgl_stickplot(HMGL gr, int num, int ind, double tet, double phi); +void mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi); +/// Add title for current subplot/inplot. +void mgl_title(HMGL gr, const char *title, const char *stl, double size); +void mgl_title_(uintptr_t *gr, const char *title, const char *stl, mreal *size, int,int); +void mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, double size); +/// Set factor of plot size +void mgl_set_plotfactor(HMGL gr, double val); +void mgl_set_plotfactor_(uintptr_t *gr, mreal *val); -void mgl_set_transp_type_(uintptr_t *graph, int *type); -void mgl_set_alpha_(uintptr_t *graph, int *enable); -void mgl_set_fog_(uintptr_t *graph, mreal *dist, mreal *dz); -void mgl_set_light_(uintptr_t *graph, int *enable); -void mgl_set_light_n_(uintptr_t *gr, int *n, int *enable); -void mgl_add_light_(uintptr_t *graph, int *n, mreal *x, mreal *y, mreal *z); -void mgl_add_light(HMGL gr, int n, mreal x, mreal y, mreal z); -void mgl_add_light_ext_(uintptr_t *graph, int *n, mreal *x, mreal *y, mreal *z, char *c, mreal *br, mreal *ap, int); -void mgl_add_light_ext(HMGL gr, int n, mreal x, mreal y, mreal z, char c, mreal br, mreal ap); -void mgl_add_light_loc_(uintptr_t *graph, int *n, mreal *x, mreal *y, mreal *z, mreal *dx, mreal *dy, mreal *dz, char *c, mreal *br, mreal *ap, int); -void mgl_add_light_loc(HMGL gr, int n, mreal x, mreal y, mreal z, mreal dx, mreal dy, mreal dz, char c, mreal br, mreal ap); +/// Set aspect ratio for further plotting. +void mgl_aspect(HMGL gr, double Ax,double Ay,double Az); +void mgl_aspect_(uintptr_t *gr, mreal *Ax, mreal *Ay, mreal *Az); +/// Rotate a further plotting. +void mgl_rotate(HMGL gr, double TetX,double TetZ,double TetY); +void mgl_rotate_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY); +/// Rotate a further plotting around vector {x,y,z}. +void mgl_rotate_vector(HMGL gr, double Tet,double x,double y,double z); +void mgl_rotate_vector_(uintptr_t *gr, mreal *Tet, mreal *x, mreal *y, mreal *z); +/// Set perspective (in range [0,1)) for plot. Set to zero for switching off. +void mgl_perspective(HMGL gr, double val); +void mgl_perspective_(uintptr_t *gr, double val); +/// Set angle of view independently from Rotate(). +void mgl_view(HMGL gr, double TetX,double TetZ,double TetY); +void mgl_view_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY); +/// Zoom in/out a part of picture (use mgl_zoom(0, 0, 1, 1) for restore default) +void mgl_zoom(HMGL gr, double x1, double y1, double x2, double y2); +void mgl_zoom_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *x2, mreal *y2); -void mgl_mat_push_(uintptr_t *gr); -void mgl_mat_pop_(uintptr_t *gr); -void mgl_clf_(uintptr_t *graph); -void mgl_clf_rgb_(uintptr_t *graph, mreal *r, mreal *g, mreal *b); - -void mgl_subplot_(uintptr_t *graph, int *nx,int *ny,int *m); -void mgl_subplot_d_(uintptr_t *graph, int *nx,int *ny,int *m,mreal *dx,mreal *dy); -void mgl_subplot_s_(uintptr_t *graph, int *nx,int *ny,int *m, const char *s,int); -void mgl_multiplot_(uintptr_t *graph, int *nx,int *ny,int *m,int *dx,int *dy, const char *s,int); -void mgl_inplot_(uintptr_t *graph, mreal *x1,mreal *x2,mreal *y1,mreal *y2); -void mgl_relplot_(uintptr_t *graph, mreal *x1,mreal *x2,mreal *y1,mreal *y2); -void mgl_columnplot_(uintptr_t *graph, int *num, int *i, mreal *d); -void mgl_gridplot_(uintptr_t *graph, int *nx, int *ny, int *i, mreal *d); -void mgl_stickplot_(uintptr_t *graph, int *num, int *i, mreal *tet, mreal *phi); -void mgl_set_plotfactor_(uintptr_t *graph, mreal *val); +/// Send graphical information to node id using MPI +void mgl_mpi_send(HMGL gr, int id); +void mgl_mpi_send_(uintptr_t *gr, int *id); +/// Receive graphical information from node id using MPI +void mgl_mpi_recv(HMGL gr, int id); +void mgl_mpi_recv_(uintptr_t *gr, int *id); -void mgl_title_(uintptr_t *gr, const char *title, const char *stl, mreal *size, int,int); -void mgl_aspect_(uintptr_t *graph, mreal *Ax,mreal *Ay,mreal *Az); -void mgl_rotate_(uintptr_t *graph, mreal *TetX,mreal *TetZ,mreal *TetY); -void mgl_view_(uintptr_t *graph, mreal *TetX,mreal *TetZ,mreal *TetY); -void mgl_zoom_(uintptr_t *graph, mreal *x1, mreal *y1, mreal *x2, mreal *y2); -void mgl_rotate_vector_(uintptr_t *graph, mreal *Tet,mreal *x,mreal *y,mreal *z); -void mgl_perspective_(uintptr_t *graph, mreal val); -/*****************************************************************************/ -HMGL mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); -HMGL mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); +//----------------------------------------------------------------------------- +void mgl_draw_thr(void *); +/// Callback function for mouse click void mgl_set_click_func(HMGL gr, void (*func)(void *p)); -int mgl_fltk_run(); -int mgl_fltk_thr(); -int mgl_qt_run(); -/*****************************************************************************/ -uintptr_t mgl_create_graph_qt_(const char *title, int); -uintptr_t mgl_create_graph_fltk_(const char *title, int); -int mgl_fltk_run_(); -int mgl_qt_run_(); -/*****************************************************************************/ -void mgl_wnd_set_delay(HMGL gr, mreal dt); + +/// Delay for animation in seconds +void mgl_wnd_set_delay(HMGL gr, double dt); +void mgl_wnd_set_delay_(uintptr_t *gr, mreal *dt); +/// Set window properties void mgl_setup_window(HMGL gr, int clf_upd, int showpos); +void mgl_setup_window_(uintptr_t *gr, int *clf_upd, int *showpos); +/// Switch on/off transparency (do not overwrite user settings) void mgl_wnd_toggle_alpha(HMGL gr); +void mgl_wnd_toggle_alpha_(uintptr_t *gr); +/// Switch on/off lighting (do not overwrite user settings) void mgl_wnd_toggle_light(HMGL gr); +void mgl_wnd_toggle_light_(uintptr_t *gr); +/// Switch on/off zooming by mouse void mgl_wnd_toggle_zoom(HMGL gr); +void mgl_wnd_toggle_zoom_(uintptr_t *gr); +/// Switch on/off rotation by mouse void mgl_wnd_toggle_rotate(HMGL gr); +void mgl_wnd_toggle_rotate_(uintptr_t *gr); +/// Switch off all zooming and rotation void mgl_wnd_toggle_no(HMGL gr); +void mgl_wnd_toggle_no_(uintptr_t *gr); +/// Update picture by calling user drawing function void mgl_wnd_update(HMGL gr); +void mgl_wnd_update_(uintptr_t *gr); +/// Reload user data and update picture void mgl_wnd_reload(HMGL gr); +void mgl_wnd_reload_(uintptr_t *gr); +/// Adjust size of bitmap to window size void mgl_wnd_adjust(HMGL gr); +void mgl_wnd_adjust_(uintptr_t *gr); +/// Show next frame (if one) void mgl_wnd_next_frame(HMGL gr); +void mgl_wnd_next_frame_(uintptr_t *gr); +/// Show previous frame (if one) void mgl_wnd_prev_frame(HMGL gr); +void mgl_wnd_prev_frame_(uintptr_t *gr); +/// Run slideshow (animation) of frames void mgl_wnd_animation(HMGL gr); +void mgl_wnd_animation_(uintptr_t *gr); +/// Get last mouse position void mgl_get_last_mouse_pos(HMGL gr, mreal *x, mreal *y, mreal *z); -/*****************************************************************************/ void mgl_get_last_mouse_pos_(uintptr_t *gr, mreal *x, mreal *y, mreal *z); -void mgl_wnd_set_delay_(uintptr_t *gr, mreal *dt); -void mgl_setup_window_(uintptr_t *gr, int *clf_upd, int *showpos); -void mgl_wnd_toggle_alpha_(uintptr_t *gr); -void mgl_wnd_toggle_light_(uintptr_t *gr); -void mgl_wnd_toggle_zoom_(uintptr_t *gr); -void mgl_wnd_toggle_rotate_(uintptr_t *gr); -void mgl_wnd_toggle_no_(uintptr_t *gr); -void mgl_wnd_update_(uintptr_t *gr); -void mgl_wnd_reload_(uintptr_t *gr); -void mgl_wnd_adjust_(uintptr_t *gr); -void mgl_wnd_next_frame_(uintptr_t *gr); -void mgl_wnd_prev_frame_(uintptr_t *gr); -void mgl_wnd_animation_(uintptr_t *gr); -/*****************************************************************************/ -void mgl_mpi_send(HMGL gr, int id); -void mgl_mpi_recv(HMGL gr, int id); -void mgl_mpi_send_(uintptr_t *gr, int *id); -void mgl_mpi_recv_(uintptr_t *gr, int *id); -/*****************************************************************************/ +//----------------------------------------------------------------------------- +/// Create HMPR object for parsing MGL scripts HMPR mgl_create_parser(); +uintptr_t mgl_create_parser_(); +/// Change counter of HMPR uses (for advanced users only). Non-zero counter prevent automatic object removing. long mgl_use_parser(HMPR p, int inc); +long mgl_use_parser_(uintptr_t* , int *inc); +/// Delete HMPR object void mgl_delete_parser(HMPR p); -void mgl_add_param(HMPR p, int id, const char *str); -void mgl_add_paramw(HMPR p, int id, const wchar_t *str); -/*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ -HMDT mgl_add_var(HMPR p, const char *name); -/*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ -HMDT mgl_find_var(HMPR p, const char *name); -void mgl_del_var(HMPR p, const char *name); -int mgl_parse(HMGL gr, HMPR p, const char *str, int pos); -int mgl_parsew(HMGL gr, HMPR p, const wchar_t *str, int pos); +void mgl_delete_parser_(uintptr_t* p); +/// Set value for parameter $N +void mgl_parser_add_param(HMPR p, int id, const char *str); +void mgl_parser_add_param_(uintptr_t* p, int *id, const char *str, int); +void mgl_parser_add_paramw(HMPR p, int id, const wchar_t *str); + +/// Find variable with given name or add a new one +/// NOTE !!! You must not delete obtained data arrays !!! +HMDT mgl_parser_add_var(HMPR p, const char *name); +uintptr_t mgl_parser_add_var_(uintptr_t* p, const char *name, int); +HMDT mgl_parser_add_varw(HMPR p, const wchar_t *name); +/// Find variable with given name or return NULL if no one +/// NOTE !!! You must not delete obtained data arrays !!! +HMDT mgl_parser_find_var(HMPR p, const char *name); +uintptr_t mgl_parser_find_var_(uintptr_t* p, const char *name, int); +HMDT mgl_parser_find_varw(HMPR p, const wchar_t *name); + +/// Delete variable with name +void mgl_parser_del_var(HMPR p, const char *name); +void mgl_parser_del_var_(uintptr_t* p, const char *name, int); +void mgl_parser_del_varw(HMPR p, const wchar_t *name); +/// Delete all data variables +void mgl_parser_del_all(HMPR p); +void mgl_parser_del_all_(uintptr_t *p); + +/// Parse and draw single line of the MGL script +int mgl_parse_line(HMGL gr, HMPR p, const char *str, int pos); +int mgl_parse_line_(uintptr_t* gr, uintptr_t* p, const char *str, int *pos, int); +int mgl_parse_linew(HMGL gr, HMPR p, const wchar_t *str, int pos); +/// Execute and draw script from the file void mgl_parse_file(HMGL gr, HMPR p, FILE *fp, int print); +/// Execute MGL script text with '\n' separated lines void mgl_parse_text(HMGL gr, HMPR p, const char *str); -void mgl_parsew_text(HMGL gr, HMPR p, const wchar_t *str); -void mgl_restore_once(HMPR p); +void mgl_parse_text_(uintptr_t* gr, uintptr_t* p, const char *str, int); +void mgl_parse_textw(HMGL gr, HMPR p, const wchar_t *str); + +/// Restore once flag +void mgl_parser_restore_once(HMPR p); +void mgl_parser_restore_once_(uintptr_t* p); +/// Allow changing size of the picture void mgl_parser_allow_setsize(HMPR p, int a); -void mgl_parser_stop(HMPR p); -int mgl_cmd_type(HMPR pr, const char *name); -const char *mgl_cmd_desc(HMPR pr, const char *name); -const char *mgl_cmd_frmt(HMPR pr, const char *name); -//int mgl_parser_find_cmdw(HMPR pr, const wchar_t *name); -/*****************************************************************************/ -uintptr_t mgl_create_parser_(); -long mgl_use_parser_(uintptr_t* , int *inc); -void mgl_delete_parser_(uintptr_t* p); -void mgl_add_param_(uintptr_t* p, int *id, const char *str, int l); -/*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ -uintptr_t mgl_add_var_(uintptr_t* p, const char *name, int l); -/*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ -uintptr_t mgl_find_var_(uintptr_t* p, const char *name, int l); -void mgl_del_var_(uintptr_t* p, const char *name, int l); -int mgl_parse_(uintptr_t* gr, uintptr_t* p, const char *str, int *pos, int l); -void mgl_parse_text_(uintptr_t* gr, uintptr_t* p, const char *str, int l); -void mgl_restore_once_(uintptr_t* p); void mgl_parser_allow_setsize_(uintptr_t* p, int *a); +/// Allow reading/saving files +void mgl_parser_allow_file_io(HMPR p, int a); +void mgl_parser_allow_file_io_(uintptr_t* p, int *a); +/// Set flag to stop script parsing +void mgl_parser_stop(HMPR p); void mgl_parser_stop_(uintptr_t* p); -int mgl_cmd_type_(uintptr_t* p, const char *name, int l); -/*****************************************************************************/ + +/// Return type of command: 0 - not found, 1 - data plot, 2 - other plot, +/// 3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program +/// 8 - 1d plot, 9 - 2d plot, 10 - 3d plot, 11 - dd plot, 12 - vector plot +/// 13 - axis, 14 - primitives, 15 - axis setup, 16 - text/legend, 17 - data transform +int mgl_parser_cmd_type(HMPR pr, const char *name); +int mgl_parser_cmd_type_(uintptr_t* p, const char *name, int); +/// Return description of MGL command +const char *mgl_parser_cmd_desc(HMPR pr, const char *name); +/// Return string of command format (command name and its argument[s]) +const char *mgl_parser_cmd_frmt(HMPR pr, const char *name); +/// Get name of command with nmber n +const char *mgl_parser_cmd_name(HMPR pr, long id); +/// Get number of defined commands +long mgl_parser_cmd_num(HMPR pr); + +/// Return result of formula evaluation +HMDT mgl_parser_calc(HMPR pr, const char *formula); +uintptr_t mgl_parser_calc_(uintptr_t *pr, const char *formula,int); +HMDT mgl_parser_calcw(HMPR pr, const wchar_t *formula); + +//----------------------------------------------------------------------------- +/// Create HMEX object for expression evaluating +HMEX mgl_create_expr(const char *expr); +uintptr_t mgl_create_expr_(const char *expr, int); +/// Delete HMEX object +void mgl_delete_expr(HMEX ex); +void mgl_delete_expr_(uintptr_t *ex); +/// Return value of expression for given x,y,z variables +double mgl_expr_eval(HMEX ex, double x, double y,double z); +double mgl_eval_expr_(uintptr_t *ex, mreal *x, mreal *y, mreal *z); +/// Return value of expression for given variables +double mgl_expr_eval_v(HMEX ex, mreal *var); +/// Return value of expression differentiation over variable dir for given x,y,z variables +double mgl_expr_diff(HMEX ex, char dir, double x, double y,double z); +double mgl_diff_expr_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int); +/// Return value of expression differentiation over variable dir for given variables +double mgl_expr_diff_v(HMEX ex, char dir, mreal *var); + #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/canvas_wnd.h b/include/mgl2/canvas_wnd.h index 1009e1d..f1b2430 100644 --- a/include/mgl2/canvas_wnd.h +++ b/include/mgl2/canvas_wnd.h @@ -1,6 +1,6 @@ /*************************************************************************** * window.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -17,12 +17,11 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -//----------------------------------------------------------------------------- #ifndef _MGL_CANVAS_WND_H_ #define _MGL_CANVAS_WND_H_ -/*****************************************************************************/ + #include "mgl2/canvas.h" -#include "mgl2/window.h" +#include "mgl2/wnd.h" //----------------------------------------------------------------------------- /// Base class for windows containing MathGL graphics class mglCanvasWnd : public mglCanvas @@ -36,11 +35,13 @@ public: void SetSize(int w,int h); void EndFrame(); + void SetFrame(long i); + void DelFrame(long i); const unsigned char *GetBits(); inline int GetNumFig() const { return NumFig; } inline int GetCurFig() const { return CurFig; } void SetCurFig(int c); - void ClearFrames(); + void ResetFrames(); inline mglPoint GetMousePos() const { return LastMousePos;} inline void SetMousePos(mglPoint p) { LastMousePos=p; } inline void Setup(bool clf_upd=true, bool showpos=false) diff --git a/include/mgl2/cont.h b/include/mgl2/cont.h index 89d6bb8..22bc70d 100644 --- a/include/mgl2/cont.h +++ b/include/mgl2/cont.h @@ -1,6 +1,6 @@ /*************************************************************************** * cont.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,115 +20,139 @@ #ifndef _MGL_CONT_H_ #define _MGL_CONT_H_ #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ -void mgl_textw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const wchar_t *text, const char *font, const char *opt); -void mgl_textw_xy(HMGL gr, HCDT x, HCDT y, const wchar_t *text, const char *font, const char *opt); -void mgl_textw_y(HMGL gr, HCDT y, const wchar_t *text, const char *font, const char *opt); -void mgl_text_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *text, const char *font, const char *opt); -void mgl_text_xy(HMGL gr, HCDT x, HCDT y, const char *text, const char *font, const char *opt); -void mgl_text_y(HMGL gr, HCDT y, const char *text, const char *font, const char *opt); - -void mgl_cont_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl); -void mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl); - -void mgl_cont_xy_val(HMGL graph, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); -void mgl_cont_val(HMGL graph, HCDT v, HCDT z, const char *sch, const char *opt); -void mgl_cont_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); -void mgl_cont(HMGL graph, HCDT z, const char *sch, const char *opt); - -void mgl_contf_xy_val(HMGL graph, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); -void mgl_contf_val(HMGL graph, HCDT v, HCDT z, const char *sch, const char *opt); -void mgl_contf_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); -void mgl_contf(HMGL graph, HCDT z, const char *sch, const char *opt); - -void mgl_contd_xy_val(HMGL graph, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); -void mgl_contd_val(HMGL graph, HCDT v, HCDT z, const char *sch, const char *opt); -void mgl_contd_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); -void mgl_contd(HMGL graph, HCDT z, const char *sch, const char *opt); - -void mgl_contv_xy_val(HMGL graph, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); -void mgl_contv_val(HMGL graph, HCDT v, HCDT z, const char *sch, const char *opt); -void mgl_contv_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); -void mgl_contv(HMGL graph, HCDT z, const char *sch, const char *opt); - -void mgl_axial_xy_val(HMGL graph, HCDT v, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt); -void mgl_axial_val(HMGL graph, HCDT v, HCDT a, const char *sch, const char *opt); -void mgl_axial_xy(HMGL graph, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt); -void mgl_axial(HMGL graph, HCDT a, const char *sch, const char *opt); - -void mgl_torus(HMGL graph, HCDT r, HCDT z, const char *col, const char *opt); - -void mgl_grid3_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_grid3(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); - -void mgl_dens3_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_dens3(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); - -void mgl_cont3_xyz_val(HMGL graph, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt); -void mgl_cont3_val(HMGL graph, HCDT v, HCDT a, const char *sch, mreal sVal, const char *opt); -void mgl_cont3_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt); -void mgl_cont3(HMGL graph, HCDT a, const char *sch, mreal sVal, const char *opt); - -void mgl_contf3_xyz_val(HMGL graph, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt); -void mgl_contf3_val(HMGL graph, HCDT v, HCDT a, const char *sch, mreal sVal, const char *opt); -void mgl_contf3_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt); -void mgl_contf3(HMGL graph, HCDT a, const char *sch, mreal sVal, const char *opt); -/*****************************************************************************/ +/// Print text along the curve in parametric form {x,y,z} +void mgl_text_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *text, const char *font, const char *opt); void mgl_text_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z,const char *text,const char *font, const char *opt,int,int l,int n); +void mgl_textw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const wchar_t *text, const char *font, const char *opt); +/// Print text along the curve in parametric form {x,y} +void mgl_text_xy(HMGL gr, HCDT x, HCDT y, const char *text, const char *font, const char *opt); void mgl_text_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, const char *text, const char *font, const char *opt,int, int l,int n); +void mgl_textw_xy(HMGL gr, HCDT x, HCDT y, const wchar_t *text, const char *font, const char *opt); +/// Print text along the curve +void mgl_text_y(HMGL gr, HCDT y, const char *text, const char *font, const char *opt); void mgl_text_y_(uintptr_t *gr, uintptr_t *y, const char *text, const char *font, const char *opt,int, int l,int n); +void mgl_textw_y(HMGL gr, HCDT y, const wchar_t *text, const char *font, const char *opt); -void mgl_cont_xy_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_cont_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_cont_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_cont_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); - -void mgl_contf_xy_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_contf_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_contf_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_contf_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); - -void mgl_contd_xy_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_contd_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_contd_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_contd_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); - -void mgl_contv_xy_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_contv_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_contv_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_contv_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); - -void mgl_axial_xy_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); -void mgl_axial_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *sch, const char *opt,int,int); -void mgl_axial_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); -void mgl_axial_(uintptr_t *graph, uintptr_t *a, const char *sch, const char *opt,int,int); - -void mgl_torus_(uintptr_t *graph, uintptr_t *r, uintptr_t *z, const char *pen, const char *opt,int,int); - -void mgl_grid3_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -void mgl_grid3_(uintptr_t *graph, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); - -void mgl_dens3_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -void mgl_dens3_(uintptr_t *graph, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); - -void mgl_cont3_xyz_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -void mgl_cont3_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -void mgl_cont3_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -void mgl_cont3_(uintptr_t *graph, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); - -void mgl_contf3_xyz_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -void mgl_contf3_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -void mgl_contf3_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -void mgl_contf3_(uintptr_t *graph, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); - -/*****************************************************************************/ +void mgl_cont_gen(HMGL gr, double val, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl); +void mgl_contf_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl); + +/// Draw manual contour lines for 2d data specified parametrically +void mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_cont_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw manual contour lines for 2d data +void mgl_cont_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); +void mgl_cont_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw contour lines for 2d data specified parametrically +void mgl_cont_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_cont_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw contour lines for 2d data +void mgl_cont(HMGL gr, HCDT z, const char *sch, const char *opt); +void mgl_cont_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw manual solid contours for 2d data specified parametrically +void mgl_contf_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_contf_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw manual solid contours for 2d data +void mgl_contf_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); +void mgl_contf_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw solid contours for 2d data specified parametrically +void mgl_contf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_contf_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw solid contours for 2d data +void mgl_contf(HMGL gr, HCDT z, const char *sch, const char *opt); +void mgl_contf_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw manual solid contours for 2d data specified parametrically with manual colors +void mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_contd_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw manual solid contours for 2d data with manual colors +void mgl_contd_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); +void mgl_contd_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw solid contours for 2d data specified parametrically with manual colors +void mgl_contd_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_contd_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw solid contours for 2d data with manual colors +void mgl_contd(HMGL gr, HCDT z, const char *sch, const char *opt); +void mgl_contd_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw manual contour tubes for 2d data specified parametrically +void mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_contv_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw manual contour tubes for 2d data +void mgl_contv_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); +void mgl_contv_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw contour tubes for 2d data specified parametrically +void mgl_contv_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_contv_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw contour tubes for 2d data +void mgl_contv(HMGL gr, HCDT z, const char *sch, const char *opt); +void mgl_contv_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw manual axial-symmetric isosurfaces for 2d data specified parametrically +void mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt); +void mgl_axial_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); +/// Draw manual axial-symmetric isosurfaces for 2d data +void mgl_axial_val(HMGL gr, HCDT v, HCDT a, const char *sch, const char *opt); +void mgl_axial_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, const char *opt,int,int); +/// Draw axial-symmetric isosurfaces for 2d data specified parametrically +void mgl_axial_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt); +void mgl_axial_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); +/// Draw axial-symmetric isosurfaces for 2d data +void mgl_axial(HMGL gr, HCDT a, const char *sch, const char *opt); +void mgl_axial_(uintptr_t *gr, uintptr_t *a, const char *sch, const char *opt,int,int); + +/// Draw surface of curve {r,z} rotatation around axis +void mgl_torus(HMGL gr, HCDT r, HCDT z, const char *col, const char *opt); +void mgl_torus_(uintptr_t *gr, uintptr_t *r, uintptr_t *z, const char *pen, const char *opt,int,int); + +/// Draw grid lines for density plot at slice for 3d data specified parametrically +void mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, double sVal, const char *opt); +void mgl_grid3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); +/// Draw grid lines for density plot at slice for 3d data +void mgl_grid3(HMGL gr, HCDT a, const char *stl, double sVal, const char *opt); +void mgl_grid3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); + +/// Draw density plot at slice for 3d data specified parametrically +void mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, double sVal, const char *opt); +void mgl_dens3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); +/// Draw density plot at slice for 3d data +void mgl_dens3(HMGL gr, HCDT a, const char *stl, double sVal, const char *opt); +void mgl_dens3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); + +/// Draw manual contour lines at slice for 3d data specified parametrically +void mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); +void mgl_cont3_xyz_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); +/// Draw manual contour lines at slice for 3d data +void mgl_cont3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt); +void mgl_cont3_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); +/// Draw contour lines at slice for 3d data specified parametrically +void mgl_cont3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); +void mgl_cont3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); +/// Draw contour lines at slice for 3d data +void mgl_cont3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt); +void mgl_cont3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); + +/// Draw manual solid contours at slice for 3d data specified parametrically +void mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); +void mgl_contf3_xyz_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); +/// Draw manual solid contours at slice for 3d data +void mgl_contf3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt); +void mgl_contf3_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); +/// Draw solid contours at slice for 3d data specified parametrically +void mgl_contf3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); +void mgl_contf3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); +/// Draw solid contours at slice for 3d data +void mgl_contf3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt); +void mgl_contf3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); + +//----------------------------------------------------------------------------- #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/data.h b/include/mgl2/data.h index d541686..e95f20d 100644 --- a/include/mgl2/data.h +++ b/include/mgl2/data.h @@ -1,6 +1,6 @@ /*************************************************************************** * data.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -19,8 +19,7 @@ ***************************************************************************/ #ifndef _MGL_DATA_H_ #define _MGL_DATA_H_ -/*****************************************************************************/ -#include "mgl2/base.h" + #include "mgl2/data_cf.h" #ifdef __cplusplus //----------------------------------------------------------------------------- @@ -41,11 +40,10 @@ public: long nz; ///< number of points in 3d dimensions ('z' dimension) mreal *a; ///< data array std::string id; ///< column (or slice) names -// char *id; ///< column (or slice) names bool link; ///< use external data (i.e. don't free it) /// Initiate by other mglData variable - inline mglData(const mglData &d) { a=0; mgl_data_set(this,&d); } + inline mglData(const mglData &d) { a=0; mgl_data_set(this,&d); } // NOTE: must be constructor for mglData& to exclude copy one inline mglData(const mglDataA *d) { a=0; mgl_data_set(this, d); } inline mglData(bool, mglData *d) // NOTE: Variable d will be deleted!!! { if(d) @@ -77,7 +75,7 @@ public: /// Link external data array (don't delete it at exit) inline void Link(mreal *A, long NX, long NY=1, long NZ=1) { mgl_data_link(this,A,NX,NY,NZ); } - inline void Link(mglData *d) { Link(d->a,d->nx,d->ny,d->nz); } + inline void Link(mglData &d) { Link(d.a,d.nx,d.ny,d.nz); } /// Allocate memory and copy the data from the gsl_vector inline void Set(gsl_vector *m) { mgl_data_set_vector(this,m); } /// Allocate memory and copy the data from the gsl_matrix @@ -106,7 +104,7 @@ public: { mgl_data_set_values(this,str,NX,NY,NZ); } /// Import data from abstract type inline void Set(HCDT dat) { mgl_data_set(this, dat); } - inline void Set(const mglData &dat) { mgl_data_set(this, &dat); } + inline void Set(const mglDataA &dat) { mgl_data_set(this, &dat); } /// Allocate memory and copy data from std::vector inline void Set(const std::vector &d) { if(d.size()<1) return; @@ -136,40 +134,43 @@ public: /// Crop the data inline void Crop(long n1, long n2,char dir='x') { mgl_data_crop(this,n1,n2,dir); } - /// Insert data + /// Insert data rows/columns/slices inline void Insert(char dir, long at=0, long num=1) { mgl_data_insert(this,dir,at,num); } - /// Delete data + /// Delete data rows/columns/slices inline void Delete(char dir, long at=0, long num=1) { mgl_data_delete(this,dir,at,num); } - + /// Remove rows with duplicate values in column id + inline void Clean(long id) + { mgl_data_clean(this,id); } + /// Modify the data by specified formula inline void Modify(const char *eq,long dim=0) { mgl_data_modify(this, eq, dim); } /// Modify the data by specified formula - inline void Modify(const char *eq,const mglData &vdat, const mglData &wdat) + inline void Modify(const char *eq,const mglDataA &vdat, const mglDataA &wdat) { mgl_data_modify_vw(this,eq,&vdat,&wdat); } /// Modify the data by specified formula - inline void Modify(const char *eq,const mglData &vdat) + inline void Modify(const char *eq,const mglDataA &vdat) { mgl_data_modify_vw(this,eq,&vdat,0); } /// Modify the data by specified formula assuming x,y,z in range [r1,r2] inline void Fill(mglBase *gr, const char *eq, const char *opt="") { mgl_data_fill_eq(gr,this,eq,0,0,opt); } - inline void Fill(mglBase *gr, const char *eq, const mglData &vdat, const char *opt="") + inline void Fill(mglBase *gr, const char *eq, const mglDataA &vdat, const char *opt="") { mgl_data_fill_eq(gr,this,eq,&vdat,0,opt); } - inline void Fill(mglBase *gr, const char *eq, const mglData &vdat, const mglData &wdat,const char *opt="") + inline void Fill(mglBase *gr, const char *eq, const mglDataA &vdat, const mglDataA &wdat,const char *opt="") { mgl_data_fill_eq(gr,this,eq,&vdat,&wdat,opt); } - /// Eqidistantly fill the data to range [x1,x2] in direction \a dir + /// Equidistantly fill the data to range [x1,x2] in direction dir inline void Fill(mreal x1,mreal x2=NaN,char dir='x') { return mgl_data_fill(this,x1,x2,dir); } /// Set the data by triangulated surface values assuming x,y,z in range [r1,r2] - inline void Grid(mglBase *gr, const mglData &x, const mglData &y, const mglData &z, const char *opt="") + inline void Grid(mglBase *gr, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *opt="") { mgl_data_grid(gr,this,&x,&y,&z,opt); } /// Put value to data element(s) inline void Put(mreal val, long i=-1, long j=-1, long k=-1) { mgl_data_put_val(this,val,i,j,k); } /// Put array to data element(s) - inline void Put(const mglData &dat, long i=-1, long j=-1, long k=-1) + inline void Put(const mglDataA &dat, long i=-1, long j=-1, long k=-1) { mgl_data_put_dat(this,&dat,i,j,k); } /// Set names for columns (slices) inline void SetColumnId(const char *ids) @@ -208,7 +209,7 @@ public: inline void SaveHDF(const char *fname,const char *data,bool rewrite=false) const { mgl_data_save_hdf(this,fname,data,rewrite); } /// Put HDF data names into buf as '\t' separated. - inline int DatasHDF(const char *fname, char *buf, long size) const + inline static int DatasHDF(const char *fname, char *buf, long size) { return mgl_datas_hdf(fname,buf,size); } /// Get column (or slice) of the data filled by formulas of named columns @@ -220,16 +221,16 @@ public: /// Get sub-array of the data with given fixed indexes inline mglData SubData(long xx,long yy=-1,long zz=-1) const { return mglData(true,mgl_data_subdata(this,xx,yy,zz)); } - inline mglData SubData(const mglData &xx, const mglData &yy, const mglData &zz) const + inline mglData SubData(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) const { return mglData(true,mgl_data_subdata_ext(this,&xx,&yy,&zz)); } /// Get trace of the data array inline mglData Trace() const { return mglData(true,mgl_data_trace(this)); } /// Create n-th points distribution of this data values in range [v1, v2] - mglData Hist(long n,mreal v1=0,mreal v2=1, long nsub=0) const + inline mglData Hist(long n,mreal v1=0,mreal v2=1, long nsub=0) const { return mglData(true,mgl_data_hist(this,n,v1,v2,nsub)); } - /// Create n-th points distribution of this data values in range [v1, v2] with weight \a w - mglData Hist(const mglData &w, long n,mreal v1=0,mreal v2=1, long nsub=0) const + /// Create n-th points distribution of this data values in range [v1, v2] with weight w + inline mglData Hist(const mglDataA &w, long n,mreal v1=0,mreal v2=1, long nsub=0) const { return mglData(true,mgl_data_hist_w(this,&w,n,v1,v2,nsub)); } /// Get array which is result of summation in given direction or directions inline mglData Sum(const char *dir) const @@ -241,7 +242,7 @@ public: inline mglData Min(const char *dir) const { return mglData(true,mgl_data_min_dir(this,dir)); } /// Get the data which is direct multiplication (like, d[i,j] = this[i]*a[j] and so on) - inline mglData Combine(const mglData &dat) const + inline mglData Combine(const mglDataA &dat) const { return mglData(true,mgl_data_combine(this,&dat)); } /// Resize the data to new size of box [x1,x2]*[y1,y2]*[z1,z2] inline mglData Resize(long mx,long my=1,long mz=1, mreal x1=0,mreal x2=1, mreal y1=0,mreal y2=1, mreal z1=0,mreal z2=1) const @@ -261,19 +262,19 @@ public: /// Differentiate the data in given direction or directions inline void Diff(const char *dir) { mgl_data_diff(this,dir); } /// Differentiate the parametrically specified data along direction v1 with v2=const - inline void Diff(const mglData &v1, const mglData &v2) + inline void Diff(const mglDataA &v1, const mglDataA &v2) { mgl_data_diff_par(this,&v1,&v2,0); } /// Differentiate the parametrically specified data along direction v1 with v2,v3=const - inline void Diff(const mglData &v1, const mglData &v2, const mglData &v3) + inline void Diff(const mglDataA &v1, const mglDataA &v2, const mglDataA &v3) { mgl_data_diff_par(this,&v1,&v2,&v3); } - /// Double-differentiate (like laplace operator) the data in given direction + /// Double-differentiate (like Laplace operator) the data in given direction inline void Diff2(const char *dir) { mgl_data_diff2(this,dir); } - /// Swap left and right part of the data in given direction (useful for fourier spectrums) + /// Swap left and right part of the data in given direction (useful for Fourier spectrum) inline void Swap(const char *dir) { mgl_data_swap(this,dir); } - /// Roll data along direction \a dir by \a num slices + /// Roll data along direction dir by num slices inline void Roll(char dir, long num) { mgl_data_roll(this,dir,num); } - /// Mirror the data in given direction (useful for fourier spectrums) + /// Mirror the data in given direction (useful for Fourier spectrum) inline void Mirror(const char *dir) { mgl_data_mirror(this,dir); } /// Sort rows (or slices) by values of specified column inline void Sort(long idx, long idy=-1) { mgl_data_sort(this,idx,idy); } @@ -294,30 +295,53 @@ public: inline void NormSl(mreal v1=0,mreal v2=1,char dir='z',bool keep_en=true,bool sym=false) { mgl_data_norm_slice(this,v1,v2,dir,keep_en,sym); } - /// Hankel transform + /// Apply Hankel transform inline void Hankel(const char *dir) { mgl_data_hankel(this,dir); } - /// Sin-Fourier transform + /// Apply Sin-Fourier transform inline void SinFFT(const char *dir) { mgl_data_sinfft(this,dir); } - /// Cos-Fourier transform + /// Apply Cos-Fourier transform inline void CosFFT(const char *dir) { mgl_data_cosfft(this,dir); } /// Fill data by 'x'/'k' samples for Hankel ('h') or Fourier ('f') transform inline void FillSample(const char *how) { mgl_data_fill_sample(this,how); } - /// Interpolate by qubic splain the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] + /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] inline mreal Spline(mreal x,mreal y=0,mreal z=0) const { return mgl_data_spline(this, x,y,z); } - /// Interpolate by qubic splain the data to given point \a x,\a y,\a z which normalized in range [0, 1] + /// Interpolate by cubic spline the data to given point x,\a y,\a z which normalized in range [0, 1] inline mreal Spline1(mreal x,mreal y=0,mreal z=0) const { return mgl_data_spline(this, x*(nx-1),y*(ny-1),z*(nz-1)); } /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] inline mreal Linear(mreal x,mreal y=0,mreal z=0) const { return mgl_data_linear(this,x,y,z); } - /// Interpolate by line the data to given point \a x,\a y,\a z which normalized in range [0, 1] + /// Interpolate by line the data to given point x,\a y,\a z which normalized in range [0, 1] inline mreal Linear1(mreal x,mreal y=0,mreal z=0) const { return mgl_data_linear(this,x*(nx-1),y*(ny-1),z*(nz-1)); } - - /// Print information about the data (sizes and momentum) to string + /// Return an approximated x-value (root) when dat(x) = val + inline mreal Solve(mreal val, bool use_spline=true, long i0=0) const + { return mgl_data_solve_1d(this, val, use_spline, i0); } + /// Return an approximated value (root) when dat(x) = val + inline mglData Solve(mreal val, char dir, bool norm=true) const + { return mglData(true,mgl_data_solve(this, val, dir, 0, norm)); } + inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const + { return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); } + + /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] + inline mreal Spline(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const + { return mgl_data_spline_ext(this, x,y,z, &(dif.x),&(dif.y), &(dif.z)); } + /// Interpolate by cubic spline the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1] + inline mreal Spline1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const + { mreal res=mgl_data_spline_ext(this, x*(nx-1),y*(ny-1),z*(nz-1), &(dif.x),&(dif.y), &(dif.z)); + dif.x/=nx>1?nx-1:1; dif.y/=ny>1?ny-1:1; dif.z/=nz>1?nz-1:1; return res; } + /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] + inline mreal Linear(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const + { return mgl_data_linear_ext(this,x,y,z, &(dif.x),&(dif.y), &(dif.z)); } + /// Interpolate by line the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1] + inline mreal Linear1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const + { mreal res=mgl_data_linear_ext(this,x*(nx-1),y*(ny-1),z*(nz-1), &(dif.x),&(dif.y), &(dif.z)); + dif.x/=nx>1?nx-1:1; dif.y/=ny>1?ny-1:1; dif.z/=nz>1?nz-1:1; return res; } + + /// Get information about the data (sizes and momentum) to string inline const char *PrintInfo() const { return mgl_data_info(this); } /// Print information about the data (sizes and momentum) to FILE (for example, stdout) inline void PrintInfo(FILE *fp) const @@ -338,10 +362,10 @@ public: /// Get minimal value of the data and its approximated position inline mreal Minimal(mreal &x,mreal &y,mreal &z) const { return mgl_data_min_real(this,&x,&y,&z); } - /// Get "energy" and find first (median) and second (width) momentums of data + /// Get "energy" and find first (median) and second (width) momenta of data inline mreal Momentum(char dir,mreal &m,mreal &w) const { return mgl_data_momentum_val(this,dir,&m,&w,0,0); } - /// Get "energy and find 4 momentums of data: median, width, skewness, kurtosis + /// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis inline mreal Momentum(char dir,mreal &m,mreal &w,mreal &s,mreal &k) const { return mgl_data_momentum_val(this,dir,&m,&w,&s,&k); } /// Find position (after specified in i,j,k) of first nonzero value of formula @@ -362,21 +386,21 @@ public: { if(this!=&d) Set(d.a,d.nx,d.ny,d.nz); return *this; } inline mreal operator=(mreal val) { for(long i=0;i(const mglDataA &b, const mglDataA &d) +{ return b.Minimal()>d.Minimal(); } #endif //----------------------------------------------------------------------------- #ifndef SWIG @@ -444,10 +472,10 @@ mreal mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mr //----------------------------------------------------------------------------- /// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for amplitude and phase inline mglData mglTransformA(const mglDataA &am, const mglDataA &ph, const char *tr) -{ return mgl_transform_a(&am,&ph,tr); } +{ return mglData(true,mgl_transform_a(&am,&ph,tr)); } /// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for real and imaginary parts inline mglData mglTransform(const mglDataA &re, const mglDataA &im, const char *tr) -{ return mgl_transform(&re,&im,tr); } +{ return mglData(true,mgl_transform(&re,&im,tr)); } /// Apply Fourier transform for the data and save result into it inline void mglFourier(mglData &re, mglData &im, const char *dir) { mgl_data_fourier(&re,&im,dir); } @@ -455,27 +483,27 @@ inline void mglFourier(mglData &re, mglData &im, const char *dir) inline mglData mglSTFA(const mglDataA &re, const mglDataA &im, long dn, char dir='x') { return mglData(true, mgl_data_stfa(&re,&im,dn,dir)); } //----------------------------------------------------------------------------- -/// Saves result of PDE solving (|u|^2) for "Hamiltonian" \a ham with initial conditions \a ini -inline mglData mglPDE(mglBase *gr, const char *ham, const mglData &ini_re, const mglData &ini_im, mreal dz=0.1, mreal k0=100,const char *opt="") +/// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini +inline mglData mglPDE(mglBase *gr, const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, mreal dz=0.1, mreal k0=100,const char *opt="") { return mglData(true, mgl_pde_solve(gr,ham, &ini_re, &ini_im, dz, k0,opt)); } -/// Saves result of PDE solving for "Hamiltonian" \a ham with initial conditions \a ini along a curve \a ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) -inline mglData mglQO2d(const char *ham, const mglData &ini_re, const mglData &ini_im, const mglData &ray, mreal r=1, mreal k0=100) +/// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) +inline mglData mglQO2d(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mreal r=1, mreal k0=100) { return mglData(true, mgl_qo2d_solve(ham, &ini_re, &ini_im, &ray, r, k0, 0, 0)); } -inline mglData mglQO2d(const char *ham, const mglData &ini_re, const mglData &ini_im, const mglData &ray, mglData &xx, mglData &yy, mreal r=1, mreal k0=100) +inline mglData mglQO2d(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mglData &xx, mglData &yy, mreal r=1, mreal k0=100) { return mglData(true, mgl_qo2d_solve(ham, &ini_re, &ini_im, &ray, r, k0, &xx, &yy)); } -/// Prepares ray data for mglQO_PDE with starting point \a r0, \a p0 +/// Finds ray with starting point r0, p0 (and prepares ray data for mglQO2d) inline mglData mglRay(const char *ham, mglPoint r0, mglPoint p0, mreal dt=0.1, mreal tmax=10) { return mglData(true, mgl_ray_trace(ham, r0.x, r0.y, r0.z, p0.x, p0.y, p0.z, dt, tmax)); } /// Calculate Jacobian determinant for D{x(u,v), y(u,v)} = dx/du*dy/dv-dx/dv*dy/du -inline mglData mglJacobian(const mglData &x, const mglData &y) +inline mglData mglJacobian(const mglDataA &x, const mglDataA &y) { return mglData(true, mgl_jacobian_2d(&x, &y)); } /// Calculate Jacobian determinant for D{x(u,v,w), y(u,v,w), z(u,v,w)} -inline mglData mglJacobian(const mglData &x, const mglData &y, const mglData &z) +inline mglData mglJacobian(const mglDataA &x, const mglDataA &y, const mglDataA &z) { return mglData(true, mgl_jacobian_3d(&x, &y, &z)); } /// Do something like Delone triangulation -inline mglData mglTriangulation(const mglData &x, const mglData &y, const mglData &z) +inline mglData mglTriangulation(const mglDataA &x, const mglDataA &y, const mglDataA &z) { return mglData(true,mgl_triangulation_3d(&x,&y,&z)); } -inline mglData mglTriangulation(const mglData &x, const mglData &y) +inline mglData mglTriangulation(const mglDataA &x, const mglDataA &y) { return mglData(true,mgl_triangulation_2d(&x,&y)); } //----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/data_cf.h b/include/mgl2/data_cf.h index 1c894cc..c928ec0 100644 --- a/include/mgl2/data_cf.h +++ b/include/mgl2/data_cf.h @@ -1,6 +1,6 @@ /*************************************************************************** * data_cf.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -19,9 +19,9 @@ ***************************************************************************/ #ifndef _MGL_DATA_CF_H_ #define _MGL_DATA_CF_H_ -/*****************************************************************************/ +//----------------------------------------------------------------------------- #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #if MGL_HAVE_GSL #include #include @@ -29,273 +29,385 @@ struct gsl_vector; struct gsl_matrix; #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ + void mgl_srnd(long seed); double mgl_rnd(); double mgl_ipow(double x,int n); -/*****************************************************************************/ + +/// Create HMDT object HMDT mgl_create_data(); -HMDT mgl_create_data_size(long nx, long ny, long nz); -HMDT mgl_create_data_file(const char *fname); -void mgl_delete_data(HMDT dat); -const char *mgl_data_info(HCDT dat); -/*****************************************************************************/ uintptr_t mgl_create_data_(); +/// Create HMDT object with specified sizes +HMDT mgl_create_data_size(long nx, long ny, long nz); uintptr_t mgl_create_data_size_(int *nx, int *ny, int *nz); +/// Create HMDT object with data from file +HMDT mgl_create_data_file(const char *fname); uintptr_t mgl_create_data_file_(const char *fname, int len); +/// Delete HMDT object +void mgl_delete_data(HMDT dat); void mgl_delete_data_(uintptr_t *dat); -/*****************************************************************************/ -/* Data creation functions */ -/*****************************************************************************/ +/// Get information about the data (sizes and momentum) to string +const char *mgl_data_info(HCDT dat); + +/// Rearange data dimensions void mgl_data_rearrange(HMDT dat, long mx,long my,long mz); +void mgl_data_rearrange_(uintptr_t *dat, int *mx, int *my, int *mz); +/// Link external data array (don't delete it at exit) void mgl_data_link(HMDT dat, mreal *A,long mx,long my,long mz); +void mgl_data_link_(uintptr_t *d, float *A, int *nx,int *ny,int *nz); +/// Allocate memory and copy the data from the (float *) array void mgl_data_set_float(HMDT dat, const float *A,long mx,long my,long mz); +void mgl_data_set_float_(uintptr_t *dat, const float *A,int *NX,int *NY,int *NZ); +void mgl_data_set_float1_(uintptr_t *d, const float *A,int *N1); +/// Allocate memory and copy the data from the (double *) array void mgl_data_set_double(HMDT dat, const double *A,long mx,long my,long mz); +void mgl_data_set_double_(uintptr_t *dat, const double *A,int *NX,int *NY,int *NZ); +void mgl_data_set_double1_(uintptr_t *d, const double *A,int *N1); +/// Allocate memory and copy the data from the (float **) array void mgl_data_set_float2(HMDT d, const float **A,long N1,long N2); +void mgl_data_set_float2_(uintptr_t *d, const float *A,int *N1,int *N2); +/// Allocate memory and copy the data from the (double **) array void mgl_data_set_double2(HMDT d, const double **A,long N1,long N2); +void mgl_data_set_double2_(uintptr_t *d, const double *A,int *N1,int *N2); +/// Allocate memory and copy the data from the (float ***) array void mgl_data_set_float3(HMDT d, const float ***A,long N1,long N2,long N3); +void mgl_data_set_float3_(uintptr_t *d, const float *A,int *N1,int *N2,int *N3); +/// Allocate memory and copy the data from the (double ***) array void mgl_data_set_double3(HMDT d, const double ***A,long N1,long N2,long N3); +void mgl_data_set_double3_(uintptr_t *d, const double *A,int *N1,int *N2,int *N3); +/// Import data from abstract type void mgl_data_set(HMDT dat, HCDT a); +void mgl_data_set_(uintptr_t *dat, uintptr_t *a); +/// Allocate memory and copy the data from the gsl_vector void mgl_data_set_vector(HMDT dat, gsl_vector *v); +/// Allocate memory and copy the data from the gsl_matrix void mgl_data_set_matrix(HMDT dat, gsl_matrix *m); +/// Set value of data element [i,j,k] void mgl_data_set_value(HMDT dat, mreal v, long i, long j, long k); +void mgl_data_set_value_(uintptr_t *d, mreal *v, int *i, int *j, int *k); +/// Get value of data element [i,j,k] mreal mgl_data_get_value(HCDT dat, long i, long j, long k); +mreal mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k); +/// Allocate memory and scanf the data from the string void mgl_data_set_values(HMDT dat, const char *val, long nx, long ny, long nz); +void mgl_data_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l); +/// Read data array from HDF file (parse HDF4 and HDF5 files) int mgl_data_read_hdf(HMDT d,const char *fname,const char *data); +int mgl_data_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n); +/// Save data to HDF file void mgl_data_save_hdf(HCDT d,const char *fname,const char *data,int rewrite); +void mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n); +/// Put HDF data names into buf as '\t' separated. int mgl_datas_hdf(const char *fname, char *buf, long size); +/// Read data from tab-separated text file with auto determining size int mgl_data_read(HMDT dat, const char *fname); +int mgl_data_read_(uintptr_t *d, const char *fname,int l); +/// Read data from text file with size specified at beginning of the file int mgl_data_read_mat(HMDT dat, const char *fname, long dim); +int mgl_data_read_mat_(uintptr_t *dat, const char *fname, int *dim, int); +/// Read data from text file with specifeid size int mgl_data_read_dim(HMDT dat, const char *fname,long mx,long my,long mz); +int mgl_data_read_dim_(uintptr_t *dat, const char *fname,int *mx,int *my,int *mz,int); +/// Read data from tab-separated text files with auto determining size which filenames are result of sprintf(fname,templ,t) where t=from:step:to int mgl_data_read_range(HMDT d, const char *templ, double from, double to, double step, int as_slice); +int mgl_data_read_range_(uintptr_t *d, const char *fname, mreal *from, mreal *to, mreal *step, int *as_slice,int l); +/// Read data from tab-separated text files with auto determining size which filenames are satisfied to template (like "t_*.dat") int mgl_data_read_all(HMDT dat, const char *templ, int as_slice); +int mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l); +/// Save whole data array (for ns=-1) or only ns-th slice to text file void mgl_data_save(HCDT dat, const char *fname,long ns); +void mgl_data_save_(uintptr_t *dat, const char *fname,int *ns,int); +/// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme void mgl_data_export(HCDT dat, const char *fname, const char *scheme,mreal v1,mreal v2,long ns); +void mgl_data_export_(uintptr_t *dat, const char *fname, const char *scheme,mreal *v1,mreal *v2,int *ns,int,int); +/// Import data array from PNG file according color scheme void mgl_data_import(HMDT dat, const char *fname, const char *scheme,mreal v1,mreal v2); +void mgl_data_import_(uintptr_t *dat, const char *fname, const char *scheme,mreal *v1,mreal *v2,int,int); +/// Create or recreate the array with specified size and fill it by zero void mgl_data_create(HMDT dat, long nx,long ny,long nz); +void mgl_data_create_(uintptr_t *dat, int *nx,int *ny,int *nz); +/// Transpose dimensions of the data (generalization of Transpose) void mgl_data_transpose(HMDT dat, const char *dim); +void mgl_data_transpose_(uintptr_t *dat, const char *dim,int); +/// Normalize the data to range [v1,v2] void mgl_data_norm(HMDT dat, mreal v1,mreal v2,long sym,long dim); +void mgl_data_norm_(uintptr_t *dat, mreal *v1,mreal *v2,int *sym,int *dim); +/// Normalize the data to range [v1,v2] slice by slice void mgl_data_norm_slice(HMDT dat, mreal v1,mreal v2,char dir,long keep_en,long sym); +void mgl_data_norm_slice_(uintptr_t *dat, mreal *v1,mreal *v2,char *dir,int *keep_en,int *sym,int l); +/// Get sub-array of the data with given fixed indexes HMDT mgl_data_subdata(HCDT dat, long xx,long yy,long zz); +uintptr_t mgl_data_subdata_(uintptr_t *dat, int *xx,int *yy,int *zz); +/// Get sub-array of the data with given fixed indexes (like indirect access) HMDT mgl_data_subdata_ext(HCDT dat, HCDT xx, HCDT yy, HCDT zz); +uintptr_t mgl_data_subdata_ext_(uintptr_t *dat, uintptr_t *xx,uintptr_t *yy,uintptr_t *zz); +/// Get column (or slice) of the data filled by formulas of named columns HMDT mgl_data_column(HCDT dat, const char *eq); +uintptr_t mgl_data_column_(uintptr_t *dat, const char *eq,int l); +/// Set names for columns (slices) void mgl_data_set_id(HMDT d, const char *id); +void mgl_data_set_id_(uintptr_t *dat, const char *id,int l); +/// Equidistantly fill the data to range [x1,x2] in direction dir void mgl_data_fill(HMDT dat, mreal x1,mreal x2,char dir); +void mgl_data_fill_(uintptr_t *dat, mreal *x1,mreal *x2,const char *dir,int); +/// Modify the data by specified formula assuming x,y,z in range [r1,r2] void mgl_data_fill_eq(HMGL gr, HMDT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt); +void mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int); +/// Set the data by triangulated surface values assuming x,y,z in range [r1,r2] void mgl_data_grid(HMGL gr, HMDT d, HCDT xdat, HCDT ydat, HCDT zdat,const char *opt); +void mgl_data_grid_(uintptr_t *gr, uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, const char *opt,int); +/// Put value to data element(s) void mgl_data_put_val(HMDT dat, mreal val, long i, long j, long k); +void mgl_data_put_val_(uintptr_t *dat, mreal *val, int *i, int *j, int *k); +/// Put array to data element(s) void mgl_data_put_dat(HMDT dat, HCDT val, long i, long j, long k); +void mgl_data_put_dat_(uintptr_t *dat, uintptr_t *val, int *i, int *j, int *k); +/// Modify the data by specified formula void mgl_data_modify(HMDT dat, const char *eq,long dim); +void mgl_data_modify_(uintptr_t *dat, const char *eq,int *dim,int); +/// Modify the data by specified formula void mgl_data_modify_vw(HMDT dat, const char *eq,HCDT vdat,HCDT wdat); +void mgl_data_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,int); +/// Reduce size of the data void mgl_data_squeeze(HMDT dat, long rx,long ry,long rz,long smooth); +void mgl_data_squeeze_(uintptr_t *dat, int *rx,int *ry,int *rz,int *smooth); + +/// Get maximal value of the data mreal mgl_data_max(HCDT dat); +mreal mgl_data_max_(uintptr_t *dat); +/// Get minimal value of the data mreal mgl_data_min(HCDT dat); +mreal mgl_data_min_(uintptr_t *dat); +/// Returns pointer to data element [i,j,k] mreal *mgl_data_value(HMDT dat, long i,long j,long k); +/// Returns pointer to internal data array mreal *mgl_data_data(HMDT dat); -mreal mgl_data_first(HCDT dat, const char *cond, long *i, long *j, long *k); -mreal mgl_data_last(HCDT dat, const char *cond, long *i, long *j, long *k); -long mgl_data_find(HCDT dat, const char *cond, char dir, long i, long j, long k); -int mgl_data_find_any(HCDT dat, const char *cond); -mreal mgl_data_max_int(HCDT dat, long *i, long *j, long *k); -mreal mgl_data_max_real(HCDT dat, mreal *x, mreal *y, mreal *z); -mreal mgl_data_min_int(HCDT dat, long *i, long *j, long *k); -mreal mgl_data_min_real(HCDT dat, mreal *x, mreal *y, mreal *z); -mreal mgl_data_momentum_val(HCDT d, char dir, mreal *m, mreal *w, mreal *s, mreal *k); - -HMDT mgl_data_combine(HCDT dat1, HCDT dat2); -void mgl_data_extend(HMDT dat, long n1, long n2); -void mgl_data_insert(HMDT dat, char dir, long at, long num); -void mgl_data_delete(HMDT dat, char dir, long at, long num); -/*****************************************************************************/ -/* Data manipulation functions */ -/*****************************************************************************/ -void mgl_data_smooth(HMDT d, const char *dirs, mreal delta); -HMDT mgl_data_sum(HCDT dat, const char *dir); -HMDT mgl_data_max_dir(HCDT dat, const char *dir); -HMDT mgl_data_min_dir(HCDT dat, const char *dir); -void mgl_data_cumsum(HMDT dat, const char *dir); -void mgl_data_integral(HMDT dat, const char *dir); -void mgl_data_diff(HMDT dat, const char *dir); -void mgl_data_diff_par(HMDT dat, HCDT v1, HCDT v2, HCDT v3); -void mgl_data_diff2(HMDT dat, const char *dir); -void mgl_data_swap(HMDT dat, const char *dir); -void mgl_data_roll(HMDT dat, char dir, long num); -void mgl_data_mirror(HMDT dat, const char *dir); -void mgl_data_sort(HMDT dat, long idx, long idy); - -void mgl_data_hankel(HMDT dat, const char *dir); -void mgl_data_sinfft(HMDT dat, const char *dir); -void mgl_data_cosfft(HMDT dat, const char *dir); -void mgl_data_fill_sample(HMDT dat, const char *how); - -mreal mgl_data_spline(HCDT dat, mreal x,mreal y,mreal z); -mreal mgl_data_linear(HCDT dat, mreal x,mreal y,mreal z); -HMDT mgl_data_trace(HCDT d); -HMDT mgl_data_resize(HCDT dat, long mx,long my,long mz); -HMDT mgl_data_resize_box(HCDT dat, long mx,long my,long mz,mreal x1,mreal x2,mreal y1,mreal y2,mreal z1,mreal z2); -HMDT mgl_data_hist(HCDT dat, long n, mreal v1, mreal v2, long nsub); -HMDT mgl_data_hist_w(HCDT dat, HCDT weight, long n, mreal v1, mreal v2, long nsub); -HMDT mgl_data_momentum(HCDT dat, char dir, const char *how); -HMDT mgl_data_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm); -void mgl_data_envelop(HMDT dat, char dir); -void mgl_data_sew(HMDT dat, const char *dirs, mreal da); -void mgl_data_crop(HMDT dat, long n1, long n2, char dir); -/*****************************************************************************/ -/* Data operations */ -/*****************************************************************************/ -void mgl_data_mul_dat(HMDT dat, HCDT d); -void mgl_data_div_dat(HMDT dat, HCDT d); -void mgl_data_add_dat(HMDT dat, HCDT d); -void mgl_data_sub_dat(HMDT dat, HCDT d); -void mgl_data_mul_num(HMDT dat, mreal d); -void mgl_data_div_num(HMDT dat, mreal d); -void mgl_data_add_num(HMDT dat, mreal d); -void mgl_data_sub_num(HMDT dat, mreal d); -/*****************************************************************************/ -HMDT mgl_pde_solve(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, mreal dz, mreal k0,const char *opt); -HMDT mgl_qo2d_solve(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); -HMDT mgl_ray_trace(const char *ham, mreal x0, mreal y0, mreal z0, mreal px, mreal py, mreal pz, mreal dt, mreal tmax); -HMDT mgl_jacobian_2d(HCDT x, HCDT y); -HMDT mgl_jacobian_3d(HCDT x, HCDT y, HCDT z); -HMDT mgl_transform_a(HCDT am, HCDT ph, const char *tr); -HMDT mgl_transform(HCDT re, HCDT im, const char *tr); -void mgl_data_fourier(HMDT re, HMDT im, const char *dir); -HMDT mgl_data_stfa(HCDT re, HCDT im, long dn, char dir); - -HMDT mgl_triangulation_3d(HCDT x, HCDT y, HCDT z); -HMDT mgl_triangulation_2d(HCDT x, HCDT y); -/*****************************************************************************/ -/* Data creation functions */ -/*****************************************************************************/ -void mgl_data_rearrange_(uintptr_t *dat, int *mx, int *my, int *mz); -void mgl_data_set_float_(uintptr_t *dat, const float *A,int *NX,int *NY,int *NZ); -void mgl_data_set_double_(uintptr_t *dat, const double *A,int *NX,int *NY,int *NZ); -void mgl_data_set_float1_(uintptr_t *d, const float *A,int *N1); -void mgl_data_set_double1_(uintptr_t *d, const double *A,int *N1); -void mgl_data_set_float2_(uintptr_t *d, const float *A,int *N1,int *N2); -void mgl_data_set_double2_(uintptr_t *d, const double *A,int *N1,int *N2); -void mgl_data_set_float3_(uintptr_t *d, const float *A,int *N1,int *N2,int *N3); -void mgl_data_set_double3_(uintptr_t *d, const double *A,int *N1,int *N2,int *N3); -void mgl_data_set_(uintptr_t *dat, uintptr_t *a); - -void mgl_data_set_value_(uintptr_t *d, mreal *v, int *i, int *j, int *k); -void mgl_data_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l); -mreal mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k); -int mgl_data_read_(uintptr_t *d, const char *fname,int l); -int mgl_data_read_mat_(uintptr_t *dat, const char *fname, int *dim, int); -int mgl_data_read_dim_(uintptr_t *dat, const char *fname,int *mx,int *my,int *mz,int); -void mgl_data_save_(uintptr_t *dat, const char *fname,int *ns,int); -void mgl_data_export_(uintptr_t *dat, const char *fname, const char *scheme,mreal *v1,mreal *v2,int *ns,int,int); -void mgl_data_import_(uintptr_t *dat, const char *fname, const char *scheme,mreal *v1,mreal *v2,int,int); -void mgl_data_create_(uintptr_t *dat, int *nx,int *ny,int *nz); -void mgl_data_transpose_(uintptr_t *dat, const char *dim,int); -void mgl_data_norm_(uintptr_t *dat, mreal *v1,mreal *v2,int *sym,int *dim); -void mgl_data_norm_slice_(uintptr_t *dat, mreal *v1,mreal *v2,char *dir,int *keep_en,int *sym,int l); -uintptr_t mgl_data_subdata_(uintptr_t *dat, int *xx,int *yy,int *zz); -uintptr_t mgl_data_subdata_ext_(uintptr_t *dat, uintptr_t *xx,uintptr_t *yy,uintptr_t *zz); -uintptr_t mgl_data_column_(uintptr_t *dat, const char *eq,int l); -void mgl_data_set_id_(uintptr_t *dat, const char *id,int l); -void mgl_data_fill_(uintptr_t *dat, mreal *x1,mreal *x2,const char *dir,int); -void mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int); -void mgl_data_grid_(uintptr_t *gr, uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, const char *opt,int); -void mgl_data_put_val_(uintptr_t *dat, mreal *val, int *i, int *j, int *k); -void mgl_data_put_dat_(uintptr_t *dat, uintptr_t *val, int *i, int *j, int *k); -void mgl_data_modify_(uintptr_t *dat, const char *eq,int *dim,int); -void mgl_data_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,int); -void mgl_data_squeeze_(uintptr_t *dat, int *rx,int *ry,int *rz,int *smooth); -mreal mgl_data_max_(uintptr_t *dat); -mreal mgl_data_min_(uintptr_t *dat); +/// Gets the x-size of the data. +long mgl_data_get_nx(HCDT d); +long mgl_data_get_nx_(uintptr_t *d); +/// Gets the y-size of the data. +long mgl_data_get_ny(HCDT d); +long mgl_data_get_ny_(uintptr_t *d); +/// Gets the z-size of the data. +long mgl_data_get_nz(HCDT d); +long mgl_data_get_nz_(uintptr_t *d); +/// Find position (after specified in i,j,k) of first nonzero value of formula +mreal mgl_data_first(HCDT dat, const char *cond, long *i, long *j, long *k); mreal mgl_data_first_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); +/// Find position (before specified in i,j,k) of last nonzero value of formula +mreal mgl_data_last(HCDT dat, const char *cond, long *i, long *j, long *k); mreal mgl_data_last_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); +/// Find position of first in direction 'dir' nonzero value of formula +long mgl_data_find(HCDT dat, const char *cond, char dir, long i, long j, long k); int mgl_data_find_(uintptr_t *dat, const char *cond, char *dir, int *i, int *j, int *k, int,int); +/// Find if any nonzero value of formula +int mgl_data_find_any(HCDT dat, const char *cond); int mgl_data_find_any_(uintptr_t *dat, const char *cond, int); +/// Get maximal value of the data and its position +mreal mgl_data_max_int(HCDT dat, long *i, long *j, long *k); mreal mgl_data_max_int_(uintptr_t *dat, int *i, int *j, int *k); +/// Get maximal value of the data and its approximated position +mreal mgl_data_max_real(HCDT dat, mreal *x, mreal *y, mreal *z); mreal mgl_data_max_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z); +/// Get minimal value of the data and its position +mreal mgl_data_min_int(HCDT dat, long *i, long *j, long *k); mreal mgl_data_min_int_(uintptr_t *dat, int *i, int *j, int *k); +/// Get minimal value of the data and its approximated position +mreal mgl_data_min_real(HCDT dat, mreal *x, mreal *y, mreal *z); mreal mgl_data_min_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z); +/// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis +mreal mgl_data_momentum_val(HCDT d, char dir, mreal *m, mreal *w, mreal *s, mreal *k); mreal mgl_data_momentum_val_(uintptr_t *dat, char *dir, mreal *m, mreal *w, mreal *s, mreal *k,int); +/// Get the data which is direct multiplication (like, d[i,j] = this[i]*a[j] and so on) +HMDT mgl_data_combine(HCDT dat1, HCDT dat2); uintptr_t mgl_data_combine_(uintptr_t *dat1, uintptr_t *dat2); +/// Extend data dimensions +void mgl_data_extend(HMDT dat, long n1, long n2); void mgl_data_extend_(uintptr_t *dat, int *n1, int *n2); +/// Insert data rows/columns/slices +void mgl_data_insert(HMDT dat, char dir, long at, long num); void mgl_data_insert_(uintptr_t *dat, const char *dir, int *at, int *num, int); +/// Delete data rows/columns/slices +void mgl_data_delete(HMDT dat, char dir, long at, long num); void mgl_data_delete_(uintptr_t *dat, const char *dir, int *at, int *num, int); -/*****************************************************************************/ -/* Data manipulation functions */ -/*****************************************************************************/ + +/// Smooth the data on specified direction or directions +void mgl_data_smooth(HMDT d, const char *dirs, mreal delta); void mgl_data_smooth_(uintptr_t *dat, const char *dirs, mreal *delta,int); +/// Get array which is result of summation in given direction or directions +HMDT mgl_data_sum(HCDT dat, const char *dir); uintptr_t mgl_data_sum_(uintptr_t *dat, const char *dir,int); +/// Get array which is result of maximal values in given direction or directions +HMDT mgl_data_max_dir(HCDT dat, const char *dir); uintptr_t mgl_data_max_dir_(uintptr_t *dat, const char *dir,int); +/// Get array which is result of minimal values in given direction or directions +HMDT mgl_data_min_dir(HCDT dat, const char *dir); uintptr_t mgl_data_min_dir_(uintptr_t *dat, const char *dir,int); +/// Cumulative summation the data in given direction or directions +void mgl_data_cumsum(HMDT dat, const char *dir); void mgl_data_cumsum_(uintptr_t *dat, const char *dir,int); +/// Integrate (cumulative summation) the data in given direction or directions +void mgl_data_integral(HMDT dat, const char *dir); void mgl_data_integral_(uintptr_t *dat, const char *dir,int); +/// Differentiate the data in given direction or directions +void mgl_data_diff(HMDT dat, const char *dir); void mgl_data_diff_(uintptr_t *dat, const char *dir,int); +/// Differentiate the parametrically specified data along direction v1 with v2,v3=const (v3 can be NULL) +void mgl_data_diff_par(HMDT dat, HCDT v1, HCDT v2, HCDT v3); void mgl_data_diff_par_(uintptr_t *dat, uintptr_t *v1, uintptr_t *v2, uintptr_t *v3); +/// Double-differentiate (like Laplace operator) the data in given direction +void mgl_data_diff2(HMDT dat, const char *dir); void mgl_data_diff2_(uintptr_t *dat, const char *dir,int); +/// Swap left and right part of the data in given direction (useful for Fourier spectrum) +void mgl_data_swap(HMDT dat, const char *dir); void mgl_data_swap_(uintptr_t *dat, const char *dir,int); +/// Roll data along direction dir by num slices +void mgl_data_roll(HMDT dat, char dir, long num); void mgl_data_roll_(uintptr_t *dat, const char *dir, int *num, int); +/// Mirror the data in given direction (useful for Fourier spectrum) +void mgl_data_mirror(HMDT dat, const char *dir); void mgl_data_mirror_(uintptr_t *dat, const char *dir,int); +/// Sort rows (or slices) by values of specified column +void mgl_data_sort(HMDT dat, long idx, long idy); void mgl_data_sort_(uintptr_t *dat, int *idx, int *idy); +/// Apply Hankel transform +void mgl_data_hankel(HMDT dat, const char *dir); void mgl_data_hankel_(uintptr_t *dat, const char *dir,int); +/// Apply Sin-Fourier transform +void mgl_data_sinfft(HMDT dat, const char *dir); void mgl_data_sinfft_(uintptr_t *dat, const char *dir,int); +/// Apply Cos-Fourier transform +void mgl_data_cosfft(HMDT dat, const char *dir); void mgl_data_cosfft_(uintptr_t *dat, const char *dir,int); +/// Fill data by 'x'/'k' samples for Hankel ('h') or Fourier ('f') transform +void mgl_data_fill_sample(HMDT dat, const char *how); void mgl_data_fill_sample_(uintptr_t *dat, const char *how,int); +/// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] +mreal mgl_data_spline(HCDT dat, mreal x,mreal y,mreal z); mreal mgl_data_spline_(uintptr_t *dat, mreal *x,mreal *y,mreal *z); +/// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] +mreal mgl_data_linear(HCDT dat, mreal x,mreal y,mreal z); mreal mgl_data_linear_(uintptr_t *dat, mreal *x,mreal *y,mreal *z); +/// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] +mreal mgl_data_spline_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz); +mreal mgl_data_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz); +/// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] +mreal mgl_data_linear_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz); +mreal mgl_data_linear_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz); +/// Return an approximated x-value (root) when dat(x) = val +mreal mgl_data_solve_1d(HCDT dat, mreal val, int spl, long i0); +mreal mgl_data_solve_1d_(uintptr_t *dat, mreal *val, int *spl, int *i0); +/// Return an approximated value (root) when dat(x) = val +HMDT mgl_data_solve(HCDT dat, mreal val, char dir, HCDT i0, int norm); +uintptr_t mgl_data_solve_(uintptr_t *dat, mreal *val, const char *dir, uintptr_t *i0, int *norm,int); + +/// Get trace of the data array +HMDT mgl_data_trace(HCDT d); uintptr_t mgl_data_trace_(uintptr_t *d); +/// Resize the data to new sizes +HMDT mgl_data_resize(HCDT dat, long mx,long my,long mz); uintptr_t mgl_data_resize_(uintptr_t *dat, int *mx,int *my,int *mz); +/// Resize the data to new sizes of box [x1,x2]*[y1,y2]*[z1,z2] +HMDT mgl_data_resize_box(HCDT dat, long mx,long my,long mz,mreal x1,mreal x2,mreal y1,mreal y2,mreal z1,mreal z2); uintptr_t mgl_data_resize_box_(uintptr_t *dat, int *mx,int *my,int *mz,mreal *x1,mreal *x2,mreal *y1,mreal *y2,mreal *z1,mreal *z2); +/// Create n-th points distribution of this data values in range [v1, v2] +HMDT mgl_data_hist(HCDT dat, long n, mreal v1, mreal v2, long nsub); uintptr_t mgl_data_momentum_(uintptr_t *dat, char *dir, const char *how, int,int); +/// Create n-th points distribution of this data values in range [v1, v2] with weight w +HMDT mgl_data_hist_w(HCDT dat, HCDT weight, long n, mreal v1, mreal v2, long nsub); uintptr_t mgl_data_hist_(uintptr_t *dat, int *n, mreal *v1, mreal *v2, int *nsub); +/// Get momentum (1D-array) of data along direction 'dir'. String looks like "x1" for median in x-direction, "x2" for width in x-dir and so on. +HMDT mgl_data_momentum(HCDT dat, char dir, const char *how); uintptr_t mgl_data_hist_w_(uintptr_t *dat, uintptr_t *weight, int *n, mreal *v1, mreal *v2, int *nsub); +/// Get array which values is result of interpolation this for coordinates from other arrays +HMDT mgl_data_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm); uintptr_t mgl_data_evaluate_(uintptr_t *dat, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm); +/// Set as the data envelop +void mgl_data_envelop(HMDT dat, char dir); void mgl_data_envelop_(uintptr_t *dat, const char *dir, int); +/// Remove phase jump +void mgl_data_sew(HMDT dat, const char *dirs, mreal da); void mgl_data_sew_(uintptr_t *dat, const char *dirs, mreal *da, int); +/// Crop the data +void mgl_data_crop(HMDT dat, long n1, long n2, char dir); void mgl_data_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int); -/*****************************************************************************/ -/* Data operations */ -/*****************************************************************************/ +/// Remove rows with duplicate values in column id +void mgl_data_clean(HMDT dat, long id); +void mgl_data_clean_(uintptr_t *dat, int *id); + +/// Multiply the data by other one for each element +void mgl_data_mul_dat(HMDT dat, HCDT d); void mgl_data_mul_dat_(uintptr_t *dat, uintptr_t *d); +/// Divide the data by other one for each element +void mgl_data_div_dat(HMDT dat, HCDT d); void mgl_data_div_dat_(uintptr_t *dat, uintptr_t *d); +/// Add the other data +void mgl_data_add_dat(HMDT dat, HCDT d); void mgl_data_add_dat_(uintptr_t *dat, uintptr_t *d); +/// Subtract the other data +void mgl_data_sub_dat(HMDT dat, HCDT d); void mgl_data_sub_dat_(uintptr_t *dat, uintptr_t *d); +/// Multiply each element by the number +void mgl_data_mul_num(HMDT dat, mreal d); void mgl_data_mul_num_(uintptr_t *dat, mreal *d); +/// Divide each element by the number +void mgl_data_div_num(HMDT dat, mreal d); void mgl_data_div_num_(uintptr_t *dat, mreal *d); +/// Add the number +void mgl_data_add_num(HMDT dat, mreal d); void mgl_data_add_num_(uintptr_t *dat, mreal *d); +/// Subtract the number +void mgl_data_sub_num(HMDT dat, mreal d); void mgl_data_sub_num_(uintptr_t *dat, mreal *d); -/*****************************************************************************/ -/* Nonlinear fitting */ -/*****************************************************************************/ + +/// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini +HMDT mgl_pde_solve(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, mreal dz, mreal k0,const char *opt); uintptr_t mgl_pde_solve_(uintptr_t* gr, const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, mreal *dz, mreal *k0,const char *opt,int,int); +/// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) +HMDT mgl_qo2d_solve(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); uintptr_t mgl_qo2d_solve_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, mreal *r, mreal *k0, uintptr_t* xx, uintptr_t* yy, int); +/// Finds ray with starting point r0, p0 (and prepares ray data for mgl_qo2d_solve) +HMDT mgl_ray_trace(const char *ham, mreal x0, mreal y0, mreal z0, mreal px, mreal py, mreal pz, mreal dt, mreal tmax); uintptr_t mgl_ray_trace_(const char *ham, mreal *x0, mreal *y0, mreal *z0, mreal *px, mreal *py, mreal *pz, mreal *dt, mreal *tmax,int); +/// Calculate Jacobian determinant for D{x(u,v), y(u,v)} = dx/du*dy/dv-dx/dv*dy/du +HMDT mgl_jacobian_2d(HCDT x, HCDT y); uintptr_t mgl_jacobian_2d_(uintptr_t* x, uintptr_t* y); +/// Calculate Jacobian determinant for D{x(u,v,w), y(u,v,w), z(u,v,w)} +HMDT mgl_jacobian_3d(HCDT x, HCDT y, HCDT z); uintptr_t mgl_jacobian_3d_(uintptr_t* x, uintptr_t* y, uintptr_t* z); - +/// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for amplitude and phase +HMDT mgl_transform_a(HCDT am, HCDT ph, const char *tr); uintptr_t mgl_transform_a_(uintptr_t *am, uintptr_t *ph, const char *tr, int); +/// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for real and imaginary parts +HMDT mgl_transform(HCDT re, HCDT im, const char *tr); uintptr_t mgl_transform_(uintptr_t *re, uintptr_t *im, const char *tr, int); +/// Apply Fourier transform for the data and save result into it +void mgl_data_fourier(HMDT re, HMDT im, const char *dir); void mgl_data_fourier_(uintptr_t *re, uintptr_t *im, const char *dir, int l); +/// Short time Fourier analysis for real and imaginary parts. Output is amplitude of partial Fourier (result will have size {dn, floor(nx/dn), ny} for dir='x' +HMDT mgl_data_stfa(HCDT re, HCDT im, long dn, char dir); uintptr_t mgl_data_stfa_(uintptr_t *re, uintptr_t *im, int *dn, char *dir, int); +/// Do something like Delone triangulation for 3d points +HMDT mgl_triangulation_3d(HCDT x, HCDT y, HCDT z); uintptr_t mgl_triangulation_3d_(uintptr_t *x, uintptr_t *y, uintptr_t *z); +/// Do Delone triangulation for 2d points +HMDT mgl_triangulation_2d(HCDT x, HCDT y); uintptr_t mgl_triangulation_2d_(uintptr_t *x, uintptr_t *y); -/*****************************************************************************/ -int mgl_data_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n); -void mgl_data_link_(uintptr_t *d, float *A, int *nx,int *ny,int *nz); -void mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n); -int mgl_data_read_range_(uintptr_t *d, const char *fname, double *from, double *to, double *step, int *as_slice,int l); -int mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l); -/*****************************************************************************/ + #ifdef __cplusplus } #endif +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/datac.h b/include/mgl2/datac.h new file mode 100644 index 0000000..ea96d47 --- /dev/null +++ b/include/mgl2/datac.h @@ -0,0 +1,372 @@ +/*************************************************************************** + * data.h is part of Math Graphic Library + * Copyright (C) 2007-2012 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _MGL_DATAC_H_ +#define _MGL_DATAC_H_ + +#include "mgl2/data.h" +#include "mgl2/datac_cf.h" +#ifdef __cplusplus +//----------------------------------------------------------------------------- +#include +#include +#define mgl2 mreal(2) +#define mgl3 mreal(3) +#define mgl4 mreal(4) +//----------------------------------------------------------------------------- +/// Class for working with data array +class mglDataC : public mglDataA +{ +public: + + long nx; ///< number of points in 1st dimensions ('x' dimension) + long ny; ///< number of points in 2nd dimensions ('y' dimension) + long nz; ///< number of points in 3d dimensions ('z' dimension) + dual *a; ///< data array + std::string id; ///< column (or slice) names + bool link; ///< use external data (i.e. don't free it) + + /// Initiate by other mglData variable + inline mglDataC(const mglDataC &d) { a=0; mgl_datac_set(this,&d); } // NOTE: must be constructor for mglDataC& to exclude copy one + inline mglDataC(const mglDataA *d) { a=0; mgl_datac_set(this, d); } + inline mglDataC(bool, mglDataC *d) // NOTE: Variable d will be deleted!!! + { if(d) + { nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=0; + id=d->id; link=d->link; delete d; } + else { a=0; Create(1); } } + /// Initiate by flat array + inline mglDataC(int size, const dual *d) { a=0; Set(d,size); } + inline mglDataC(int rows, int cols, const dual *d) { a=0; Set(d,cols,rows); } + inline mglDataC(int size, const double *d) { a=0; Set(d,size); } + inline mglDataC(int rows, int cols, const double *d) { a=0; Set(d,cols,rows); } + inline mglDataC(int size, const float *d) { a=0; Set(d,size); } + inline mglDataC(int rows, int cols, const float *d) { a=0; Set(d,cols,rows); } + /// Read data from file + inline mglDataC(const char *fname) { a=0; Read(fname); } + /// Allocate the memory for data array and initialize it zero + inline mglDataC(long xx=1,long yy=1,long zz=1) { a=0; Create(xx,yy,zz); } + /// Delete the array + virtual ~mglDataC() { if(!link && a) delete []a; } + inline dual GetVal(long i, long j=0, long k=0) + { return mgl_datac_get_value(this,i,j,k);} + inline void SetVal(dual f, long i, long j=0, long k=0) + { mgl_datac_set_value(this,f,i,j,k); } + /// Get sizes + inline long GetNx() const { return nx; } + inline long GetNy() const { return ny; } + inline long GetNz() const { return nz; } + + /// Link external data array (don't delete it at exit) + inline void Link(dual *A, long NX, long NY=1, long NZ=1) + { mgl_datac_link(this,A,NX,NY,NZ); } + inline void Link(mglDataC &d) { Link(d.a,d.nx,d.ny,d.nz); } + /// Allocate memory and copy the data from the gsl_vector + inline void Set(gsl_vector *m) { mgl_datac_set_vector(this,m); } + /// Allocate memory and copy the data from the gsl_matrix + inline void Set(gsl_matrix *m) { mgl_datac_set_matrix(this,m); } + + /// Allocate memory and copy the data from the (float *) array + inline void Set(const float *A,long NX,long NY=1,long NZ=1) + { mgl_datac_set_float(this,A,NX,NY,NZ); } + /// Allocate memory and copy the data from the (double *) array + inline void Set(const double *A,long NX,long NY=1,long NZ=1) + { mgl_datac_set_double(this,A,NX,NY,NZ); } + /// Allocate memory and copy the data from the (complex *) array + inline void Set(const dual *A,long NX,long NY=1,long NZ=1) + { mgl_datac_set_complex(this,A,NX,NY,NZ); } + /// Allocate memory and scanf the data from the string + inline void Set(const char *str,long NX,long NY=1,long NZ=1) + { mgl_datac_set_values(this,str,NX,NY,NZ); } + /// Import data from abstract type + inline void Set(HCDT dat) { mgl_datac_set(this, dat); } + inline void Set(const mglDataA &dat) { mgl_datac_set(this, &dat); } + inline void Set(const mglDataA &re, const mglDataA &im) { mgl_datac_set_ri(this, &re, &im); } + inline void Set(HCDT re, HCDT im) { mgl_datac_set_ri(this, re, im); } + inline void SetAmpl(const mglDataA &l, const mglDataA &phase) + { mgl_datac_set_ap(this, &l, &phase); } + /// Allocate memory and copy data from std::vector + inline void Set(const std::vector &d) + { if(d.size()<1) return; + Create(d.size()); for(long i=0;i &d) + { if(d.size()<1) return; + Create(d.size()); for(long i=0;i &d) + { if(d.size()<1) return; + Create(d.size()); for(long i=0;i &d) + { if(d.size()<1) return; + Create(d.size()); for(long i=0;i1?nx-1:1; dif.y/=ny>1?ny-1:1; dif.z/=nz>1?nz-1:1; + return val; + } + /// Return an approximated x-value (root) when dat(x) = val + inline mreal Solve(mreal val, bool use_spline=true, long i0=0) const + { return mgl_data_solve_1d(this, val, use_spline, i0); } + /// Return an approximated value (root) when dat(x) = val + inline mglData Solve(mreal val, char dir, bool norm=true) const + { return mglData(true,mgl_data_solve(this, val, dir, 0, norm)); } + inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const + { return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); } + + /// Print information about the data (sizes and momentum) to string + inline const char *PrintInfo() const { return mgl_data_info(this); } + /// Print information about the data (sizes and momentum) to FILE (for example, stdout) + inline void PrintInfo(FILE *fp) const + { if(fp) { fprintf(fp,"%s",mgl_data_info(this)); fflush(fp); } } + /// Get maximal value of the data + inline mreal Maximal() const { return mgl_data_max(this); } + /// Get minimal value of the data + inline mreal Minimal() const { return mgl_data_min(this); } + /// Get maximal value of the data and its position + inline mreal Maximal(long &i,long &j,long &k) const + { return mgl_data_max_int(this,&i,&j,&k); } + /// Get minimal value of the data and its position + inline mreal Minimal(long &i,long &j,long &k) const + { return mgl_data_min_int(this,&i,&j,&k); } + /// Get maximal value of the data and its approximated position + inline mreal Maximal(mreal &x,mreal &y,mreal &z) const + { return mgl_data_max_real(this,&x,&y,&z); } + /// Get minimal value of the data and its approximated position + inline mreal Minimal(mreal &x,mreal &y,mreal &z) const + { return mgl_data_min_real(this,&x,&y,&z); } + + /// Copy data from other mglData variable + inline mglDataC &operator=(const mglData &d) + { Set(&d); return *this; } + /// Copy data from other mglDataC variable + inline mglDataC &operator=(const mglDataC &d) + { if(this!=&d) Set(d.a,d.nx,d.ny,d.nz); return *this; } + inline dual operator=(dual val) + { for(long i=0;i=nx || j>=ny || k>=nz) printf("Wrong index in mglData"); + return abs(a[i+nx*(j+ny*k)]); } +#else + { return abs(a[i+nx*(j+ny*k)]); } +#endif + inline mreal vthr(long i) const { return abs(a[i]); } + // add for speeding up !!! + inline mreal dvx(long i,long j=0,long k=0) const + { register long i0=i+nx*(j+ny*k); + return i>0? abs(i0? abs(j0? abs(k * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _MGL_DATAC_CF_H_ +#define _MGL_DATAC_CF_H_ +//----------------------------------------------------------------------------- +#include "mgl2/base.h" +//----------------------------------------------------------------------------- +#if MGL_HAVE_GSL +#include +#include +#else +struct gsl_vector; +struct gsl_matrix; +#endif +//----------------------------------------------------------------------------- +#ifdef __cplusplus +class mglDataC; +typedef mglDataC* HADT; +extern "C" { +#else +typedef void *HADT; +#endif + +/// Create HMDT object +HADT mgl_create_datac(); +uintptr_t mgl_create_datac_(); +/// Create HMDT object with specified sizes +HADT mgl_create_datac_size(long nx, long ny, long nz); +uintptr_t mgl_create_datac_size_(int *nx, int *ny, int *nz); +/// Create HMDT object with data from file +HADT mgl_create_datac_file(const char *fname); +uintptr_t mgl_create_datac_file_(const char *fname, int len); +/// Delete HMDT object +void mgl_delete_datac(HADT dat); +void mgl_delete_datac_(uintptr_t *dat); + +/// Rearange data dimensions +void mgl_datac_rearrange(HADT dat, long mx,long my,long mz); +void mgl_datac_rearrange_(uintptr_t *dat, int *mx, int *my, int *mz); +/// Link external data array (don't delete it at exit) +void mgl_datac_link(HADT dat, dual *A,long mx,long my,long mz); +void mgl_datac_link_(uintptr_t *d, dual *A, int *nx,int *ny,int *nz); +/// Allocate memory and copy the data from the (float *) array +void mgl_datac_set_float(HADT dat, const float *A,long mx,long my,long mz); +void mgl_datac_set_float_(uintptr_t *dat, const float *A,int *NX,int *NY,int *NZ); +/// Allocate memory and copy the data from the (double *) array +void mgl_datac_set_double(HADT dat, const double *A,long mx,long my,long mz); +void mgl_datac_set_double_(uintptr_t *dat, const double *A,int *NX,int *NY,int *NZ); +/// Allocate memory and copy the data from the (dual *) array +void mgl_datac_set_complex(HADT dat, const dual *A,long mx,long my,long mz); +void mgl_datac_set_complex_(uintptr_t *d, const dual *A,int *NX,int *NY,int *NZ); +/// Import data from abstract type +void mgl_datac_set(HADT dat, HCDT a); +void mgl_datac_set_(uintptr_t *dat, uintptr_t *a); +/// Allocate memory and copy the data from the gsl_vector +void mgl_datac_set_vector(HADT dat, gsl_vector *v); +/// Allocate memory and copy the data from the gsl_matrix +void mgl_datac_set_matrix(HADT dat, gsl_matrix *m); +/// Set value of data element [i,j,k] +void mgl_datac_set_value(HADT dat, dual v, long i, long j, long k); +void mgl_datac_set_value_(uintptr_t *d, mreal *v, int *i, int *j, int *k); +/// Get value of data element [i,j,k] +dual mgl_datac_get_value(HCDT dat, long i, long j, long k); +/// Allocate memory and scanf the data from the string +void mgl_datac_set_values(HADT dat, const char *val, long nx, long ny, long nz); +void mgl_datac_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l); + +/// Returns pointer to internal data array +dual *mgl_datac_data(HADT dat); +/// Returns pointer to data element [i,j,k] +dual *mgl_datac_value(HADT dat, long i,long j,long k); + +/// Set the data from HCDT objects for real and imaginary parts +void mgl_datac_set_ri(HADT dat, HCDT re, HCDT im); +void mgl_datac_set_ri_(uintptr_t *dat, uintptr_t *re, uintptr_t *im); +/// Set the data from HCDT objects as amplitude and phase of complex data +void mgl_datac_set_ap(HADT dat, HCDT abs, HCDT phi); +void mgl_datac_set_ap_(uintptr_t *dat, uintptr_t *abs, uintptr_t *phi); + +/// Read data from tab-separated text file with auto determining size +int mgl_datac_read(HADT dat, const char *fname); +int mgl_datac_read_(uintptr_t *d, const char *fname,int l); +/// Read data from text file with size specified at beginning of the file +int mgl_datac_read_mat(HADT dat, const char *fname, long dim); +int mgl_datac_read_mat_(uintptr_t *dat, const char *fname, int *dim, int); +/// Read data from text file with specifeid size +int mgl_datac_read_dim(HADT dat, const char *fname,long mx,long my,long mz); +int mgl_datac_read_dim_(uintptr_t *dat, const char *fname,int *mx,int *my,int *mz,int); +/// Read data from tab-separated text files with auto determining size which filenames are result of sprintf(fname,templ,t) where t=from:step:to +int mgl_datac_read_range(HADT d, const char *templ, double from, double to, double step, int as_slice); +int mgl_data_read_range_(uintptr_t *d, const char *fname, mreal *from, mreal *to, mreal *step, int *as_slice,int l); +/// Read data from tab-separated text files with auto determining size which filenames are satisfied to template (like "t_*.dat") +int mgl_datac_read_all(HADT dat, const char *templ, int as_slice); +int mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l); +/// Save whole data array (for ns=-1) or only ns-th slice to text file +void mgl_datac_save(HCDT dat, const char *fname,long ns); +void mgl_datac_save_(uintptr_t *dat, const char *fname,int *ns,int); + +/// Read data array from HDF file (parse HDF4 and HDF5 files) +int mgl_datac_read_hdf(HADT d,const char *fname,const char *data); +int mgl_datac_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n); +/// Save data to HDF file +void mgl_datac_save_hdf(HCDT d,const char *fname,const char *data,int rewrite); +void mgl_datac_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n); + +/// Create or recreate the array with specified size and fill it by zero +void mgl_datac_create(HADT dat, long nx,long ny,long nz); +void mgl_datac_create_(uintptr_t *dat, int *nx,int *ny,int *nz); +/// Transpose dimensions of the data (generalization of Transpose) +void mgl_datac_transpose(HADT dat, const char *dim); +void mgl_datac_transpose_(uintptr_t *dat, const char *dim,int); +/// Set names for columns (slices) +void mgl_datac_set_id(HADT d, const char *id); +void mgl_datac_set_id_(uintptr_t *dat, const char *id,int l); +/// Equidistantly fill the data to range [x1,x2] in direction dir +void mgl_datac_fill(HADT dat, dual x1,dual x2,char dir); +void mgl_datac_fill_(uintptr_t *dat, mreal *x1,mreal *x2,const char *dir,int); +/// Modify the data by specified formula assuming x,y,z in range [r1,r2] +void mgl_datac_fill_eq(HMGL gr, HADT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt); +void mgl_datac_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int); +/// Modify the data by specified formula +void mgl_datac_modify(HADT dat, const char *eq,long dim); +void mgl_datac_modify_(uintptr_t *dat, const char *eq,int *dim,int); +/// Modify the data by specified formula +void mgl_datac_modify_vw(HADT dat, const char *eq,HCDT vdat,HCDT wdat); +void mgl_datac_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,int); + +/// Reduce size of the data +void mgl_datac_squeeze(HADT dat, long rx,long ry,long rz,long smooth); +void mgl_datac_squeeze_(uintptr_t *dat, int *rx,int *ry,int *rz,int *smooth); +/// Extend data dimensions +void mgl_datac_extend(HADT dat, long n1, long n2); +void mgl_datac_extend_(uintptr_t *dat, int *n1, int *n2); +/// Insert data rows/columns/slices +void mgl_datac_insert(HADT dat, char dir, long at, long num); +void mgl_datac_insert_(uintptr_t *dat, const char *dir, int *at, int *num, int); +/// Delete data rows/columns/slices +void mgl_datac_delete(HADT dat, char dir, long at, long num); +void mgl_datac_delete_(uintptr_t *dat, const char *dir, int *at, int *num, int); + +/// Smooth the data on specified direction or directions +void mgl_datac_smooth(HADT d, const char *dirs, mreal delta); +void mgl_datac_smooth_(uintptr_t *dat, const char *dirs, mreal *delta,int); +/// Cumulative summation the data in given direction or directions +void mgl_datac_cumsum(HADT dat, const char *dir); +void mgl_datac_cumsum_(uintptr_t *dat, const char *dir,int); +/// Integrate (cumulative summation) the data in given direction or directions +void mgl_datac_integral(HADT dat, const char *dir); +void mgl_datac_integral_(uintptr_t *dat, const char *dir,int); +/// Differentiate the data in given direction or directions +void mgl_datac_diff(HADT dat, const char *dir); +void mgl_datac_diff_(uintptr_t *dat, const char *dir,int); +/// Double-differentiate (like Laplace operator) the data in given direction +void mgl_datac_diff2(HADT dat, const char *dir); +void mgl_datac_diff2_(uintptr_t *dat, const char *dir,int); +/// Swap left and right part of the data in given direction (useful for Fourier spectrum) +void mgl_datac_swap(HADT dat, const char *dir); +void mgl_datac_swap_(uintptr_t *dat, const char *dir,int); +/// Roll data along direction dir by num slices +void mgl_datac_roll(HADT dat, char dir, long num); +void mgl_datac_roll_(uintptr_t *dat, const char *dir, int *num, int); +/// Mirror the data in given direction (useful for Fourier spectrum) +void mgl_datac_mirror(HADT dat, const char *dir); +void mgl_datac_mirror_(uintptr_t *dat, const char *dir,int); +/// Crop the data +void mgl_datac_crop(HADT dat, long n1, long n2, char dir); +void mgl_data_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int); + +/// Apply Hankel transform +void mgl_datac_hankel(HADT dat, const char *dir); +void mgl_datac_hankel_(uintptr_t *dat, const char *dir,int); +/// Apply Fourier transform +void mgl_datac_fft(HADT dat, const char *dir); +void mgl_datac_fft_(uintptr_t *dat, const char *dir,int); + +HMDT mgl_datac_real(HCDT dat); +uintptr_t mgl_datac_real_(uintptr_t *dat); +HMDT mgl_datac_imag(HCDT dat); +uintptr_t mgl_datac_imag_(uintptr_t *dat); +HMDT mgl_datac_abs(HCDT dat); +uintptr_t mgl_datac_abs_(uintptr_t *dat); +HMDT mgl_datac_arg(HCDT dat); +uintptr_t mgl_datac_arg_(uintptr_t *dat); + +/// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] +dual mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z); +dual mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z); +/// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] +dual mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz); +dual mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz); + +#ifdef __cplusplus +} +#endif +//----------------------------------------------------------------------------- +#endif diff --git a/include/mgl2/define.h b/include/mgl2/define.h index b95a7ac..fc4e279 100644 --- a/include/mgl2/define.h +++ b/include/mgl2/define.h @@ -1,6 +1,6 @@ /*************************************************************************** * define.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -21,11 +21,14 @@ #define _MGL_DEFINE_H_ //----------------------------------------------------------------------------- #include "mgl2/config.h" + +#define MGL_VER2 1.0 //----------------------------------------------------------------------------- #ifdef WIN32 //_MSC_VER needs this before math.h #define _USE_MATH_DEFINES #endif +#ifdef MGL_SRC #if MGL_HAVE_ZLIB #include #ifndef Z_BEST_COMPRESSION @@ -40,6 +43,7 @@ #define gzgets(fp,str,size) fgets(str,size,fp) #define gzgetc fgetc #endif +#endif #include #include @@ -52,14 +56,13 @@ #define fmax(a,b) ((a)>(b))?(a):(b) #endif -#define MGL_VER2 0.3 +#if defined(_MSC_VER) +#define hypot _hypot +#define getcwd _getcwd +#define chdir _chdir // BORLAND has chdir +#endif -//#ifdef WIN32 #if defined(_MSC_VER) || defined(__BORLANDC__) -#define hypot _hypot -#define getcwd _getcwd -#define isfinite _finite -#define chdir _chdir // BORLAND has chdir #include const unsigned long mgl_nan[2] = {0xffffffff, 0x7fffffff}; @@ -90,6 +93,7 @@ typedef double mreal; typedef float mreal; #define MGL_EPSILON (1.+1e-5) #endif +#define MGL_FEPSILON (1.+1e-5) //----------------------------------------------------------------------------- #ifndef MGL_CMAP_COLOR #define MGL_CMAP_COLOR 32 @@ -103,14 +107,6 @@ typedef float mreal; #define MGL_DEF_VIEWER "evince" #endif //----------------------------------------------------------------------------- -#ifndef MGL_FONT_PATH -#ifdef WIN32 -#define MGL_FONT_PATH "." // path to fonts -#else -#define MGL_FONT_PATH "/usr/local/share/mathgl/fonts" // path to fonts -#endif -#endif -//----------------------------------------------------------------------------- #define mgl_min(a,b) (((a)>(b)) ? (b) : (a)) #define mgl_max(a,b) (((a)>(b)) ? (a) : (b)) #define mgl_isnan(a) ((a)!=(a)) @@ -151,20 +147,20 @@ enum{ // types of predefined curvelinear coordinate systems enum{ // Codes for warnings/messages mglWarnNone = 0,// Everything OK mglWarnDim, // Data dimension(s) is incompatible - mglWarnLow, // Data dimension(s) is too small - mglWarnNeg, // Minimal data value is negative - mglWarnFile, // No file or wrong data dimensions + mglWarnLow, // Data dimension(s) is too small + mglWarnNeg, // Minimal data value is negative + mglWarnFile, // No file or wrong data dimensions mglWarnMem, // Not enough memory - mglWarnZero, // Data values are zero + mglWarnZero, // Data values are zero mglWarnLeg, // No legend entries mglWarnSlc, // Slice value is out of range mglWarnCnt, // Number of contours is zero or negative - mglWarnOpen, // Couldn't open file + mglWarnOpen, // Couldn't open file mglWarnLId, // Light: ID is out of range - mglWarnSize, // Setsize: size(s) is zero or negative + mglWarnSize, // Setsize: size(s) is zero or negative mglWarnFmt, // Format is not supported for that build - mglWarnTern, // Axis ranges are incompatible - mglWarnNull, // Pointer is NULL + mglWarnTern, // Axis ranges are incompatible + mglWarnNull, // Pointer is NULL mglWarnSpc, // Not enough space for plot mglWarnEnd // Maximal number of warnings (must be last) }; @@ -175,57 +171,93 @@ enum{ // Codes for warnings/messages #define MGL_COLORS "kwrgbcymhWRGBCYMHlenpquLENPQU" //----------------------------------------------------------------------------- #define MGL_TRANSP_NORM 0x000000 -#define MGL_TRANSP_GLASS 0x000001 +#define MGL_TRANSP_GLASS 0x000001 #define MGL_TRANSP_LAMP 0x000002 -#define MGL_ENABLE_CUT 0x000004 ///< Flag which determines how points outside bounding box are drown. -#define MGL_ENABLE_RTEXT 0x000008 ///< Use text rotation along axis -#define MGL_AUTO_FACTOR 0x000010 ///< Enable autochange PlotFactor -#define MGL_ENABLE_ALPHA 0x000020 ///< Flag that Alpha is used -#define MGL_ENABLE_LIGHT 0x000040 ///< Flag of using lightning -#define MGL_TICKS_ROTATE 0x000080 ///< Allow ticks rotation -#define MGL_TICKS_SKIP 0x000100 ///< Allow ticks rotation +#define MGL_ENABLE_CUT 0x000004 ///< Flag which determines how points outside bounding box are drown. +#define MGL_ENABLE_RTEXT 0x000008 ///< Use text rotation along axis +#define MGL_AUTO_FACTOR 0x000010 ///< Enable autochange PlotFactor +#define MGL_ENABLE_ALPHA 0x000020 ///< Flag that Alpha is used +#define MGL_ENABLE_LIGHT 0x000040 ///< Flag of using lightning +#define MGL_TICKS_ROTATE 0x000080 ///< Allow ticks rotation +#define MGL_TICKS_SKIP 0x000100 ///< Allow ticks rotation // flags for internal use only -#define MGL_DISABLE_SCALE 0x000200 ///< Temporary flag for disable scaling (used for axis) -#define MGL_FINISHED 0x000400 ///< Flag that final picture (i.e. mglCanvas::G) is ready -#define MGL_USE_GMTIME 0x000800 ///< Use gmtime instead of localtime -#define MGL_SHOW_POS 0x001000 ///< Switch to show or not mouse click position -#define MGL_CLF_ON_UPD 0x002000 ///< Clear plot before Update() -#define MGL_NOSUBTICKS 0x004000 ///< Disable subticks drawing (for bounding box) -#define MGL_DIFFUSIVE 0x008000 ///< Use diffusive light instead of specular -#define MGL_USEDRWDAT 0x010000 ///< Use DrwDat to remember all data of frames -#define MGL_REDUCEACC 0x020000 ///< Reduce accuracy of points (to reduc size of output files) -#define MGL_PREFERVC 0x040000 ///< Prefer vertex color instead of texture if output format supports -#define MGL_ONESIDED 0x080000 ///< Render only front side of surfaces if output format supports (for debugging) -//----------------------------------------------------------------------------- -//#define mgl_realloc(T,o,no,nn) {T *_tmp = new T[nn]; memcpy(_tmp,o,(no)*sizeof(T)); delete []o; o=_tmp;} +#define MGL_DISABLE_SCALE 0x000200 ///< Temporary flag for disable scaling (used for axis) +#define MGL_FINISHED 0x000400 ///< Flag that final picture (i.e. mglCanvas::G) is ready +#define MGL_USE_GMTIME 0x000800 ///< Use gmtime instead of localtime +#define MGL_SHOW_POS 0x001000 ///< Switch to show or not mouse click position +#define MGL_CLF_ON_UPD 0x002000 ///< Clear plot before Update() +#define MGL_NOSUBTICKS 0x004000 ///< Disable subticks drawing (for bounding box) +#define MGL_DIFFUSIVE 0x008000 ///< Use diffusive light instead of specular +#define MGL_VECT_FRAME 0x010000 ///< Use DrwDat to remember all data of frames +#define MGL_REDUCEACC 0x020000 ///< Reduce accuracy of points (to reduc size of output files) +#define MGL_PREFERVC 0x040000 ///< Prefer vertex color instead of texture if output format supports +#define MGL_ONESIDED 0x080000 ///< Render only front side of surfaces if output format supports (for debugging) +//#define MGL_3D_ARROW 0x100000 ///< Use 3D arrows instead of 2d ones //----------------------------------------------------------------------------- #ifdef __cplusplus //----------------------------------------------------------------------------- +#include +typedef std::complex dual; +//----------------------------------------------------------------------------- struct mglThreadD { mreal *a; // float* array with parameters or results const mreal *b,*c,*d,*e; // float* arrays with parameters const long *p; // long* array with parameters - void *v; // pointer to data/grapher + const void *v; // pointer to data/grapher int id; // thread id long n; // total number of iteration const char *s; }; +struct mglThreadC +{ + dual *a; // dual* array with parameters or results + const dual *b,*c,*d,*e; // dual* arrays with parameters + const long *p; // long* array with parameters + const void *v; // pointer to data/grapher + int id; // thread id + long n; // total number of iteration + const char *s; +}; +struct mglThreadV +{ + mreal *a; // float* array with parameters or results + dual *aa; // dual* array with parameters or results + const void *b,*c; // float* arrays with parameters + const mreal *d; // float* arrays with parameters + const long *p; // long* array with parameters + const void *v; // pointer to data/grapher + int id; // thread id + long n; // total number of iteration +}; /// Start several thread for the task void mglStartThread(void *(*func)(void *), void (*post)(mglThreadD *,mreal *), long n, mreal *a=0, const mreal *b=0, const mreal *c=0, const long *p=0, - void *v=0, const mreal *d=0, const mreal *e=0, const char *s=0); + const void *v=0, const mreal *d=0, const mreal *e=0, const char *s=0); +void mglStartThreadV(void *(*func)(void *), long n, mreal *a, const void *b=0, + const void *c=0, const long *p=0, const void *v=0, const mreal *d=0); +void mglStartThreadV(void *(*func)(void *), long n, dual *a, const void *b=0, + const void *c=0, const long *p=0, const void *v=0, const mreal *d=0); +void mglStartThreadC(void *(*func)(void *), void (*post)(mglThreadC *,dual *), long n, + dual *a=0, const dual *b=0, const dual *c=0, const long *p=0, + const void *v=0, const dual *d=0, const dual *e=0, const char *s=0); extern int mglNumThr; ///< Number of thread for plotting and data handling //----------------------------------------------------------------------------- extern "C" { +#else +#include +#if MGL_USE_DOUBLE +typedef double _Complex dual; +#else +typedef float _Complex dual; +#endif #endif +/** Find symbol in string excluding {} and return its position or NULL */ +const char *mglchr(const char *str, char ch); /** Set number of thread for plotting and data handling*/ void mgl_set_num_thr(int n); void mgl_test_txt(const char *str, ...); void mgl_set_test_mode(int enable); -/** Duplicate string (returned pointer must be free() after usage) */ -char *mgl_strdup(const char *s); -wchar_t *mgl_wcsdup(const wchar_t *s); /** Remove spaces at begining and at the end of the string */ void mgl_strtrim(char *str); void mgl_wcstrim(wchar_t *str); diff --git a/include/mgl2/eval.h b/include/mgl2/eval.h index 3171c11..a8d780f 100644 --- a/include/mgl2/eval.h +++ b/include/mgl2/eval.h @@ -1,6 +1,6 @@ /*************************************************************************** * eval.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -17,18 +17,17 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -//--------------------------------------------------------------------------- #ifndef _MGL_EVAL_H_ #define _MGL_EVAL_H_ -//--------------------------------------------------------------------------- +//----------------------------------------------------------------------------- #include "mgl2/define.h" /// types of errors #define MGL_ERR_LOG 1 #define MGL_ERR_ARC 2 #define MGL_ERR_SQRT 3 -/// size of \a var array +/// size of var array const int MGL_VS = 'z'-'a'+1; -//--------------------------------------------------------------------------- +//----------------------------------------------------------------------------- /// Class for evaluating formula specified by the string class mglFormula // îáúåêò äëÿ ââîäà è âû÷èñëåíèÿ ôîðìóë { @@ -37,17 +36,17 @@ public: mreal Calc(mreal x,mreal y=0,mreal z=0,mreal u=0) const; /// Evaluates the formula for 'x, y, z, u, v, w' mreal Calc(mreal x,mreal y,mreal z,mreal u,mreal v,mreal w) const; - /// Evaluates the formula for variables \a var + /// Evaluates the formula for variables var mreal Calc(const mreal var[MGL_VS]) const; /// Evaluates the formula for 'x','r'=\a x, 'y','n'=\a y, 'z','t'=\a z, 'u'=\a u mreal CalcD(char diff, mreal x,mreal y=0,mreal z=0,mreal u=0) const; /// Evaluates the formula for 'x, y, z, u, v, w' mreal CalcD(char diff, mreal x,mreal y,mreal z,mreal u,mreal v,mreal w) const; - /// Evaluates the derivates of the formula for variables \a var respect to variable \a diff + /// Evaluates the derivates of the formula for variables var respect to variable diff mreal CalcD(const mreal var[MGL_VS], char diff) const; /// Return error code int GetError() const; - /// Parse the formula \a str and create formula-tree + /// Parse the formula str and create formula-tree mglFormula(const char *str); /// Clean up formula-tree ~mglFormula(); @@ -56,8 +55,8 @@ protected: mreal CalcDIn(int id, const mreal *a1) const; mglFormula *Left,*Right; // first and second argument of the function int Kod; // the function ID - mreal Res; // the number or the variable ID + mreal Res; // the number or the variable ID static int Error; }; -//--------------------------------------------------------------------------- +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/evalc.h b/include/mgl2/evalc.h index 621e88a..3b0469b 100644 --- a/include/mgl2/evalc.h +++ b/include/mgl2/evalc.h @@ -1,6 +1,6 @@ /*************************************************************************** * evalc.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -17,16 +17,11 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -//--------------------------------------------------------------------------- #ifndef _MGL_EVALC_H_ #define _MGL_EVALC_H_ -//--------------------------------------------------------------------------- -#include -#ifndef dual -#define dual std::complex ///< short name for complex numbers -#endif +//----------------------------------------------------------------------------- #include "mgl2/eval.h" -//--------------------------------------------------------------------------- +//----------------------------------------------------------------------------- /// Class for evaluating formula specified by the string class mglFormulaC // ������ ��� ����� � ���������� ������ { @@ -35,20 +30,20 @@ public: dual Calc(dual x,dual y=0,dual z=0,dual u=0) const; /// Evaluates the formula for 'x, y, z, u, v, w' dual Calc(dual x,dual y,dual z,dual u,dual v,dual w) const; - /// Evaluates the formula for variables \a var + /// Evaluates the formula for variables var dual Calc(const dual var[MGL_VS]) const; /// Return error code int GetError() const; - /// Parse the formula \a str and create formula-tree + /// Parse the formula str and create formula-tree mglFormulaC(const char *str); /// Clean up formula-tree virtual ~mglFormulaC(); protected: dual CalcIn(const dual *a1) const; mglFormulaC *Left,*Right; // first and second argument of the function - int Kod; // the function ID + int Kod; // the function ID dual Res; // the number or the variable ID static int Error; }; -//--------------------------------------------------------------------------- +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/fit.h b/include/mgl2/fit.h index 5e6b154..6ac673c 100644 --- a/include/mgl2/fit.h +++ b/include/mgl2/fit.h @@ -1,6 +1,6 @@ /*************************************************************************** * fit.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,11 +20,11 @@ #ifndef _MGL_FIT_H_ #define _MGL_FIT_H_ #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- extern int mglFitPnts; ///< Number of output points in fitting extern char mglFitRes[1024]; ///< Last fitted formula HMDT mgl_fit_1(HMGL gr, HCDT y, const char *eq, const char *var, HMDT ini, const char *opt); @@ -44,8 +44,8 @@ HMDT mgl_hist_x(HMGL gr, HCDT x, HCDT a, const char *opt); HMDT mgl_hist_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *opt); HMDT mgl_hist_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *opt); -void mgl_puts_fit(HMGL gr, mreal x, mreal y, mreal z, const char *prefix, const char *font, mreal size); -/*****************************************************************************/ +void mgl_puts_fit(HMGL gr, double x, double y, double z, const char *prefix, const char *font, double size); +//----------------------------------------------------------------------------- uintptr_t mgl_fit_1_(uintptr_t* gr, uintptr_t* y, const char *eq, const char *var, uintptr_t *ini, const char *opt,int, int l, int n); uintptr_t mgl_fit_2_(uintptr_t* gr, uintptr_t* z, const char *eq, const char *var, uintptr_t *ini, const char *opt,int, int l, int n); uintptr_t mgl_fit_3_(uintptr_t* gr, uintptr_t* a, const char *eq, const char *var, uintptr_t *ini, const char *opt,int, int l, int n); @@ -62,9 +62,9 @@ uintptr_t mgl_hist_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* a, uintptr_t mgl_hist_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *opt,int); void mgl_puts_fit_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, const char *prefix, const char *font, mreal *size, int l, int n); -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/fltk.h b/include/mgl2/fltk.h index e21016b..815b604 100644 --- a/include/mgl2/fltk.h +++ b/include/mgl2/fltk.h @@ -1,6 +1,6 @@ /*************************************************************************** * window.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,10 +20,40 @@ //----------------------------------------------------------------------------- #ifndef _MGL_FLTK_H_ #define _MGL_FLTK_H_ -/*****************************************************************************/ + +#include +//----------------------------------------------------------------------------- +#ifdef __cplusplus +extern "C" { +#endif +/// Creates FLTK window for plotting +HMGL mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); +uintptr_t mgl_create_graph_fltk_(const char *title, int); +/// Run main FLTK loop for event handling. +int mgl_fltk_run(); +int mgl_fltk_run_(); +/// Run main FLTK loop for event handling in separate thread. +int mgl_fltk_thr(); #ifdef __cplusplus -#include "mgl2/canvas_wnd.h" -#if MGL_HAVE_FLTK +} +//----------------------------------------------------------------------------- +#include +//----------------------------------------------------------------------------- +/// Wrapper class for windows displaying graphics +class mglFLTK : public mglWnd +{ +public: + mglFLTK(const char *title="MathGL") : mglWnd() + { gr = mgl_create_graph_fltk(0,title,0,0); } + mglFLTK(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL, void (*load)(void *p)=0) : mglWnd() + { gr = mgl_create_graph_fltk(draw,title,par,load); } + mglFLTK(int (*draw)(mglGraph *gr), const char *title="MathGL") : mglWnd() + { gr = mgl_create_graph_fltk(draw?mgl_draw_graph:0,title,(void*)draw,0); } + mglFLTK(mglDraw *draw, const char *title="MathGL") : mglWnd() + { gr = mgl_create_graph_fltk(draw?mgl_draw_class:0,title,draw,mgl_reload_class); + mgl_set_click_func(gr, mgl_click_class); } + int Run() { return mgl_fltk_run(); } ///< Run main loop for event handling +}; //----------------------------------------------------------------------------- #ifdef __MWERKS__ # define FL_DLL @@ -35,6 +65,7 @@ #include #include #include +class mglCanvas; //----------------------------------------------------------------------------- /// Class is FLTK widget which display MathGL graphics class Fl_MathGL : public Fl_Widget @@ -43,7 +74,7 @@ public: Fl_Valuator *tet_val; ///< pointer to external tet-angle validator Fl_Valuator *phi_val; ///< pointer to external phi-angle validator - Fl_MathGL(int x, int y, int w, int h, char *label=0); + Fl_MathGL(int x, int y, int w, int h, const char *label=0); ~Fl_MathGL(); /// Update (redraw) plot @@ -53,24 +84,24 @@ public: /// Set bitwise flags for general state (1-Alpha, 2-Light) inline void set_flag(int f) { flag = f; } /// Set flags for handling mouse - void set_graph(mglCanvas *gr); ///< Set grapher object + void set_graph(HMGL gr); ///< Set grapher object inline void set_graph(mglGraph *Gr) - { set_graph(dynamic_cast(Gr->Self())); } + { set_graph(Gr->Self()); } /// Get pointer to grapher - inline HMGL get_graph() { return gr; } + inline HMGL get_graph() { return (HMGL)gr; } /// Set drawing functions and its parameter inline void set_draw(int (*func)(mglBase *gr, void *par), void *par=0) { draw_func = func; draw_par = par; } inline void set_draw(mglDraw *dr) { draw_cl = dr; } inline void set_draw(int (*dr)(mglGraph *gr)) - { set_draw(mgl_draw_graph,(void*)dr); } + { set_draw(dr?mgl_draw_graph:0,(void*)dr); } void set_state(bool z, bool r) { zoom = z; rotate = r; } /// Set zoom in/out region inline void set_zoom(mreal X1, mreal Y1, mreal X2, mreal Y2) - { x1 = X1; x2 = X2; y1 = Y1; y2 = Y2; update(); }; + { x1 = X1; x2 = X2; y1 = Y1; y2 = Y2; update(); } /// Get zoom region inline void get_zoom(mreal *X1, mreal *Y1, mreal *X2, mreal *Y2) - { *X1 = x1; *X2 = x2; *Y1 = y1; *Y2 = y2; }; + { *X1 = x1; *X2 = x2; *Y1 = y1; *Y2 = y2; } /// Set popup menu pointer inline void set_popup(const Fl_Menu_Item *pmenu, Fl_Widget *wdg, void *v) { popup = pmenu; wpar = wdg; vpar = v; } @@ -117,60 +148,29 @@ public: void toggle_alpha() { toggle(alpha, alpha_bt, "Graphics/Alpha"); } void toggle_light() { toggle(light, light_bt, "Graphics/Light"); } void toggle_sshow() { toggle(sshow, anim_bt, "Graphics/Slideshow"); } - void toggle_wire() { toggle(wire, wire_bt, "Graphics/Wire"); } + void toggle_grid() { toggle(grid, grid_bt, "Graphics/Grid"); } void toggle_zoom() { toggle(zoom, zoom_bt); } void toggle_rotate(){ toggle(rotate, rotate_bt); } void setoff_zoom() { setoff(zoom, zoom_bt); } void setoff_rotate(){ setoff(rotate, rotate_bt); } bool is_sshow() { return sshow; } - Fl_MGLView(int x, int y, int w, int h, char *label=0); + Fl_MGLView(int x, int y, int w, int h, const char *label=0); ~Fl_MGLView(); void update(); ///< Update picture by calling user drawing function protected: - Fl_Button *alpha_bt, *light_bt, *rotate_bt, *anim_bt, *zoom_bt, *wire_bt; + Fl_Button *alpha_bt, *light_bt, *rotate_bt, *anim_bt, *zoom_bt, *grid_bt; // Fl_Counter *tet, *phi; - int wire, alpha, light; ///< Current states of wire, alpha, light switches (toggle buttons) + int grid, alpha, light; ///< Current states of wire, alpha, light switches (toggle buttons) int sshow, rotate, zoom;///< Current states of slideshow, rotate, zoom switches (toggle buttons) void toggle(int &val, Fl_Button *b, const char *txt=NULL); void setoff(int &val, Fl_Button *b, const char *txt=NULL); }; //----------------------------------------------------------------------------- -/// Class allows the window creation for displaying plot bitmap with the help of FLTK library -/** NOTE!!! All frames are saved in memory. So animation with many frames require a lot memory and CPU time (for example, for mouse rotation).*/ -class mglCanvasFL : public mglCanvasWnd -{ -public: -using mglCanvasWnd::Window; - Fl_Window *Wnd; ///< Pointer to window - Fl_MGLView *mgl; ///< Pointer to MGL widget with buttons - - mglCanvasFL(); - ~mglCanvasFL(); - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ñëóæåáíûå ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - /// Create a window for plotting. Now implemeted only for GLUT. - void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, - void *par=NULL, void (*reload)(void *p)=NULL, bool maximize=false); - /// Switch on/off transparency (do not overwrite switches in user drawing function) - void ToggleAlpha(); - /// Switch on/off lighting (do not overwrite switches in user drawing function) - void ToggleLight(); - void ToggleRotate(); ///< Switch on/off rotation by mouse - void ToggleZoom(); ///< Switch on/off zooming by mouse - void ToggleNo(); ///< Switch off all zooming and rotation - void Update(); ///< Update picture by calling user drawing function - void Adjust(); ///< Adjust size of bitmap to window size - void GotoFrame(int d); ///< Show arbitrary frame (use relative step) - void Animation(); ///< Run animation (I'm too lasy to change it) -}; -//----------------------------------------------------------------------------- void mgl_ask_fltk(const wchar_t *quest, wchar_t *res); +void mgl_makemenu_fltk(Fl_Menu_ *m, Fl_MGLView *w); //----------------------------------------------------------------------------- -#else -#error "Please enable FLTK support" -#endif #endif #endif diff --git a/include/mgl2/font.h b/include/mgl2/font.h index a8b4148..95a2356 100644 --- a/include/mgl2/font.h +++ b/include/mgl2/font.h @@ -1,6 +1,6 @@ /*************************************************************************** * font.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -44,6 +44,7 @@ #endif //----------------------------------------------------------------------------- struct mglTeXsymb { unsigned kod; const wchar_t *tex; }; +const float mgl_fgen = 4*14; /// Get font color, style and align for internal parser char mglGetStyle(const char *how, int *font, int *align=0); class mglBase; @@ -66,7 +67,7 @@ public: /// Restore default font void Restore(); /// Return true if font is loaded - inline bool Ready() const { return numg!=0; }; + inline bool Ready() const { return numg!=0; } /// Get height of text float Height(int font) const; @@ -81,14 +82,17 @@ public: /// Get width of text string for font specified by string float Width(const wchar_t *str,const char *how) const; + /// Get internal code for symbol + long Internal(unsigned s) const; /// Return number of glyphs inline unsigned GetNumGlyph() const { return numg; }; /// Return some of pointers - inline const short *GetTr(int s, long j) const { return Buf+tr[s][j]; }; - inline const short *GetLn(int s, long j) const { return Buf+ln[s][j]; }; - inline int GetNt(int s, long j) const { return numt[s][j]; }; - inline int GetNl(int s, long j) const { return numl[s][j]; }; - inline float GetFact(int s) const { return fact[s]; }; + inline const short *GetTr(int s, long j) const { return Buf+tr[s][j]; } + inline const short *GetLn(int s, long j) const { return Buf+ln[s][j]; } + inline int GetNt(int s, long j) const { return numt[s][j]; } + inline int GetNl(int s, long j) const { return numl[s][j]; } + inline short GetWidth(int s, long j) const { return width[s][j]; } + inline float GetFact(int s) const { return fact[s]; } protected: wchar_t *id; ///< Unicode ID for glyph unsigned *tr[4]; ///< Shift of glyph description by triangles (for solid font) @@ -113,10 +117,7 @@ protected: float Puts(const unsigned *str, float x,float y,float f,int style,float col) const; /// Parse LaTeX command unsigned Parse(const wchar_t *s) const; - /// Get internal code for symbol - long Internal(unsigned s) const; - - /// Get symbol for character \a ch with given \a font style + /// Get symbol for character ch with given font style unsigned Symbol(char ch) const; private: float get_ptr(long &i,unsigned *str, unsigned **b1, unsigned **b2,float &w1,float &w2, float f1, float f2, int st) const; diff --git a/include/mgl2/glut.h b/include/mgl2/glut.h index 66b58ed..2febc46 100644 --- a/include/mgl2/glut.h +++ b/include/mgl2/glut.h @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_glut.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -21,61 +21,14 @@ #ifndef _MGL_GLUT_H_ #define _MGL_GLUT_H_ #ifdef __cplusplus -#include "mgl2/opengl.h" -#include "mgl2/window.h" +#include //----------------------------------------------------------------------------- extern "C" { #endif -/*****************************************************************************/ void _mgl_key_up(unsigned char ch,int ,int ); HMGL mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); -/*****************************************************************************/ #ifdef __cplusplus } -/// Class allows the window creation under OpenGL with the help of GLUT library -class mglCanvasGLUT : public mglCanvasGL -{ -friend void _mgl_display(); -friend void _mgl_key_up(unsigned char ch,int ,int ); -friend void _mgl_timer(int); -public: - mreal Delay; ///< Delay for animation in seconds - bool AutoClf; ///< Clear canvas between drawing - - mglCanvasGLUT(); - mglCanvasGLUT(int (*draw)(mglGraph *gr, void *p), const char *title, void *par=NULL, - void (*reload)(int next, void *p)=NULL, bool maximize=false); - virtual ~mglCanvasGLUT(); - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ��������� ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - /// Create a window for plotting. Now implemeted only for GLUT. - void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), - const char *title,void *par=NULL, - void (*reload)(void *p)=NULL, bool maximize=false); - void Window(int argc, char **argv, int (*draw)(mglGraph *gr), - const char *title, bool maximize=false) - { Window(argc,argv,mgl_draw_graph,title,(void*)draw,0,maximize); } - /// Create a window for plotting based on class mglDraw. - void Window(int argc, char **argv, const char *title, mglDraw *draw, bool maximize=false) - { Window(argc, argv, mgl_draw_class, title, draw, mgl_reload_class, maximize); } - /// Switch on/off transparency (do not overwrite switches in user drawing function) - void ToggleAlpha() { _mgl_key_up('r',0,0); } - /// Switch on/off lighting (do not overwrite switches in user drawing function) - void ToggleLight() { _mgl_key_up('f',0,0); } - void ToggleNo() { _mgl_key_up('n',0,0); } ///< Switch off all zooming and rotation - void Update() { _mgl_key_up(' ',0,0); } ///< Update picture by calling user drawing function - void ReLoad(bool o) { _mgl_key_up(o?']':'[',0,0); } ///< Reload user data and update picture - void NextFrame() { _mgl_key_up('.',0,0); } ///< Show next frame (if one) - void PrevFrame() { _mgl_key_up(',',0,0); } ///< Show previous frame (if one) - void Animation() { _mgl_key_up('m',0,0); } ///< Run slideshow (animation) of frames -private: - void (*LoadFunc)(void *par); - void *FuncPar; ///< Parameters for drawing function mglCanvas::DrawFunc. - /// Drawing function for window procedure. It should return the number of frames. - int (*DrawFunc)(mglBase *gr, void *par); - int NumFig; ///< Number of figures in the list. If 0 then no list and mglCanvas::DrawFunc will called for each drawing. - int curr_fig; ///< Current figure in the list. - int tt; ///< Temporal variable -}; //----------------------------------------------------------------------------- class mglGLUT: public mglGraph { @@ -83,9 +36,9 @@ public: mglGLUT(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=0, void (*load)(void *p)=0) : mglGraph(-1) { gr = mgl_create_graph_glut(draw,title,par,load); } mglGLUT(int (*draw)(mglGraph *gr), const char *title="MathGL") : mglGraph(-1) - { gr = mgl_create_graph_glut(mgl_draw_graph,title,(void*)draw,0); } - mglGLUT(mglDraw *dr=0, const char *title="MathGL") : mglGraph(-1) - { mgl_create_graph_glut(mgl_draw_class,title,dr,0); } + { gr = mgl_create_graph_glut(draw?mgl_draw_graph:0,title,(void*)draw,0); } + mglGLUT(mglDraw *draw=0, const char *title="MathGL") : mglGraph(-1) + { gr = mgl_create_graph_glut(draw?mgl_draw_class:0,title,draw,mgl_reload_class); } }; //----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/mgl.h b/include/mgl2/mgl.h index e73cbfa..583e4c3 100644 --- a/include/mgl2/mgl.h +++ b/include/mgl2/mgl.h @@ -1,6 +1,6 @@ /*************************************************************************** * mgl.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -23,6 +23,7 @@ #include "mgl2/define.h" #include "mgl2/mgl_cf.h" #include "mgl2/data.h" +#include "mgl2/datac.h" //----------------------------------------------------------------------------- /// Wrapper class for all graphics class mglGraph @@ -35,6 +36,10 @@ public: if(kind==-1) gr=NULL; #if MGL_HAVE_OPENGL else if(kind==1) gr=mgl_create_graph_gl(); +#else + else if(kind==1) + { gr=mgl_create_graph(width, height); + mglGlobalMess += "OpenGL support was disabled. Please, enable it and rebuild MathGL.\n"; } #endif else gr=mgl_create_graph(width, height); } @@ -46,17 +51,17 @@ public: { if(mgl_use_graph(gr,-1)<1) mgl_delete_graph(gr); } /// Get pointer to internal mglCanvas object inline HMGL Self() { return gr; } - /// Set default parameter for plotting - inline void DefaultPlotParam() { mgl_set_def_param(gr); } + /// Set default parameters for plotting + inline void DefaultPlotParam() { mgl_set_def_param(gr); } /// Set name of plot for saving filename inline void SetPlotId(const char *id) { mgl_set_plotid(gr,id); } /// Set the transparency on/off. inline void Alpha(bool enable) { mgl_set_alpha(gr, enable); } /// Set default value of alpha-channel - inline void SetAlphaDef(mreal alpha) { mgl_set_alpha_default(gr, alpha); } + inline void SetAlphaDef(double alpha) { mgl_set_alpha_default(gr, alpha); } /// Set the transparency type (0 - usual, 1 - glass, 2 - lamp) - inline void SetTranspType(int type) { mgl_set_transp_type(gr, type);} + inline void SetTranspType(int type) { mgl_set_transp_type(gr, type); } /// Set the using of light on/off. inline void Light(bool enable) { mgl_set_light(gr, enable); } @@ -65,48 +70,50 @@ public: /// Use diffusive light (only for local light sources) inline void SetDifLight(bool dif) { mgl_set_light_dif(gr, dif); } /// Add a light source. - inline void AddLight(int n, mglPoint p, char col='w', mreal bright=0.5, mreal ap=0) + inline void AddLight(int n, mglPoint p, char col='w', double bright=0.5, double ap=0) { mgl_add_light_ext(gr, n, p.x, p.y, p.z, col, bright, ap); } - inline void AddLight(int n, mglPoint r, mglPoint p, char col='w', mreal bright=0.5, mreal ap=0) + inline void AddLight(int n, mglPoint r, mglPoint p, char col='w', double bright=0.5, double ap=0) { mgl_add_light_loc(gr, n, r.x, r.y, r.z, p.x, p.y, p.z, col, bright, ap); } /// Set ambient light brightness - inline void SetAmbient(mreal i) { mgl_set_ambbr(gr, i); } + inline void SetAmbient(double i) { mgl_set_ambbr(gr, i); } /// Set the fog distance or switch it off (if d=0). - inline void Fog(mreal d, mreal dz=0.25) { mgl_set_fog(gr, d, dz); } + inline void Fog(double d, double dz=0.25) { mgl_set_fog(gr, d, dz); } /// Set relative width of rectangles in Bars, Barh, BoxPlot - inline void SetBarWidth(mreal width) { mgl_set_bar_width(gr, width); } - /// Set size of marks - inline void SetMarkSize(mreal size) { mgl_set_mark_size(gr, size); } - /// Set size of arrows - inline void SetArrowSize(mreal size) { mgl_set_arrow_size(gr, size); } - /// Set number of mesh lines - inline void SetMeshNum(int num) { mgl_set_meshnum(gr, num); } - + inline void SetBarWidth(double width) { mgl_set_bar_width(gr, width); } + /// Set default size of marks (locally you can use "size" option) + inline void SetMarkSize(double size) { mgl_set_mark_size(gr, size); } + /// Set default size of arrows (locally you can use "size" option) + inline void SetArrowSize(double size) { mgl_set_arrow_size(gr, size); } + /// Set number of mesh lines (use 0 to draw all of them) + inline void SetMeshNum(int num) { mgl_set_meshnum(gr, num); } + /// Set number of visible faces (use 0 to draw all of them) + inline void SetFaceNum(int num) { mgl_set_facenum(gr, num); } + /// Set cutting for points outside of bounding box - inline void SetCut(bool cut) { mgl_set_cut(gr, cut); } + inline void SetCut(bool cut) { mgl_set_cut(gr, cut); } /// Set additional cutting box inline void SetCutBox(mglPoint p1, mglPoint p2) { mgl_set_cut_box(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z); } /// Set the cutting off condition (formula) - inline void CutOff(const char *EqC) { mgl_set_cutoff(gr, EqC); } + inline void CutOff(const char *EqC) { mgl_set_cutoff(gr, EqC); } /// Set default font size - inline void SetFontSize(mreal size) { mgl_set_font_size(gr, size); } + inline void SetFontSize(double size) { mgl_set_font_size(gr, size); } /// Set default font style and color inline void SetFontDef(const char *fnt) { mgl_set_font_def(gr, fnt); } /// Set FontSize by size in pt and picture DPI (default is 16 pt for dpi=72) - virtual void SetFontSizePT(mreal pt, int dpi=72){ SetFontSize(pt*27.f/dpi); } + virtual void SetFontSizePT(double pt, int dpi=72){ SetFontSize(pt*27.f/dpi); } /// Set FontSize by size in centimeters and picture DPI (default is 0.56 cm = 16 pt) - inline void SetFontSizeCM(mreal cm, int dpi=72) { SetFontSizePT(cm*28.45f,dpi); } + inline void SetFontSizeCM(double cm, int dpi=72) { SetFontSizePT(cm*28.45f,dpi); } /// Set FontSize by size in inch and picture DPI (default is 0.22 in = 16 pt) - inline void SetFontSizeIN(mreal in, int dpi=72) { SetFontSizePT(in*72.27f,dpi); } + inline void SetFontSizeIN(double in, int dpi=72) { SetFontSizePT(in*72.27f,dpi); } /// Load font from file inline void LoadFont(const char *name, const char *path=NULL) { mgl_load_font(gr, name, path); } /// Copy font from another mglGraph instance - inline void CopyFont(mglGraph *GR) { mgl_copy_font(gr, GR->Self());} - /// Restore font + inline void CopyFont(const mglGraph *GR) { mgl_copy_font(gr, GR->gr);} + /// Restore font (load default font for new HMGL objects) inline void RestoreFont() { mgl_restore_font(gr); } /// Set to use or not text rotation inline void SetRotatedText(bool rotated) { mgl_set_rotated_text(gr, rotated); } @@ -117,39 +124,42 @@ public: inline void SetDefScheme(const char *sch) { mgl_set_def_sch(gr, sch); } /// Get last warning code - inline int GetWarn() { return mgl_get_warn(gr);} + inline int GetWarn() { return mgl_get_warn(gr);} /// Set warning code ant fill message inline void SetWarn(int code, const char *info) { mgl_set_warn(gr,code,info); } /// Set buffer for warning messages inline const char *Message() { return mgl_get_mess(gr); } + /// Set axis range scaling -- simplified way to shift/zoom axis range -- need to replot whole image! + inline void ZoomAxis(mglPoint p1=mglPoint(0,0,0,0), mglPoint p2=mglPoint(1,1,1,1)) + { mgl_zoom_axis(gr, p1.x,p1.y,p1.z,p1.c, p2.x,p2.y,p2.z,p2.c); } /// Set range in direction dir as [v1, v2] - inline void SetRange(char dir, mreal v1, mreal v2) + inline void SetRange(char dir, double v1, double v2) { mgl_set_range_val(gr, dir, v1, v2); } /// Set range in direction dir as minimal and maximal values of data a inline void SetRange(char dir, const mglDataA &dat, bool add=false) { mgl_set_range_dat(gr, dir, &dat, add); } - /// Set values of mglGraph::Min and mglGraph::Max as minimal and maximal values of datas + /// Set values of axis range as minimal and maximal values of datas inline void SetRanges(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz, const mglDataA &cc) { mgl_set_range_dat(gr,'x',&xx,0); mgl_set_range_dat(gr,'y',&yy,0); mgl_set_range_dat(gr,'z',&zz,0); mgl_set_range_dat(gr,'c',&cc,0); } - /// Set values of mglGraph::Min and mglGraph::Max as minimal and maximal values of datas + /// Set values of axis range as minimal and maximal values of datas inline void SetRanges(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) { mgl_set_range_dat(gr,'x',&xx,0); mgl_set_range_dat(gr,'y',&yy,0); mgl_set_range_dat(gr,'z',&zz,0); mgl_set_range_dat(gr,'c',&zz,0); } - /// Set values of mglGraph::Min and mglGraph::Max as minimal and maximal values of datas + /// Set values of axis range as minimal and maximal values of datas inline void SetRanges(const mglDataA &xx, const mglDataA &yy) { mgl_set_range_dat(gr,'x',&xx,0); mgl_set_range_dat(gr,'y',&yy,0); } - /// Set values of mglGraph::Min and mglGraph::Max - inline void SetRanges(mreal x1, mreal x2, mreal y1, mreal y2, mreal z1=0, mreal z2=0) + /// Set values of axis range + inline void SetRanges(double x1, double x2, double y1, double y2, double z1=0, double z2=0) { mgl_set_ranges(gr, x1, x2, y1, y2, z1, z2); } - /// Set values of mglGraph::Min and mglGraph::Max + /// Set values of axis range inline void SetRanges(mglPoint p1, mglPoint p2) { mgl_set_ranges(gr, p1.x, p2.x, p1.y, p2.y, p1.z, p2.z); } /// Set axis origin inline void SetOrigin(mglPoint p) { mgl_set_origin(gr, p.x, p.y, p.z); } - inline void SetOrigin(mreal x0, mreal y0, mreal z0=NaN) + inline void SetOrigin(double x0, double y0, double z0=NaN) { mgl_set_origin(gr, x0, y0, z0); } /// Set the transformation formulas for coordinate @@ -165,14 +175,14 @@ public: /// Set to use or not tick labels skipping inline void SetTickSkip(bool val) { mgl_set_tick_skip(gr,val); } /// Set tick length - inline void SetTickLen(mreal len, mreal stt=1) + inline void SetTickLen(double len, double stt=1) { mgl_set_tick_len(gr, len, stt); } /// Set axis and ticks style inline void SetAxisStl(const char *stl="k", const char *tck=0, const char *sub=0) { mgl_set_axis_stl(gr, stl, tck, sub); } /// Set time templates for ticks - inline void SetTicksTime(char dir, mreal d=0, const char *t="") + inline void SetTicksTime(char dir, double d=0, const char *t="") { mgl_set_ticks_time(gr,dir,d,t); } /// Set ticks text (\n separated). Use "" to disable this feature. inline void SetTicksVal(char dir, const char *lbl, bool add=false) @@ -185,7 +195,7 @@ public: inline void SetTicksVal(char dir, const mglDataA &v, const wchar_t *lbl, bool add=false) { mgl_set_ticks_valw(gr,dir,&v,lbl,add); } /// Set the ticks parameters - inline void SetTicks(char dir, mreal d=0, int ns=0, mreal org=NaN) + inline void SetTicks(char dir, double d=0, int ns=0, double org=NaN) { mgl_set_ticks(gr, dir, d, ns, org); } /// Auto adjust ticks inline void Adjust(const char *dir="xyzc") @@ -196,7 +206,7 @@ public: inline void SetTickTempl(char dir, const wchar_t *t) { mgl_set_tick_templw(gr,dir,t); } /// Tune ticks - inline void SetTuneTicks(int tune, mreal fact_pos=1.15) + inline void SetTuneTicks(int tune, double fact_pos=1.15) { mgl_tune_ticks(gr, tune, fact_pos); } /// Set additional shift of tick labels inline void SetTickShift(mglPoint p) @@ -205,28 +215,28 @@ public: inline void SetTimeUTC(bool enable) { mgl_set_flag(gr,enable, MGL_USE_GMTIME); } - /// Put further plotting in some region of whole frame surface. - inline void SubPlot(int nx,int ny,int m,const char *style="<>_^", mreal dx=0, mreal dy=0) + /// Put further plotting in some region of whole frame. + inline void SubPlot(int nx,int ny,int m,const char *style="<>_^", double dx=0, double dy=0) { mgl_subplot_d(gr, nx, ny, m, style, dx, dy); } - /// Like SubPlot bot "join" several cells + /// Like SubPlot() but "join" several cells inline void MultiPlot(int nx,int ny,int m, int dx, int dy, const char *style="<>_^") { mgl_multiplot(gr, nx, ny, m, dx, dy, style); } - /// Put further plotting in some region of whole frame surface. - inline void InPlot(mreal x1,mreal x2,mreal y1,mreal y2, bool rel=true) + /// Put further plotting in a region of whole frame. + inline void InPlot(double x1,double x2,double y1,double y2, bool rel=true) { if(rel) mgl_relplot(gr, x1, x2, y1, y2); else mgl_inplot(gr, x1, x2, y1, y2); } /// Put further plotting in column cell of previous subplot - inline void ColumnPlot(int num, int ind, mreal d=0) + inline void ColumnPlot(int num, int ind, double d=0) { mgl_columnplot(gr,num,ind,d); } /// Put further plotting in matrix cell of previous subplot - inline void GridPlot(int nx, int ny, int ind, mreal d=0) + inline void GridPlot(int nx, int ny, int ind, double d=0) { mgl_gridplot(gr,nx,ny,ind,d); } /// Put further plotting in cell of stick rotated on angles tet, phi - inline void StickPlot(int num, int i, mreal tet, mreal phi) + inline void StickPlot(int num, int i, double tet, double phi) { mgl_stickplot(gr,num,i,tet,phi); } - /// Set PlotFactor - inline void SetPlotFactor(mreal val) + /// Set factor of plot size + inline void SetPlotFactor(double val) { mgl_set_plotfactor(gr,val); } /// Push transformation matrix into stack inline void Push() { mgl_mat_push(gr); } @@ -234,30 +244,30 @@ public: inline void Pop() { mgl_mat_pop(gr); } /// Add title for current subplot/inplot - inline void Title(const char *title,const char *stl="",mreal size=-2) + inline void Title(const char *title,const char *stl="",double size=-2) { mgl_title(gr,title,stl,size); } - inline void Title(const wchar_t *title,const char *stl="",mreal size=-2) + inline void Title(const wchar_t *title,const char *stl="",double size=-2) { mgl_titlew(gr,title,stl,size); } /// Set aspect ratio for further plotting. - inline void Aspect(mreal Ax,mreal Ay,mreal Az=1) + inline void Aspect(double Ax,double Ay,double Az=1) { mgl_aspect(gr, Ax, Ay, Az); } /// Rotate a further plotting. - inline void Rotate(mreal TetX,mreal TetZ=0,mreal TetY=0) + inline void Rotate(double TetX,double TetZ=0,double TetY=0) { mgl_rotate(gr, TetX, TetZ, TetY); } /// Rotate a further plotting around vector {x,y,z}. - inline void RotateN(mreal Tet,mreal x,mreal y,mreal z) + inline void RotateN(double Tet,double x,double y,double z) { mgl_rotate_vector(gr, Tet, x, y, z); } /// Set perspective (in range [0,1)) for plot. Set to zero for switching off. - inline void Perspective(mreal val) + inline void Perspective(double val) { mgl_perspective(gr, val); } /// Set angle of view independently from Rotate(). - inline void View(mreal TetX,mreal TetZ=0,mreal TetY=0) + inline void View(double TetX,double TetZ=0,double TetY=0) { mgl_view(gr, TetX, TetZ, TetY); } - /// Zoom in or zoom out (if Zoom(0, 0, 1, 1)) a part of picture - inline void Zoom(mreal x1, mreal y1, mreal x2, mreal y2) + /// Zoom in/out a part of picture (use Zoom(0, 0, 1, 1) for restore default) + inline void Zoom(double x1, double y1, double x2, double y2) { mgl_zoom(gr, x1, y1, x2, y2); } - /// Set size of frame in pixels. Normally this function is called internaly. + /// Set size of frame in pixels. Normally this function is called internally. inline void SetSize(int width, int height) { mgl_set_size(gr, width, height); } /// Set plot quality inline void SetQuality(int qual=MGL_DRAW_NORM) { mgl_set_quality(gr, qual); } @@ -265,10 +275,10 @@ public: inline void StartGroup(const char *name) { mgl_start_group(gr, name); } /// End group of objects inline void EndGroup() { mgl_end_group(gr); } - /// Highlight next group + /// Highlight objects with given id inline void Highlight(int id) { mgl_highlight(gr, id); } - /// Show currently produced image + /// Show current image inline void ShowImage(const char *viewer, bool keep=0) { mgl_show_image(gr, viewer, keep); } /// Write the frame in file (depending extension, write current frame if fname is empty) @@ -321,7 +331,12 @@ public: /// Write the frame in file using PRC format inline void WritePRC(const char *fname,const char *descr="",bool make_pdf=true) { mgl_write_prc(gr, fname, descr, make_pdf); } + /// Export in JSON format suitable for later drawing by JavaScript + inline void WriteJSON(const char *fname,const char *descr="") + { mgl_write_json(gr, fname, descr); } + /// Force preparing the image. It can be useful for OpenGL mode mostly. + inline void Finish() { mgl_finish(gr); } /// Create new frame. inline void NewFrame() { mgl_new_frame(gr); } /// Finish frame drawing @@ -330,6 +345,15 @@ public: inline int GetNumFrame() { return mgl_get_num_frame(gr); } /// Reset frames counter (start it from zero) inline void ResetFrames() { mgl_reset_frames(gr); } + /// Delete primitives for i-th frame (work if MGL_VECT_FRAME is set on) + inline void DelFrame(int i) { mgl_del_frame(gr, i); } + /// Get drawing data for i-th frame (work if MGL_VECT_FRAME is set on) + inline void GetFrame(int i) { mgl_get_frame(gr, i); } + /// Set drawing data for i-th frame (work if MGL_VECT_FRAME is set on). Work as EndFrame() but don't add frame to GIF image. + inline void SetFrame(int i) { mgl_set_frame(gr, i); } + /// Append drawing data from i-th frame (work if MGL_VECT_FRAME is set on) + inline void ShowFrame(int i) { mgl_show_frame(gr, i); } + /// Start write frames to cinema using GIF format inline void StartGIF(const char *fname, int ms=100) { mgl_start_gif(gr, fname,ms); } @@ -376,7 +400,7 @@ public: /// Calculate 3D coordinate {x,y,z} for screen point {xs,ys} inline mglPoint CalcXYZ(int xs, int ys) { - mreal x,y,z; + double x,y,z; mgl_calc_xyz(gr,xs,ys,&x,&y,&z); return mglPoint(x,y,z); } @@ -393,6 +417,8 @@ public: inline int GetObjId(long x,long y) { return mgl_get_obj_id(gr,x,y); } /// Get subplot id inline int GetSplId(long x,long y) { return mgl_get_spl_id(gr,x,y); } + /// Check if {\a xs,\a ys} is close to active point with accuracy d, and return its position or -1 + inline long IsActive(int xs, int ys, int d=1) { return mgl_is_active(gr,xs,ys,d); } /// Combine plots from 2 canvases. Result will be saved into this inline void Combine(const mglGraph *g) { mgl_combine_gr(gr,g->gr); } @@ -402,10 +428,12 @@ public: inline void MPI_Recv(int id) { mgl_mpi_recv(gr,id); } /// Clear up the frame - inline void Clf(mreal r, mreal g, mreal b) { mgl_clf_rgb(gr, r, g, b); } + inline void Clf(double r, double g, double b) { mgl_clf_rgb(gr, r, g, b); } inline void Clf() { mgl_clf(gr); } + /// Clear unused points and primitives. Useful only in combination with SetFaceNum(). + inline void ClearUnused() { mgl_clear_unused(gr); } /// Draws the point (ball) at position {x,y,z} with color c - inline void Ball(mglPoint p, char c) + inline void Ball(mglPoint p, char c='r') { char s[3]={'.',c,0}; mgl_mark(gr, p.x, p.y, p.z, s); } /// Draws the mark at position p inline void Mark(mglPoint p, const char *mark) @@ -424,46 +452,46 @@ public: inline void Face(mglPoint p1, mglPoint p2, mglPoint p3, mglPoint p4, const char *stl="r") { mgl_face(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, p3.x, p3.y, p3.z, p4.x, p4.y, p4.z, stl); } /// Draws the face in y-z plane at point p with color stl (include interpolation up to 4 colors). - inline void FaceX(mglPoint p, mreal wy, mreal wz, const char *stl="w", mreal dx=0, mreal dy=0) + inline void FaceX(mglPoint p, double wy, double wz, const char *stl="w", double dx=0, double dy=0) { mgl_facex(gr, p.x, p.y, p.z, wy, wz, stl, dx, dy); } /// Draws the face in x-z plane at point p with color stl (include interpolation up to 4 colors). - inline void FaceY(mglPoint p, mreal wx, mreal wz, const char *stl="w", mreal dx=0, mreal dy=0) + inline void FaceY(mglPoint p, double wx, double wz, const char *stl="w", double dx=0, double dy=0) { mgl_facey(gr, p.x, p.y, p.z, wx, wz, stl, dx, dy); } /// Draws the face in x-y plane at point p with color stl (include interpolation up to 4 colors). - inline void FaceZ(mglPoint p, mreal wx, mreal wy, const char *stl="w", mreal dx=0, mreal dy=0) + inline void FaceZ(mglPoint p, double wx, double wy, const char *stl="w", double dx=0, double dy=0) { mgl_facez(gr, p.x, p.y, p.z, wx, wy, stl, dx, dy); } /// Draws the drop at point p in direction d with color col and radius r - inline void Drop(mglPoint p, mglPoint d, mreal r, const char *col="r", mreal shift=1, mreal ap=1) + inline void Drop(mglPoint p, mglPoint d, double r, const char *col="r", double shift=1, double ap=1) { mgl_drop(gr, p.x, p.y, p.z, d.x, d.y, d.z, r, col, shift, ap); } /// Draws the sphere at point p with color col and radius r - inline void Sphere(mglPoint p, mreal r, const char *col="r") + inline void Sphere(mglPoint p, double r, const char *col="r") { mgl_sphere(gr, p.x, p.y, p.z, r, col); } - /// Draws the cone between points p1,p2 with radius r1,r2 with style stl - inline void Cone(mglPoint p1, mglPoint p2, mreal r1, mreal r2=-1, const char *stl="r@") + /// Draws the cone between points p1,p2 with radius r1,r2 and with style stl + inline void Cone(mglPoint p1, mglPoint p2, double r1, double r2=-1, const char *stl="r@") { mgl_cone(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z,r1,r2,stl); } /// Draws the ellipse between points p1,p2 with color stl and width r - inline void Ellipse(mglPoint p1, mglPoint p2, mreal r, const char *stl="r") + inline void Ellipse(mglPoint p1, mglPoint p2, double r, const char *stl="r") { mgl_ellipse(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, r,stl); } /// Draws the circle at point p with color stl and radius r - inline void Circle(mglPoint p, mreal r, const char *stl="r") + inline void Circle(mglPoint p, double r, const char *stl="r") { mgl_ellipse(gr, p.x, p.y, p.z, p.x, p.y, p.z, r,stl); } /// Draws the rhomb between points p1,p2 with color stl and width r - inline void Rhomb(mglPoint p1, mglPoint p2, mreal r, const char *stl="r") + inline void Rhomb(mglPoint p1, mglPoint p2, double r, const char *stl="r") { mgl_rhomb(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, r,stl); } /// Print text in position p with specified font - inline void Putsw(mglPoint p,const wchar_t *text,const char *font=":C",mreal size=-1) + inline void Putsw(mglPoint p,const wchar_t *text,const char *font=":C",double size=-1) { mgl_putsw(gr, p.x, p.y, p.z, text, font, size); } - inline void Puts(mglPoint p,const char *text,const char *font=":C",mreal size=-1) + inline void Puts(mglPoint p,const char *text,const char *font=":C",double size=-1) { mgl_puts(gr, p.x, p.y, p.z, text, font, size); } - inline void Putsw(mreal x, mreal y,const wchar_t *text,const char *font=":AC",mreal size=-1) + inline void Putsw(double x, double y,const wchar_t *text,const char *font=":AC",double size=-1) { mgl_putsw(gr, x, y, 0, text, font, size); } - inline void Puts(mreal x, mreal y,const char *text,const char *font=":AC",mreal size=-1) + inline void Puts(double x, double y,const char *text,const char *font=":AC",double size=-1) { mgl_puts(gr, x, y, 0, text, font, size); } /// Print text in position p along direction d with specified font - inline void Putsw(mglPoint p, mglPoint d, const wchar_t *text, const char *font=":L", mreal size=-1) + inline void Putsw(mglPoint p, mglPoint d, const wchar_t *text, const char *font=":L", double size=-1) { mgl_putsw_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, text, font, size); } - inline void Puts(mglPoint p, mglPoint d, const char *text, const char *font=":L", mreal size=-1) + inline void Puts(mglPoint p, mglPoint d, const char *text, const char *font=":L", double size=-1) { mgl_puts_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, text, font, size); } /// Print text along the curve @@ -480,30 +508,30 @@ public: inline void Text(const mglDataA &y, const wchar_t *text, const char *font="", const char *opt="") { mgl_textw_y(gr, &y, text, font, opt); } - /// Draws bounding box outside the plotting volume with color \a c. + /// Draws bounding box outside the plotting volume with color c. inline void Box(const char *col="", bool ticks=true) { mgl_box_str(gr, col, ticks); } - /// Draw axises with ticks in directions determined by string parameter \a dir. - inline void Axis(const char *dir="xyzt", const char *stl="") - { mgl_axis(gr, dir,stl); } - /// Draw grid lines perpendicular to direction determined by string parameter \a dir. - inline void Grid(const char *dir="xyzt",const char *pen="B") - { mgl_axis_grid(gr, dir, pen); } - /// Print the label \a text for axis \a dir. - inline void Label(char dir, const char *text, mreal pos=+1, mreal shift=0) - { mgl_label_ext(gr, dir, text, pos, shift); } - inline void Label(char dir, const wchar_t *text, mreal pos=+1, mreal shift=0) - { mgl_labelw_ext(gr, dir, text, pos, shift); } + /// Draw axises with ticks in direction(s) dir. + inline void Axis(const char *dir="xyzt", const char *stl="", const char *opt="") + { mgl_axis(gr, dir,stl,opt); } + /// Draw grid lines perpendicular to direction(s) dir. + inline void Grid(const char *dir="xyzt",const char *pen="B", const char *opt="") + { mgl_axis_grid(gr, dir, pen, opt); } + /// Print the label text for axis dir. + inline void Label(char dir, const char *text, double pos=+1, const char *opt="") + { mgl_label(gr, dir, text, pos, opt); } + inline void Label(char dir, const wchar_t *text, double pos=+1, const char *opt="") + { mgl_labelw(gr, dir, text, pos, opt); } /// Draw colorbar at edge of axis inline void Colorbar(const char *sch="") { mgl_colorbar(gr, sch); } - inline void Colorbar(const char *sch,mreal x,mreal y,mreal w=1,mreal h=1) + inline void Colorbar(const char *sch,double x,double y,double w=1,double h=1) { mgl_colorbar_ext(gr, sch, x,y,w,h); } /// Draw colorbar with manual colors at edge of axis inline void Colorbar(const mglDataA &val, const char *sch="") { mgl_colorbar_val(gr, &val, sch); } - inline void Colorbar(const mglDataA &val, const char *sch,mreal x,mreal y,mreal w=1,mreal h=1) + inline void Colorbar(const mglDataA &val, const char *sch,double x,double y,double w=1,double h=1) { mgl_colorbar_val_ext(gr, &val, sch, x,y,w,h); } /// Add string to legend @@ -515,11 +543,11 @@ public: inline void ClearLegend() { mgl_clear_legend(gr); } /// Draw legend of accumulated strings at position {x,y} - inline void Legend(mreal x, mreal y, const char *font="#", mreal size=-0.8, mreal llen=0) - { mgl_legend_pos(gr, x, y, font, size, llen); } + inline void Legend(double x, double y, const char *font="#", const char *opt="") + { mgl_legend_pos(gr, x, y, font, opt); } /// Draw legend of accumulated strings - inline void Legend(int where=3, const char *font="#", mreal size=-0.8, mreal llen=0) - { mgl_legend(gr, where, font, size, llen); } + inline void Legend(int where=3, const char *font="#", const char *opt="") + { mgl_legend(gr, where, font, opt); } /// Set number of marks in legend sample inline void SetLegendMarks(int num) { mgl_set_legend_marks(gr, num); } @@ -659,18 +687,29 @@ public: inline void Label(const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_labelw_y(gr, &y, text, fnt, opt); } - /// Draw tube with radius r for points in arrays {x,y,z} + /// Draw table for values val along given direction with row labels text + inline void Table(const mglDataA &val, const char *text, const char *fnt="#|", const char *opt="") + { mgl_table(gr, 0, 0, &val, text, fnt, opt); } + inline void Table(const mglDataA &val, const wchar_t *text, const char *fnt="#|", const char *opt="") + { mgl_tablew(gr, 0, 0, &val, text, fnt, opt); } + /// Draw table for values val along given direction with row labels text at given position + inline void Table(double x, double y, const mglDataA &val, const char *text, const char *fnt="#|", const char *opt="") + { mgl_table(gr, x, y, &val, text, fnt, opt); } + inline void Table(double x, double y, const mglDataA &val, const wchar_t *text, const char *fnt="#|", const char *opt="") + { mgl_tablew(gr, x, y, &val, text, fnt, opt); } + + /// Draw tube with radius r around curve {x,y,z} inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *pen="", const char *opt="") { mgl_tube_xyzr(gr, &x, &y, &z, &r, pen, opt); } - inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &z, mreal r, const char *pen="", const char *opt="") + inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &z, double r, const char *pen="", const char *opt="") { mgl_tube_xyz(gr, &x, &y, &z, r, pen, opt); } inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *pen="", const char *opt="") { mgl_tube_xyr(gr, &x, &y, &r, pen, opt); } - inline void Tube(const mglDataA &x, const mglDataA &y, mreal r, const char *pen="", const char *opt="") + inline void Tube(const mglDataA &x, const mglDataA &y, double r, const char *pen="", const char *opt="") { mgl_tube_xy(gr, &x, &y, r, pen, opt); } inline void Tube(const mglDataA &y, const mglDataA &r, const char *pen="", const char *opt="") { mgl_tube_r(gr, &y, &r, pen, opt); } - inline void Tube(const mglDataA &y, mreal r, const char *pen="", const char *opt="") + inline void Tube(const mglDataA &y, double r, const char *pen="", const char *opt="") { mgl_tube(gr, &y, r, pen, opt); } /// Draw surface of curve {r,z} rotatation around axis inline void Torus(const mglDataA &r, const mglDataA &z, const char *pen="", const char *opt="") @@ -744,7 +783,7 @@ public: { mgl_contd_xy(gr, &x, &y, &z, sch, opt); } inline void ContD(const mglDataA &z, const char *sch="", const char *opt="") { mgl_contd(gr, &z, sch, opt); } - /// Draw contour lines for 2d data specified parametrically + /// Draw contour tubes for 2d data specified parametrically inline void ContV(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv_xy_val(gr, &v, &x, &y, &z, sch, opt); } inline void ContV(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") @@ -753,6 +792,7 @@ public: { mgl_contv_xy(gr, &x, &y, &z, sch, opt); } inline void ContV(const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv(gr, &z, sch, opt); } + /// Draw axial-symmetric isosurfaces for 2d data specified parametrically inline void Axial(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_axial_xy_val(gr, &v, &x, &y, &z, sch,opt); } @@ -764,20 +804,20 @@ public: { mgl_axial(gr, &z, sch, opt); } /// Draw grid lines for density plot at slice for 3d data specified parametrically - inline void Grid3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", mreal sVal=-1, const char *opt="") + inline void Grid3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_grid3_xyz(gr, &x, &y, &z, &a, stl, sVal, opt); } - inline void Grid3(const mglDataA &a, const char *stl="", mreal sVal=-1, const char *opt="") + inline void Grid3(const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_grid3(gr, &a, stl, sVal, opt); } /// Draw density plot at slice for 3d data specified parametrically - inline void Dens3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", mreal sVal=-1, const char *opt="") + inline void Dens3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_dens3_xyz(gr, &x, &y, &z, &a, stl, sVal, opt); } - inline void Dens3(const mglDataA &a, const char *stl="", mreal sVal=-1, const char *opt="") + inline void Dens3(const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_dens3(gr, &a, stl, sVal, opt); } /// Draw isosurface(s) for 3d data specified parametrically - inline void Surf3(mreal Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="") + inline void Surf3(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3_xyz_val(gr, Val, &x, &y, &z, &a, stl, opt); } - inline void Surf3(mreal Val, const mglDataA &a, const char *stl="", const char *opt="") + inline void Surf3(double Val, const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3_val(gr, Val, &a, stl, opt); } inline void Surf3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3_xyz(gr, &x, &y, &z, &a, stl, opt); } @@ -791,32 +831,32 @@ public: { mgl_cloud(gr, &a, stl, opt); } /// Draw contour lines at slice for 3d data specified parametrically - inline void Cont3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", mreal sVal=-1, const char *opt="") + inline void Cont3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3_xyz_val(gr, &v, &x, &y, &z, &a, sch, sVal, opt); } - inline void Cont3(const mglDataA &v, const mglDataA &a, const char *sch="", mreal sVal=-1, const char *opt="") + inline void Cont3(const mglDataA &v, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3_val(gr, &v, &a, sch, sVal, opt); } - inline void Cont3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", mreal sVal=-1, const char *opt="") + inline void Cont3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3_xyz(gr, &x, &y, &z, &a, sch, sVal, opt); } - inline void Cont3(const mglDataA &a, const char *sch="", mreal sVal=-1, const char *opt="") + inline void Cont3(const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3(gr, &a, sch, sVal, opt); } /// Draw solid contours at slice for 3d data specified parametrically - inline void ContF3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", mreal sVal=-1, const char *opt="") + inline void ContF3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3_xyz_val(gr, &v, &x, &y, &z, &a, sch, sVal, opt); } - inline void ContF3(const mglDataA &v, const mglDataA &a, const char *sch="", mreal sVal=-1, const char *opt="") + inline void ContF3(const mglDataA &v, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3_val(gr, &v, &a, sch, sVal, opt); } - inline void ContF3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", mreal sVal=-1, const char *opt="") + inline void ContF3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3_xyz(gr, &x, &y, &z, &a, sch, sVal, opt); } - inline void ContF3(const mglDataA &a, const char *sch="", mreal sVal=-1, const char *opt="") + inline void ContF3(const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3(gr, &a, sch, sVal, opt); } /// Draw several isosurfaces for 3d beam in curvilinear coordinates - inline void Beam(const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, mreal r, const char *stl=0, int flag=0, int num=3) + inline void Beam(const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, double r, const char *stl=0, int flag=0, int num=3) { mgl_beam(gr, &tr,&g1,&g2,&a,r,stl,flag,num); } - inline void Beam(mreal val, const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, mreal r, const char *stl=NULL, int flag=0) + inline void Beam(double val, const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, double r, const char *stl=NULL, int flag=0) { mgl_beam_val(gr,val,&tr,&g1,&g2,&a,r,stl,flag); } - /// Draw vertical tiles with variable size for 2d data specified parametrically + /// Draw vertical tiles with variable size r for 2d data specified parametrically inline void TileS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *stl="", const char *opt="") { mgl_tiles_xy(gr, &x, &y, &z, &r, stl, opt); } inline void TileS(const mglDataA &z, const mglDataA &r, const char *stl="", const char *opt="") @@ -831,6 +871,7 @@ public: { mgl_surfa_xy(gr, &x, &y, &z, &c, sch,opt); } inline void SurfA(const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_surfa(gr, &z, &c, sch,opt); } + /// Color map of matrix a to matrix b, both matrix can parametrically depend on coordinates inline void Map(const mglDataA &x, const mglDataA &y, const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="") { mgl_map_xy(gr, &x, &y, &a, &b, sch, opt); } @@ -843,18 +884,19 @@ public: { mgl_stfa(gr, &re, &im, dn, sch, opt); } /// Draw isosurface(s) for 3d data specified parametrically with alpha proportional to b - inline void Surf3A(mreal Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") + inline void Surf3A(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a_xyz_val(gr, Val, &x, &y, &z, &a, &b, stl, opt); } - inline void Surf3A(mreal Val, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") + inline void Surf3A(double Val, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a_val(gr, Val, &a, &b, stl, opt); } inline void Surf3A(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a_xyz(gr, &x, &y, &z, &a, &b, stl, opt); } inline void Surf3A(const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a(gr, &a, &b, stl, opt); } + /// Draw isosurface(s) for 3d data specified parametrically with color proportional to b - inline void Surf3C(mreal Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") + inline void Surf3C(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3c_xyz_val(gr, Val, &x, &y, &z, &a, &b, stl,opt); } - inline void Surf3C(mreal Val, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") + inline void Surf3C(double Val, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3c_val(gr, Val, &a, &b, stl, opt); } inline void Surf3C(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3c_xyz(gr, &x, &y, &z, &a, &b, stl, opt); } @@ -871,7 +913,8 @@ public: { mgl_traj_xy(gr, &x, &y, &ax, &ay, sch, opt); } inline void Traj(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_traj_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt); } - /// Plot vector field {ax,ay,ay} parametrically depended on coordinate {x,y,z} with length/color proportional to |a| + + /// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a| inline void Vect(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_vect_xy(gr, &x, &y, &ax, &ay, sch, opt); } inline void Vect(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") @@ -881,7 +924,13 @@ public: inline void Vect(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_vect_3d(gr, &ax, &ay, &az, sch, opt); } - /// Plot flows for vector field {ax,ay,ay} parametrically depended on coordinate {x,y,z} with color proportional to |a| + /// Draw vector plot at slice for 3d data specified parametrically + inline void Vect3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *stl="", double sVal=-1, const char *opt="") + { mgl_vect3_xyz(gr, &x, &y, &z, &ax,&ay,&az, stl, sVal, opt); } + inline void Vect3(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *stl="", double sVal=-1, const char *opt="") + { mgl_vect3(gr, &ax,&ay,&az, stl, sVal, opt); } + + /// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| inline void Flow(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flow_xy(gr, &x, &y, &ax, &ay, sch, opt); } inline void Flow(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") @@ -890,7 +939,8 @@ public: { mgl_flow_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt); } inline void Flow(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_flow_3d(gr, &ax, &ay, &az, sch, opt); } - /// Plot flow from point p for vector field {ax,ay,ay} parametrically depended on coordinate {x,y,z} with color proportional to |a| + + /// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| inline void FlowP(mglPoint p, const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flowp_xy(gr, p.x, p.y, p.z, &x, &y, &ax, &ay, sch, opt); } inline void FlowP(mglPoint p, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") @@ -908,63 +958,63 @@ public: inline void Grad(const mglDataA &phi, const char *sch="", const char *opt="") { mgl_grad(gr,&phi,sch,opt); } - /// Plot flow pipes for vector field {ax,ay,ay} parametrically depended on coordinate {x,y,z} with color proportional to |a| - inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", mreal r0=0.05, const char *opt="") + /// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a| + inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_xy(gr, &x, &y, &ax, &ay, sch, r0, opt); } - inline void Pipe(const mglDataA &ax, const mglDataA &ay, const char *sch="", mreal r0=0.05, const char *opt="") + inline void Pipe(const mglDataA &ax, const mglDataA &ay, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_2d(gr, &ax, &ay, sch, r0, opt); } - inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", mreal r0=0.05, const char *opt="") + inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, r0, opt); } - inline void Pipe(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", mreal r0=0.05, const char *opt="") + inline void Pipe(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_3d(gr, &ax, &ay, &az, sch, r0, opt); } /// Draw density plot for data at x = sVal - inline void DensX(const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + inline void DensX(const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_dens_x(gr, &a, stl, sVal, opt); } /// Draw density plot for data at y = sVal - inline void DensY(const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + inline void DensY(const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_dens_y(gr, &a, stl, sVal, opt); } /// Draw density plot for data at z = sVal - inline void DensZ(const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + inline void DensZ(const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_dens_z(gr, &a, stl, sVal, opt); } - /// Draw contour plots for data at x = sVal - inline void ContX(const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + /// Draw contour lines for data at x = sVal + inline void ContX(const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_cont_x(gr, &a, stl, sVal, opt); } - inline void ContX(const mglDataA &v, const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + inline void ContX(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_cont_x_val(gr, &v, &a, stl, sVal, opt); } - /// Draw contour plots for data at y = sVal - inline void ContY(const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + /// Draw contour lines for data at y = sVal + inline void ContY(const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_cont_y(gr, &a, stl, sVal, opt); } - inline void ContY(const mglDataA &v, const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + inline void ContY(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_cont_y_val(gr, &v, &a, stl, sVal, opt); } - /// Draw contour plots for data at z = sVal - inline void ContZ(const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + /// Draw contour lines for data at z = sVal + inline void ContZ(const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_cont_z(gr, &a, stl, sVal, opt); } - inline void ContZ(const mglDataA &v, const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + inline void ContZ(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_cont_z_val(gr, &v, &a, stl, sVal, opt); } - /// Draw solid contour plots for data at x = sVal - inline void ContFX(const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + /// Draw solid contours for data at x = sVal + inline void ContFX(const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_contf_x(gr, &a, stl, sVal, opt); } - inline void ContFX(const mglDataA &v, const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + inline void ContFX(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_contf_x_val(gr, &v, &a, stl, sVal, opt); } - /// Draw solid contour plots for data at y = sVal - inline void ContFY(const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + /// Draw solid contours for data at y = sVal + inline void ContFY(const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_contf_y(gr, &a, stl, sVal, opt); } - inline void ContFY(const mglDataA &v, const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + inline void ContFY(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_contf_y_val(gr, &v, &a, stl, sVal, opt); } - /// Draw solid contour plots for data at z = sVal - inline void ContFZ(const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + /// Draw solid contours for data at z = sVal + inline void ContFZ(const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_contf_z(gr, &a, stl, sVal, opt); } - inline void ContFZ(const mglDataA &v, const mglDataA &a, const char *stl="", mreal sVal=NaN, const char *opt="") + inline void ContFZ(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=NaN, const char *opt="") { mgl_contf_z_val(gr, &v, &a, stl, sVal, opt); } - /// Draw curve for formula with x in range [Min.x, Max.x] + /// Draw curve for formula with x in x-axis range inline void FPlot(const char *fy, const char *stl="", const char *opt="") { mgl_fplot(gr, fy, stl, opt); } /// Draw curve for formulas parametrically depended on t in range [0,1] inline void FPlot(const char *fx, const char *fy, const char *fz, const char *stl, const char *opt="") { mgl_fplot_xyz(gr, fx, fy, fz, stl, opt); } - /// Draw surface by formula with x,y in range [Min, Max] + /// Draw surface by formula with x,y in axis range inline void FSurf(const char *fz, const char *stl="", const char *opt="") { mgl_fsurf(gr, fz, stl, opt); } /// Draw surface by formulas parametrically depended on u,v in range [0,1] @@ -986,7 +1036,7 @@ public: inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const char *sch="", const char *opt="") { mgl_quadplot_xy(gr, &nums, &x, &y, sch, opt); } - /// Draw contour lines for triangle mesh for points in arrays {x,y,z}. + /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. inline void TriCont(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_tricont_xyc(gr, &nums, &x, &y, &z, sch, opt); } inline void TriContV(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") @@ -999,7 +1049,7 @@ public: /// Draw dots in points {x,y,z}. inline void Dots(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_dots(gr, &x, &y, &z, sch, opt); } - /// Draw semitransparent dots in points {x,y,z}. + /// Draw semitransparent dots in points {x,y,z} with alpha a. inline void Dots(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_dots_a(gr, &x, &y, &z, &a, sch, opt); } /// Draw surface reconstructed for points in arrays {x,y,z}. @@ -1056,14 +1106,14 @@ public: inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &s, const char *eq, const char *var, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xyzas(gr, &x, &y, &z, &a, &s, eq, var, &ini, opt)); } /// Print fitted last formula (with coefficients) - inline void PutsFit(mglPoint p, const char *prefix=0, const char *font=0, mreal size=-1) + inline void PutsFit(mglPoint p, const char *prefix=0, const char *font="", double size=-1) { mgl_puts_fit(gr, p.x, p.y, p.z, prefix, font, size); } /// Get last fitted formula inline const char *GetFit() { return mgl_get_fit(gr); } /// Solve PDE with x,y,z in range [Min, Max] - inline mglData PDE(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, mreal dz=0.1, mreal k0=100, const char *opt="") + inline mglData PDE(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, double dz=0.1, double k0=100, const char *opt="") { return mglData(true,mgl_pde_solve(gr,ham,&ini_re,&ini_im,dz,k0, opt)); } /// Fill data by formula with x,y,z in range [Min, Max] inline void Fill(mglData &u, const char *eq, const char *opt="") @@ -1072,7 +1122,14 @@ public: { mgl_data_fill_eq(gr, &u, eq, &v, 0, opt); } inline void Fill(mglData &u, const char *eq, const mglDataA &v, const mglDataA &w, const char *opt="") { mgl_data_fill_eq(gr, &u, eq, &v, &w, opt); } - + /// Fill data by formula with x,y,z in range [Min, Max] + inline void Fill(mglDataC &u, const char *eq, const char *opt="") + { mgl_datac_fill_eq(gr, &u, eq, 0, 0, opt); } + inline void Fill(mglDataC &u, const char *eq, const mglDataA &v, const char *opt="") + { mgl_datac_fill_eq(gr, &u, eq, &v, 0, opt); } + inline void Fill(mglDataC &u, const char *eq, const mglDataA &v, const mglDataA &w, const char *opt="") + { mgl_datac_fill_eq(gr, &u, eq, &v, &w, opt); } + /// Set the data by triangulated surface values assuming x,y,z in range [Min, Max] inline void DataGrid(mglData &d, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *opt="") { mgl_data_grid(gr,&d,&x,&y,&z,opt); } @@ -1096,6 +1153,40 @@ public: /// Callback function for asking user a question. Result shouldn't exceed 1024. extern void (*mgl_ask_func)(const wchar_t *quest, wchar_t *res); //----------------------------------------------------------------------------- +/// Structure for handling named mglData (used by mglParse class). +class mglVar : public mglData +{ +public: + std::wstring s; ///< Data name + void *o; ///< Pointer to external object + mglVar *next; ///< Pointer to next instance in list + mglVar *prev; ///< Pointer to previous instance in list + bool temp; ///< This is temporary variable + void (*func)(void *); ///< Callback function for destroying + + mglVar():mglData() { o=0; next=prev=0; func=0; temp=false; } + virtual ~mglVar() + { + if(func) func(o); + if(prev) prev->next = next; + if(next) next->prev = prev; + } + /// Move variable after var and copy func from var (if func is 0) + void MoveAfter(mglVar *var) + { + if(prev) prev->next = next; + if(next) next->prev = prev; + prev = next = 0; + if(var) + { + prev = var; next = var->next; + var->next = this; + if(func==0) func = var->func; + } + if(next) next->prev = this; + } +}; +//----------------------------------------------------------------------------- /// Wrapper class for MGL parsing class mglParse { @@ -1106,35 +1197,78 @@ public: mglParse(bool setsize=false) { pr=mgl_create_parser(); mgl_parser_allow_setsize(pr, setsize); } ~mglParse() { if(mgl_use_parser(pr,-1)<1) mgl_delete_parser(pr); } + /// Get pointer to internal mglParser object inline HMPR Self() { return pr; } + /// Parse and draw single line of the MGL script inline int Parse(mglGraph *gr, const char *str, int pos) - { return mgl_parse(gr->Self(), pr, str, pos); } + { return mgl_parse_line(gr->Self(), pr, str, pos); } inline int Parse(mglGraph *gr, const wchar_t *str, int pos) - { return mgl_parsew(gr->Self(), pr, str, pos); } + { return mgl_parse_linew(gr->Self(), pr, str, pos); } + /// Execute MGL script text with '\n' separated lines inline void Execute(mglGraph *gr, const char *str) { mgl_parse_text(gr->Self(), pr, str); } inline void Execute(mglGraph *gr, const wchar_t *str) - { mgl_parsew_text(gr->Self(), pr, str); } + { mgl_parse_textw(gr->Self(), pr, str); } + /// Execute and draw script from the file inline void Execute(mglGraph *gr, FILE *fp, bool print=false) { mgl_parse_file(gr->Self(), pr, fp, print); } + + /// Return type of command: 0 - not found, 1 - data plot, 2 - other plot, + /// 3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program + /// 8 - 1d plot, 9 - 2d plot, 10 - 3d plot, 11 - dd plot, 12 - vector plot + /// 13 - axis, 14 - primitives, 15 - axis setup, 16 - text/legend, 17 - data transform inline int CmdType(const char *name) - { return mgl_cmd_type(pr, name); } + { return mgl_parser_cmd_type(pr, name); } + /// Return string of command format (command name and its argument[s]) inline const char *CmdFormat(const char *name) - { return mgl_cmd_frmt(pr, name); } + { return mgl_parser_cmd_frmt(pr, name); } + /// Return description of MGL command inline const char *CmdDesc(const char *name) - { return mgl_cmd_desc(pr, name); } + { return mgl_parser_cmd_desc(pr, name); } + /// Get name of command with nmber n + inline const char *GetCmdName(long n) + { return mgl_parser_cmd_name(pr,n); } + /// Get number of defined commands + inline long GetCmdNum() + { return mgl_parser_cmd_num(pr); } - inline void AddParam(int id, const char *str) { mgl_add_param(pr, id, str); } - inline void AddParam(int id, const wchar_t *str){ mgl_add_paramw(pr, id, str); } - inline void RestoreOnce() { mgl_restore_once(pr); } + /// Set value for parameter $N + inline void AddParam(int id, const char *str) + { mgl_parser_add_param(pr, id, str); } + inline void AddParam(int id, const wchar_t *str) + { mgl_parser_add_paramw(pr, id, str); } + /// Restore once flag + inline void RestoreOnce() { mgl_parser_restore_once(pr); } + /// Allow changing size of the picture inline void AllowSetSize(bool allow) { mgl_parser_allow_setsize(pr, allow); } - - /*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ - inline mglData *AddVar(const char *name) { return mgl_add_var(pr, name); } - /*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ - inline mglData *FindVar(const char *name) { return mgl_find_var(pr, name); } - inline void DeleteVar(const char *name) { mgl_del_var(pr, name); } + /// Allow reading/saving files + inline void AllowFileIO(bool allow) { mgl_parser_allow_file_io(pr, allow); } + /// Set flag to stop script parsing inline void Stop() { mgl_parser_stop(pr); } + + /// Return result of formula evaluation + inline mglData Calc(const char *formula) + { return mglData(true,mgl_parser_calc(pr,formula)); } + inline mglData Calc(const wchar_t *formula) + { return mglData(true,mgl_parser_calcw(pr,formula)); } + + /// Find variable with given name or add a new one + /// NOTE !!! You must not delete obtained data arrays !!! + inline mglVar *AddVar(const char *name) + { return dynamic_cast(mgl_parser_add_var(pr, name)); } + inline mglVar *AddVar(const wchar_t *name) + { return dynamic_cast(mgl_parser_add_varw(pr, name)); } + /// Find variable with given name or return NULL if no one + /// NOTE !!! You must not delete obtained data arrays !!! + inline mglVar *FindVar(const char *name) + { return dynamic_cast(mgl_parser_find_var(pr, name)); } + inline mglVar *FindVar(const wchar_t *name) + { return dynamic_cast(mgl_parser_find_varw(pr, name)); } + /// Delete variable with name + inline void DeleteVar(const char *name) { mgl_parser_del_var(pr, name); } + inline void DeleteVar(const wchar_t *name) { mgl_parser_del_varw(pr, name); } + /// Delete all data variables + void DeleteAll() { mgl_parser_del_all(pr); } }; //----------------------------------------------------------------------------- /// Wrapper class expression evaluating @@ -1144,14 +1278,18 @@ class mglExpr public: mglExpr(const char *expr) { ex = mgl_create_expr(expr); } ~mglExpr() { mgl_delete_expr(ex); } - inline mreal Eval(mreal x, mreal y=0, mreal z=0) + /// Return value of expression for given x,y,z variables + inline double Eval(double x, double y=0, double z=0) { return mgl_expr_eval(ex,x,y,z); } - inline mreal Diff(char dir, mreal x, mreal y=0, mreal z=0) + /// Return value of expression differentiation over variable dir for given x,y,z variables + inline double Diff(char dir, double x, double y=0, double z=0) { return mgl_expr_diff(ex,dir, x,y,z); } #ifndef SWIG - inline mreal Eval(mreal var[26]) + /// Return value of expression for given variables + inline double Eval(mreal var[26]) { return mgl_expr_eval_v(ex,var); } - inline mreal Diff(char dir, mreal var[26]) + /// Return value of expression differentiation over variable dir for given variables + inline double Diff(char dir, mreal var[26]) { return mgl_expr_diff_v(ex,dir, var); } #endif }; diff --git a/include/mgl2/mgl_cf.h b/include/mgl2/mgl_cf.h index e102c38..279d647 100644 --- a/include/mgl2/mgl_cf.h +++ b/include/mgl2/mgl_cf.h @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_cf.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -19,29 +19,28 @@ ***************************************************************************/ #ifndef _MGL_CF_H_ #define _MGL_CF_H_ -/*****************************************************************************/ -#include "mgl2/base_cf.h" -#include "mgl2/data_cf.h" -#include "mgl2/cont.h" -#include "mgl2/fit.h" -#include "mgl2/plot.h" -#include "mgl2/surf.h" -#include "mgl2/volume.h" -#include "mgl2/vect.h" -#include "mgl2/prim.h" -#include "mgl2/other.h" -#include "mgl2/canvas_cf.h" -#include "mgl2/addon.h" -/*****************************************************************************/ -#if MGL_HAVE_OPENGL -#ifdef __cplusplus -extern "C" { -#endif -HMGL mgl_create_graph_gl(); -uintptr_t mgl_create_graph_gl_(); +//----------------------------------------------------------------------------- #ifdef __cplusplus -} +#include +#include #endif +//----------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//----------------------------------------------------------------------------- +#if MGL_HAVE_OPENGL +#include #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/opengl.h b/include/mgl2/opengl.h index ca712e6..a68aca1 100644 --- a/include/mgl2/opengl.h +++ b/include/mgl2/opengl.h @@ -1,6 +1,6 @@ /*************************************************************************** * opengl.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -19,7 +19,7 @@ ***************************************************************************/ #ifndef MGL_CANVAS_GL_H #define MGL_CANVAS_GL_H -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus #include "mgl2/canvas.h" @@ -33,9 +33,11 @@ public: void Finish(bool fast=true); void SetSize(int ,int ) {} void View(mreal tetX,mreal tetY,mreal tetZ); + void Zoom(mreal x1, mreal y1, mreal x2, mreal y2); int NewFrame(); void EndFrame(); - + void DelFrame(long ){} + bool Alpha(bool enable); void Fog(mreal d, mreal dz=0.25); bool Light(bool enable); @@ -55,14 +57,13 @@ protected: }; extern "C" { #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- HMGL mgl_create_graph_gl(); -/*****************************************************************************/ uintptr_t mgl_create_graph_gl_(); -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/other.h b/include/mgl2/other.h index b31122f..afa9578 100644 --- a/include/mgl2/other.h +++ b/include/mgl2/other.h @@ -1,6 +1,6 @@ /*************************************************************************** * other.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,88 +20,107 @@ #ifndef _MGL_OTHER_H_ #define _MGL_OTHER_H_ #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ + +/// Draw triangle mesh for points in arrays {x,y,z} with specified color c. void mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); +void mgl_triplot_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); +/// Draw triangle mesh for points in arrays {x,y,z} with color proportional to z. void mgl_triplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_triplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw triangle mesh for points in arrays {x,y} void mgl_triplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt); +void mgl_triplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int); +/// Draw quad mesh for points in arrays {x,y,z} with specified color c. void mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); +void mgl_quadplot_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); +/// Draw quad mesh for points in arrays {x,y,z} with color proportional to z. void mgl_quadplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_quadplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw quad mesh for points in arrays {x,y}. void mgl_quadplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt); +void mgl_quadplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int); +/// Draw manual contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. void mgl_tricont_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); +void mgl_tricont_xyzcv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); +/// Draw manual contour lines for triangle mesh for points in arrays {x,y,z}. void mgl_tricont_xycv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_tricont_xycv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. void mgl_tricont_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); +void mgl_tricont_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int, int); +/// Draw contour lines for triangle mesh for points in arrays {x,y,z}. void mgl_tricont_xyc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_tricont_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int, int); +/// Draw dots in points {x,y,z}. void mgl_dots(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_dots_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw semitransparent dots in points {x,y,z} with alpha a. void mgl_dots_a(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt); +void mgl_dots_a_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int,int); +/// Draw surface reconstructed for points in arrays {x,y,z}. void mgl_crust(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); - -void mgl_dens_x(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_dens_y(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_dens_z(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); - -void mgl_cont_x(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_cont_y(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_cont_z(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); - -void mgl_cont_x_val(HMGL graph, HCDT v, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_cont_y_val(HMGL graph, HCDT v, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_cont_z_val(HMGL graph, HCDT v, HCDT a, const char *stl, mreal sVal, const char *opt); - -void mgl_contf_x(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_contf_y(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_contf_z(HMGL graph, HCDT a, const char *stl, mreal sVal, const char *opt); - -void mgl_contf_x_val(HMGL graph, HCDT v, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_contf_y_val(HMGL graph, HCDT v, HCDT a, const char *stl, mreal sVal, const char *opt); -void mgl_contf_z_val(HMGL graph, HCDT v, HCDT a, const char *stl, mreal sVal, const char *opt); - -/*****************************************************************************/ - -void mgl_triplot_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); -void mgl_triplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_triplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int); -void mgl_quadplot_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); -void mgl_quadplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_quadplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int); - -void mgl_tricont_xyzcv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); -void mgl_tricont_xycv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_tricont_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int, int); -void mgl_tricont_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int, int); - -void mgl_dots_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_dots_a_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int,int); -void mgl_dots_tr_(uintptr_t *gr, uintptr_t *tr, const char *sch, const char *opt,int,int); void mgl_crust_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_crust_tr_(uintptr_t *gr, uintptr_t *tr, const char *sch, const char *opt,int,int); +/// Draw density plot for data at x = sVal +void mgl_dens_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void mgl_dens_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw density plot for data at y = sVal +void mgl_dens_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void mgl_dens_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw density plot for data at z = sVal +void mgl_dens_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void mgl_dens_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); + +/// Draw contour lines for data at x = sVal +void mgl_cont_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void mgl_cont_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw contour lines for data at y = sVal +void mgl_cont_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void mgl_cont_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw contour lines for data at z = sVal +void mgl_cont_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void mgl_cont_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); + +/// Draw manual contour lines for data at x = sVal +void mgl_cont_x_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void mgl_cont_x_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw manual contour lines for data at y = sVal +void mgl_cont_y_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void mgl_cont_y_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw manual contour lines for data at z = sVal +void mgl_cont_z_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void mgl_cont_z_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); + +/// Draw solid contours for data at x = sVal +void mgl_contf_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void mgl_contf_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw solid contours for data at y = sVal +void mgl_contf_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void mgl_contf_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw solid contours for data at z = sVal +void mgl_contf_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void mgl_contf_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); + +/// Draw manual solid contours for data at x = sVal +void mgl_contf_x_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void mgl_contf_x_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw manual solid contours for data at y = sVal +void mgl_contf_y_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void mgl_contf_y_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); +/// Draw manual solid contours for data at z = sVal +void mgl_contf_z_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void mgl_contf_z_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); -/*****************************************************************************/ #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/parser.h b/include/mgl2/parser.h index 9e47330..bd7d93f 100644 --- a/include/mgl2/parser.h +++ b/include/mgl2/parser.h @@ -1,6 +1,6 @@ /*************************************************************************** * parser.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -32,7 +32,7 @@ struct mglArg std::wstring w; ///< String with parameters std::string s; ///< String with parameters mreal v; ///< Numerical value (used if type==2) - mglArg() { type=-1; d=0; v=0; }; + mglArg() { type=-1; d=0; v=0; } }; //----------------------------------------------------------------------------- /// Structure for MGL command @@ -49,23 +49,6 @@ struct mglCommand }; extern mglCommand mgls_base_cmd[]; //----------------------------------------------------------------------------- -/// Structure for the mglData handling (see mglParse class). -struct mglVar -{ - mglData d; ///< Data itself - std::wstring s; ///< Data name - void *o; ///< Pointer to external object - mglVar *next; ///< Pointer to next instance in list - mglVar *prev; ///< Pointer to prev instance in list - bool temp; ///< This temporar variable - void (*func)(void *); ///< Callback function for destroying - - mglVar() { o=0; next=prev=0; func=0; temp=false; }; - ~mglVar(); - /// Move variable after \a var and copy \a func from \a var (if \a func is 0) - void MoveAfter(mglVar *var); -}; -//----------------------------------------------------------------------------- /// Structure for the number handling (see mglParse class). struct mglNum { @@ -73,9 +56,9 @@ struct mglNum std::wstring s; ///< Number name mglNum *next; ///< Pointer to next instance in list mglNum *prev; ///< Pointer to prev instance in list - mglNum() { d=0; next=prev=0; }; + mglNum() { d=0; next=prev=0; } ~mglNum(); - /// Move variable after \a var and copy \a func from \a var (if \a func is 0) + /// Move variable after var and copy func from var (if func is 0) void MoveAfter(mglNum *var); }; //----------------------------------------------------------------------------- @@ -94,8 +77,9 @@ struct mglFunc /// Structure for stack of functions and its arguments. struct mglFnStack { + mglFnStack() {pos=0;} long pos; - wchar_t *par[9]; + std::wstring par[10]; }; //----------------------------------------------------------------------------- /// Function for asking question in console mode @@ -107,10 +91,11 @@ class mglParser friend void mgl_export(wchar_t *out, const wchar_t *in, int type); public: mglVar *DataList; ///< List with data and its names - mglNum *NumList; ///< List with numbers and its names + mglNum *NumList; ///< List with numbers and its names bool AllowSetSize; ///< Allow using setsize command + bool AllowFileIO; ///< Allow reading/saving files bool Stop; ///< Stop command was. Flag prevent further execution - mglCommand *Cmd; ///< Table of MGL commands (can be changed by user). It MUST be sorted by 'name'!!! + mglCommand *Cmd; ///< Table of MGL commands (can be changed by user). It MUST be sorted by 'name'!!! wchar_t *op1, *op2; ///< Buffer for options (are used if out!=NULL) long InUse; ///< Smart pointer (number of users) @@ -131,7 +116,7 @@ public: inline int Export(wchar_t cpp_out[1024], HMGL gr, const wchar_t *str) { mglGraph GR(gr); return Export(cpp_out,&GR,str); } int Export(wchar_t cpp_out[1024], mglGraph *gr, const wchar_t *str); - /// Execute MGL script file \a fname + /// Execute MGL script file fname inline void Execute(HMGL gr, FILE *fp, bool print=false) { mglGraph GR(gr); Execute(&GR,fp,print); } void Execute(mglGraph *gr, FILE *fp, bool print=false); @@ -153,56 +138,54 @@ public: long IsFunc(const wchar_t *name, int *narg=0); /// Find variable or return 0 if absent mglVar *FindVar(const char *name); - /// Find variable or return 0 if absent mglVar *FindVar(const wchar_t *name); /// Find variable or create it if absent mglVar *AddVar(const char *name); - /// Find variable or create it if absent mglVar *AddVar(const wchar_t *name); /// Find number or return 0 if absent mglNum *FindNum(const char *name); - /// Find number or return 0 if absent mglNum *FindNum(const wchar_t *name); /// Find number or create it if absent mglNum *AddNum(const char *name); - /// Find number or create it if absent mglNum *AddNum(const wchar_t *name); /// Add string for parameter $1, ..., $9 - bool AddParam(int n, const char *str, bool isstr=true); - /// Add unicode string for parameter $1, ..., $9 - bool AddParam(int n, const wchar_t *str, bool isstr=true); + void AddParam(int n, const char *str); + void AddParam(int n, const wchar_t *str); /// Add new MGL command(s) (last command MUST HAVE name[0]=0 !!!) void AddCommand(mglCommand *cmd, int num=0); /// Restore Once flag - inline void RestoreOnce() { Once = true; }; + inline void RestoreOnce() { Once = true; } /// Delete variable void DeleteVar(mglVar *v); /// Delete variable by its name void DeleteVar(const char *name); - /// Delete variable by its name void DeleteVar(const wchar_t *name); + /// Delete all data variables + void DeleteAll(); private: - long parlen; ///< Length of parameter strings - wchar_t *par[40]; ///< Parameter for substituting instead of $1, ..., $9 +// long parlen; ///< Length of parameter strings + std::wstring par[40]; ///< Parameter for substituting instead of $1, ..., $9 wchar_t *out; ///< Buffer for writing C++ code (if not NULL) - wchar_t leg[128]; ///< Buffer for legend +// wchar_t leg[128]; ///< Buffer for legend bool Once; ///< Flag for command which should be executed only once bool Skip; ///< Flag that commands should be skiped (inside 'once' block) int if_stack[40]; ///< Stack for if-else-endif commands int if_pos; ///< position in if_stack std::vector func; ///< function names and position - mglFnStack *fn_stack; ///< function calls stack - int fn_pos; ///< position in function stack - int fn_num; ///< size of function stack + std::vector fn_stack; ///< function calls stack +// int fn_pos; ///< position in function stack int if_for[40]; ///< position in if_stack for for-cycle start mglData *fval; ///< Values for for-cycle. Note that nx - number of elements, ny - next element, nz - address (or string number) of first cycle command int for_stack[40]; ///< The order of for-variables int for_addr; ///< Flag for saving address in variable (for_addr-1) bool for_br; ///< Break is switched on (skip all comands until 'next') + /// Length of parameter strings + size_t GetParLen(); + size_t GetParLen(const wchar_t *str); /// Parse command int Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const wchar_t *var, const wchar_t *opt); - /// Fill arguments \a a from strings + /// Fill arguments a from strings void FillArg(mglGraph *gr, int n, wchar_t **arg, mglArg *a); /// PreExecute stage -- parse some commands and create variables int PreExec(mglGraph *gr, long n, wchar_t **arg, mglArg *a); @@ -213,8 +196,8 @@ private: /// Parse $N arguments void PutArg(const wchar_t *string, wchar_t *str, bool def); /// In skip mode - bool inline ifskip() { return (if_pos>0 && !(if_stack[if_pos-1]&1)); }; - bool inline skip() { return (Skip || ifskip() || for_br); }; + bool inline ifskip() { return (if_pos>0 && !(if_stack[if_pos-1]&1)); } + bool inline skip() { return (Skip || ifskip() || for_br); } }; //----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/plot.h b/include/mgl2/plot.h index 62e00f9..5e5bb27 100644 --- a/include/mgl2/plot.h +++ b/include/mgl2/plot.h @@ -1,6 +1,6 @@ /*************************************************************************** * plot.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,124 +20,168 @@ #ifndef _MGL_1D_H_ #define _MGL_1D_H_ #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ + +/// Draw curve for formula with x in x-axis range void mgl_fplot(HMGL gr, const char *eqY, const char *pen, const char *opt); -void mgl_fplot_xyz(HMGL gr, const char *eqX, const char *eqY, const char *eqZ, const char *pen, const char *opt); void mgl_fplot_(uintptr_t *gr, const char *fy, const char *stl, const char *opt, int ly, int ls, int lo); +/// Draw curve for formulas parametrically depended on t in range [0,1] +void mgl_fplot_xyz(HMGL gr, const char *eqX, const char *eqY, const char *eqZ, const char *pen, const char *opt); void mgl_fplot_xyz_(uintptr_t *gr, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt, int lx, int ly, int lz, int ls, int lo); -/*****************************************************************************/ + +/// Draw radar chart (plot in curved coordinates) void mgl_radar(HMGL graph, HCDT a, const char *pen, const char *opt); void mgl_radar_(uintptr_t *gr, uintptr_t *a, const char *pen, const char *opt, int l,int lo); -/*****************************************************************************/ + +/// Draw usual curve {x,y,z} void mgl_plot_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); -void mgl_plot_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); -void mgl_plot(HMGL graph, HCDT y, const char *pen, const char *opt); void mgl_plot_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); +/// Draw usual curve {x,y} +void mgl_plot_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void mgl_plot_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); +/// Draw usual curve {x,y} with x in x-axis range +void mgl_plot(HMGL graph, HCDT y, const char *pen, const char *opt); void mgl_plot_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); -/*****************************************************************************/ + +/// Draw curve {x,y,z} which is colored by c (like tension plot) void mgl_tens_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *pen, const char *opt); -void mgl_tens_xy(HMGL graph, HCDT x, HCDT y, HCDT c, const char *pen, const char *opt); -void mgl_tens(HMGL graph, HCDT y, HCDT c, const char *pen, const char *opt); void mgl_tens_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *pen, const char *opt,int,int); +/// Draw curve {x,y} which is colored by c (like tension plot) +void mgl_tens_xy(HMGL graph, HCDT x, HCDT y, HCDT c, const char *pen, const char *opt); void mgl_tens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *c, const char *pen, const char *opt,int,int); +/// Draw curve {x,y} with x in x-axis range which is colored by c (like tension plot) +void mgl_tens(HMGL graph, HCDT y, HCDT c, const char *pen, const char *opt); void mgl_tens_(uintptr_t *graph, uintptr_t *y, uintptr_t *c, const char *pen, const char *opt,int,int); -/*****************************************************************************/ + +/// Draw tape(s) which rotates as (bi-)normales of curve {x,y,z} void mgl_tape_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); -void mgl_tape_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); -void mgl_tape(HMGL graph, HCDT y, const char *pen, const char *opt); void mgl_tape_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); +/// Draw tape(s) which rotates as (bi-)normales of curve {x,y} +void mgl_tape_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void mgl_tape_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); +/// Draw tape(s) which rotates as (bi-)normales of curve {x,y} with x in x-axis range +void mgl_tape(HMGL graph, HCDT y, const char *pen, const char *opt); void mgl_tape_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); -/*****************************************************************************/ + +/// Draw box-plot (special 5-value plot used in statistic) for data specified parametrically void mgl_boxplot_xy(HMGL graph, HCDT x, HCDT a, const char *pen, const char *opt); +void mgl_boxplot_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); +/// Draw box-plot (special 5-value plot used in statistic) void mgl_boxplot(HMGL graph, HCDT a, const char *pen, const char *opt); -/*****************************************************************************/ +void mgl_boxplot_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); + +/// Fill area between curve {x,y,z} and axis plane void mgl_area_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); +void mgl_area_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); +/// Fill area between curve {x,y} and axis plane void mgl_area_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); +void mgl_area_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); +/// Fill area between curve {x,y} with x in x-axis range and axis plane void mgl_area(HMGL graph, HCDT y, const char *pen, const char *opt); -/*****************************************************************************/ +void mgl_area_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); + +/// Fill area between curves {x,y1} and {x,y2} void mgl_region_xy(HMGL graph, HCDT x, HCDT y1, HCDT y2, const char *pen, const char *opt); +void mgl_region_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int); +/// Fill area between curves {x,y1} and {x,y2} with x in x-axis range void mgl_region(HMGL graph, HCDT y1, HCDT y2, const char *pen, const char *opt); -/*****************************************************************************/ +void mgl_region_(uintptr_t *graph, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int); + +/// Draw vertical lines from points {x,y,z} to axis plane void mgl_stem_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); +void mgl_stem_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); +/// Draw vertical lines from points {x,y} to axis plane void mgl_stem_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); +void mgl_stem_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); +/// Draw vertical lines from points {x,y} with x in x-axis range to axis plane void mgl_stem(HMGL graph, HCDT y, const char *pen, const char *opt); -/*****************************************************************************/ +void mgl_stem_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); + +/// Draw stairs for points in arrays {x,y,z} void mgl_step_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); +void mgl_step_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); +/// Draw stairs for points in arrays {x,y} void mgl_step_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); +void mgl_step_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); +/// Draw stairs for points in arrays {x,y} with x in x-axis range void mgl_step(HMGL graph, HCDT y, const char *pen, const char *opt); -/*****************************************************************************/ +void mgl_step_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); + +/// Draw vertical bars from points {x,y,z} to axis plane void mgl_bars_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); +void mgl_bars_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); +/// Draw vertical bars from points {x,y} to axis plane void mgl_bars_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); +void mgl_bars_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); +/// Draw vertical bars from points {x,y} with x in x-axis range to axis plane void mgl_bars(HMGL graph, HCDT y, const char *pen, const char *opt); -/*****************************************************************************/ +void mgl_bars_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); + +/// Draw horizontal bars from points {v,y} to axis plane void mgl_barh_yx(HMGL graph, HCDT y, HCDT v, const char *pen, const char *opt); +void mgl_barh_yx_(uintptr_t *graph, uintptr_t *y, uintptr_t *v, const char *pen, const char *opt,int,int); +/// Draw horizontal bars from points {v,y} with y in y-axis range to axis plane void mgl_barh(HMGL graph, HCDT v, const char *pen, const char *opt); -/*****************************************************************************/ +void mgl_barh_(uintptr_t *graph, uintptr_t *v, const char *pen, const char *opt,int,int); + +/// Draw chart for data a void mgl_chart(HMGL graph, HCDT a, const char *col, const char *opt); -/*****************************************************************************/ +void mgl_chart_(uintptr_t *graph, uintptr_t *a, const char *col, const char *opt,int,int); + +/// Draw error boxes {ex,ey} at points {x,y} void mgl_error_exy(HMGL graph, HCDT x, HCDT y, HCDT ex, HCDT ey, const char *pen, const char *opt); +void mgl_error_exy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ex, uintptr_t *ey, const char *pen, const char *opt,int,int); +/// Draw error boxes {ey} at points {x,y} void mgl_error_xy(HMGL graph, HCDT x, HCDT y, HCDT ey, const char *pen, const char *opt); +void mgl_error_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int,int); +/// Draw error boxes {ey} at points {x,y} with x in x-axis range void mgl_error(HMGL graph, HCDT y, HCDT ey, const char *pen, const char *opt); -/*****************************************************************************/ -void mgl_mark_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, const char *opt); -void mgl_mark_xy(HMGL graph, HCDT x, HCDT y, HCDT r, const char *pen, const char *opt); -void mgl_mark_y(HMGL graph, HCDT y, HCDT r, const char *pen, const char *opt); -/*****************************************************************************/ -void mgl_tube_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, const char *opt); -void mgl_tube_xyr(HMGL graph, HCDT x, HCDT y, HCDT r, const char *pen, const char *opt); -void mgl_tube_r(HMGL graph, HCDT y, HCDT r, const char *pen, const char *opt); -void mgl_tube_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, mreal r, const char *pen, const char *opt); -void mgl_tube_xy(HMGL graph, HCDT x, HCDT y, mreal r, const char *penl, const char *opt); -void mgl_tube(HMGL graph, HCDT y, mreal r, const char *pen, const char *opt); -/*****************************************************************************/ -void mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt); -void mgl_candle_yv(HMGL gr, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt); -void mgl_candle(HMGL gr, HCDT v, HCDT y1, HCDT y2, const char *pen, const char *opt); -/*****************************************************************************/ -void mgl_boxplot_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_boxplot_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_area_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); -void mgl_area_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_area_s_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_area_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_region_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int); -void mgl_region_(uintptr_t *graph, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int); -void mgl_stem_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); -void mgl_stem_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_stem_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_step_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); -void mgl_step_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_step_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_bars_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); -void mgl_bars_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_bars_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); -void mgl_barh_yx_(uintptr_t *graph, uintptr_t *y, uintptr_t *v, const char *pen, const char *opt,int,int); -void mgl_barh_(uintptr_t *graph, uintptr_t *v, const char *pen, const char *opt,int,int); -void mgl_chart_(uintptr_t *graph, uintptr_t *a, const char *col, const char *opt,int,int); void mgl_error_(uintptr_t *graph, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int,int); -void mgl_error_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int,int); -void mgl_error_exy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ex, uintptr_t *ey, const char *pen, const char *opt,int,int); + +/// Draw marks with size r at points {x,y,z} +void mgl_mark_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, const char *opt); void mgl_mark_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *pen, const char *opt,int,int); +/// Draw marks with size r at points {x,y} +void mgl_mark_xy(HMGL graph, HCDT x, HCDT y, HCDT r, const char *pen, const char *opt); void mgl_mark_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); +/// Draw marks with size r at points {x,y} with x in x-axis range +void mgl_mark_y(HMGL graph, HCDT y, HCDT r, const char *pen, const char *opt); void mgl_mark_y_(uintptr_t *graph, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); + +/// Draw tube with variable radius r around curve {x,y,z} +void mgl_tube_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, const char *opt); void mgl_tube_xyzr_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *pen, const char *opt,int,int); +/// Draw tube with variable radius r around curve {x,y} +void mgl_tube_xyr(HMGL graph, HCDT x, HCDT y, HCDT r, const char *pen, const char *opt); void mgl_tube_xyr_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); +/// Draw tube with variable radius r around curve {x,y} with x in x-axis range +void mgl_tube_r(HMGL graph, HCDT y, HCDT r, const char *pen, const char *opt); void mgl_tube_r_(uintptr_t *graph, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); +/// Draw tube with constant radius r around curve {x,y,z} +void mgl_tube_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, double r, const char *pen, const char *opt); void mgl_tube_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, mreal *r, const char *pen, const char *opt,int,int); +/// Draw tube with constant radius r around curve {x,y} +void mgl_tube_xy(HMGL graph, HCDT x, HCDT y, double r, const char *penl, const char *opt); void mgl_tube_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, mreal *r, const char *pen, const char *opt,int,int); +/// Draw tube with constant radius r around curve {x,y} with x in x-axis range +void mgl_tube(HMGL graph, HCDT y, double r, const char *pen, const char *opt); void mgl_tube_(uintptr_t *graph, uintptr_t *y, mreal *r, const char *pen, const char *opt,int,int); + +/// Draw candle plot for data specified parametrically +void mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt); void mgl_candle_xyv_(uintptr_t *gr, uintptr_t *x, uintptr_t *v1, uintptr_t *v2, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); +/// Draw candle plot +void mgl_candle_yv(HMGL gr, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt); void mgl_candle_yv_(uintptr_t *gr, uintptr_t *v1, uintptr_t *v2, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); +/// Draw candle plot with v1=v[i], v2=v[i+1] +void mgl_candle(HMGL gr, HCDT v, HCDT y1, HCDT y2, const char *pen, const char *opt); void mgl_candle_(uintptr_t *gr, uintptr_t *y, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); -/*****************************************************************************/ + #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/prim.h b/include/mgl2/prim.h index 0480481..a324672 100644 --- a/include/mgl2/prim.h +++ b/include/mgl2/prim.h @@ -1,6 +1,6 @@ /*************************************************************************** * prim.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,100 +20,124 @@ #ifndef _MGL_PRIM_H_ #define _MGL_PRIM_H_ #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ -void mgl_mark(HMGL gr, mreal x,mreal y,mreal z,const char *mark); -void mgl_ball(HMGL gr, mreal x,mreal y,mreal z); -/*****************************************************************************/ -void mgl_line(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, const char *pen,int n); -void mgl_curve(HMGL gr, mreal x1, mreal y1, mreal z1, mreal dx1, mreal dy1, mreal dz1, mreal x2, mreal y2, mreal z2, mreal dx2, mreal dy2, mreal dz2, const char *pen,int n); -/*****************************************************************************/ -void mgl_error_box(HMGL gr, mreal x, mreal y, mreal z, mreal ex, mreal ey, mreal ez, const char *pen); -/*****************************************************************************/ -void mgl_face(HMGL gr, mreal x0, mreal y0, mreal z0, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal x3, mreal y3, mreal z3, const char *stl); -void mgl_facex(HMGL gr, mreal x0, mreal y0, mreal z0, mreal wy, mreal wz, const char *stl, mreal dx, mreal dy); -void mgl_facey(HMGL gr, mreal x0, mreal y0, mreal z0, mreal wx, mreal wz, const char *stl, mreal dx, mreal dy); -void mgl_facez(HMGL gr, mreal x0, mreal y0, mreal z0, mreal wx, mreal wy, const char *stl, mreal dx, mreal dy); -/*****************************************************************************/ -void mgl_sphere(HMGL gr, mreal x, mreal y, mreal z, mreal r, const char *stl); -void mgl_drop(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal r, const char *stl, mreal shift, mreal ap); -void mgl_cone(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal r1, mreal r2, const char *stl); -void mgl_ellipse(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal r, const char *stl); -void mgl_rhomb(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal r, const char *stl); -/*****************************************************************************/ -void mgl_cones_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); -void mgl_cones_xz(HMGL graph, HCDT x, HCDT z, const char *pen, const char *opt); -void mgl_cones(HMGL graph, HCDT z, const char *pen, const char *opt); -/*****************************************************************************/ -void mgl_dew_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); -void mgl_dew_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *optl); -/*****************************************************************************/ -void mgl_puts(HMGL graph, mreal x, mreal y, mreal z,const char *text, const char *font, mreal size); -void mgl_putsw(HMGL graph, mreal x, mreal y, mreal z,const wchar_t *text, const char *font, mreal size); -/*****************************************************************************/ -void mgl_puts_dir(HMGL graph, mreal x, mreal y, mreal z, mreal dx, mreal dy, mreal dz, const char *text, const char *font, mreal size); -void mgl_putsw_dir(HMGL graph, mreal x, mreal y, mreal z, mreal dx, mreal dy, mreal dz, const wchar_t *text, const char *font, mreal size); -/*****************************************************************************/ -void mgl_textmark_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *text, const char *fnt, const char *opt); -void mgl_textmark_xyr(HMGL graph, HCDT x, HCDT y, HCDT r, const char *text, const char *fnt, const char *opt); -void mgl_textmark_yr(HMGL graph, HCDT y, HCDT r, const char *text, const char *fnt, const char *opt); -void mgl_textmark(HMGL graph, HCDT y, const char *text, const char *fnt, const char *opt); -void mgl_textmarkw_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const wchar_t *text, const char *fnt, const char *opt); -void mgl_textmarkw_xyr(HMGL graph, HCDT x, HCDT y, HCDT r, const wchar_t *text, const char *fnt, const char *opt); -void mgl_textmarkw_yr(HMGL graph, HCDT y, HCDT r, const wchar_t *text, const char *fnt, const char *opt); -void mgl_textmarkw(HMGL graph, HCDT y, const wchar_t *text, const char *fnt, const char *opt); -/*****************************************************************************/ -void mgl_label_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *text, const char *fnt, const char *opt); -void mgl_labelw_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const wchar_t *text, const char *fnt, const char *opt); -void mgl_label_xy(HMGL graph, HCDT x, HCDT y, const char *text, const char *fnt, const char *opt); -void mgl_labelw_xy(HMGL graph, HCDT x, HCDT y, const wchar_t *text, const char *fnt, const char *opt); -void mgl_label_y(HMGL graph, HCDT y, const char *text, const char *fnt, const char *opt); -void mgl_labelw_y(HMGL graph, HCDT y, const wchar_t *text, const char *fnt, const char *opt); -/*****************************************************************************/ -/*****************************************************************************/ -void mgl_mark_(uintptr_t *gr, mreal *x,mreal *y,mreal *z,const char *mark,int); -void mgl_ball_(uintptr_t *gr, mreal *x,mreal *y,mreal *z); -/*****************************************************************************/ + +/// Draws the mark at position {x,y,z} +void mgl_mark(HMGL gr, double x,double y,double z,const char *mark); +void mgl_mark_(uintptr_t *gr, mreal *x, mreal *y, mreal *z,const char *mark,int); +/// Draws red point (ball) at position {x,y,z} +void mgl_ball(HMGL gr, double x,double y,double z); +void mgl_ball_(uintptr_t *gr, mreal *x, mreal *y, mreal *z); + +/// Draws the line between 2 points by specified pen +void mgl_line(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, const char *pen,int n); void mgl_line_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, const char *pen,int *n,int); +/// Draws the spline curve between 2 points by specified pen +void mgl_curve(HMGL gr, double x1, double y1, double z1, double dx1, double dy1, double dz1, double x2, double y2, double z2, double dx2, double dy2, double dz2, const char *pen,int n); void mgl_curve_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *dx1, mreal *dy1, mreal *dz1, mreal *x2, mreal *y2, mreal *z2, mreal *dx2, mreal *dy2, mreal *dz2, const char *pen,int *n, int l); -/*****************************************************************************/ + +/// Draws the 3d error box {ex,ey,ez} for point {x,y,z} +void mgl_error_box(HMGL gr, double x, double y, double z, double ex, double ey, double ez, const char *pen); void mgl_error_box_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal *ex, mreal *ey, mreal *ez, const char *pen, int); -/*****************************************************************************/ + +/// Draws the face between points with color stl (include interpolation up to 4 colors). +void mgl_face(HMGL gr, double x0, double y0, double z0, double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, const char *stl); void mgl_face_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *x3, mreal *y3, mreal *z3, const char *stl, int); +/// Draws the face in y-z plane at point p with color stl (include interpolation up to 4 colors). +void mgl_facex(HMGL gr, double x0, double y0, double z0, double wy, double wz, const char *stl, double dx, double dy); void mgl_facex_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *wy, mreal *wz, const char *stl, mreal *dx, mreal *dy, int l); +/// Draws the face in x-z plane at point p with color stl (include interpolation up to 4 colors). +void mgl_facey(HMGL gr, double x0, double y0, double z0, double wx, double wz, const char *stl, double dx, double dy); void mgl_facey_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *wx, mreal *wz, const char *stl, mreal *dx, mreal *dy, int l); +/// Draws the face in x-y plane at point p with color stl (include interpolation up to 4 colors). +void mgl_facez(HMGL gr, double x0, double y0, double z0, double wx, double wy, const char *stl, double dx, double dy); void mgl_facez_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *wx, mreal *wy, const char *stl, mreal *dx, mreal *dy, int l); -/*****************************************************************************/ + +/// Draws the sphere at point {x,y,z} with color stl and radius r +void mgl_sphere(HMGL gr, double x, double y, double z, double r, const char *stl); void mgl_sphere_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal *r, const char *stl, int); +/// Draws the drop at point {x,y,z} in direction {dx,dy,dz} with color stl and radius r +void mgl_drop(HMGL gr, double x, double y, double z, double dx, double dy, double dz, double r, const char *stl, double shift, double ap); void mgl_drop_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, mreal *shift, mreal *ap, int); +/// Draws the cone between points p1,p2 with radius r1,r2 and with style stl +void mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r1, double r2, const char *stl); void mgl_cone_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r1, mreal *r2, const char *stl, int); +/// Draws the ellipse between points p1,p2 with color stl and width r +void mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl); void mgl_ellipse_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, int); +/// Draws the rhomb between points p1,p2 with color stl and width r +void mgl_rhomb(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl); void mgl_rhomb_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, int); -/*****************************************************************************/ + +/// Draw cones from points {x,y,z} to axis plane +void mgl_cones_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void mgl_cones_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); +/// Draw cones from points {x,z} to axis plane +void mgl_cones_xz(HMGL graph, HCDT x, HCDT z, const char *pen, const char *opt); void mgl_coners_xz_(uintptr_t *graph, uintptr_t *x, uintptr_t *z, const char *pen, const char *opt,int,int); +/// Draw cones from points {x,z} with x in x-axis range to axis plane +void mgl_cones(HMGL graph, HCDT z, const char *pen, const char *opt); void mgl_cones_(uintptr_t *graph, uintptr_t *z, const char *pen, const char *opt,int,int); -/*****************************************************************************/ + +/// Plot dew drops for vector field {ax,ay} parametrically depended on coordinate {x,y} +void mgl_dew_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); +void mgl_dew_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); +/// Plot dew drops for vector field {ax,ay} +void mgl_dew_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *optl); +void mgl_dew_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int l); + +/// Print text in position {x,y,z} with specified font +/* NOTE: Function don't have options because it can be part of group.*/ +void mgl_puts(HMGL graph, double x, double y, double z,const char *text, const char *font, double size); void mgl_puts_(uintptr_t *graph, mreal *x, mreal *y, mreal *z,const char *text, const char *font, mreal *size, int, int); +void mgl_putsw(HMGL graph, double x, double y, double z,const wchar_t *text, const char *font, double size); + +/// Print text in position {x,y,z} along direction {dx,dy,dz} with specified font +/* NOTE: Function don't have options because it can be part of group.*/ +void mgl_puts_dir(HMGL graph, double x, double y, double z, double dx, double dy, double dz, const char *text, const char *font, double size); void mgl_puts_dir_(uintptr_t *graph, mreal *x, mreal *y, mreal *z, mreal *dx, mreal *dy, mreal *dz, const char *text, const char *font, mreal *size, int, int); -/*****************************************************************************/ +void mgl_putsw_dir(HMGL graph, double x, double y, double z, double dx, double dy, double dz, const wchar_t *text, const char *font, double size); + +/// Draw textual marks with size r at points {x,y,z} +void mgl_textmark_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *text, const char *fnt, const char *opt); void mgl_textmark_xyzr_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *text, const char *fnt, const char *opt,int,int,int); +void mgl_textmarkw_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const wchar_t *text, const char *fnt, const char *opt); +/// Draw textual marks with size r at points {x,y} +void mgl_textmark_xyr(HMGL graph, HCDT x, HCDT y, HCDT r, const char *text, const char *fnt, const char *opt); void mgl_textmark_xyr_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *r, const char *text, const char *fnt, const char *opt,int,int,int); +void mgl_textmarkw_xyr(HMGL graph, HCDT x, HCDT y, HCDT r, const wchar_t *text, const char *fnt, const char *opt); +/// Draw textual marks with size r at points {x,y} with x in x-axis range +void mgl_textmark_yr(HMGL graph, HCDT y, HCDT r, const char *text, const char *fnt, const char *opt); void mgl_textmark_yr_(uintptr_t *graph, uintptr_t *y, uintptr_t *r, const char *text, const char *fnt, const char *opt,int,int,int); +void mgl_textmarkw_yr(HMGL graph, HCDT y, HCDT r, const wchar_t *text, const char *fnt, const char *opt); +/// Draw textual marks with size r=1 at points {x,y} with x in x-axis range +void mgl_textmark(HMGL graph, HCDT y, const char *text, const char *fnt, const char *opt); +void mgl_textmarkw(HMGL graph, HCDT y, const wchar_t *text, const char *fnt, const char *opt); void mgl_textmark_(uintptr_t *graph, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int); -/*****************************************************************************/ + +/// Draw labels for points coordinate(s) at points {x,y,z} +void mgl_label_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *text, const char *fnt, const char *opt); void mgl_label_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *text, const char *fnt, const char *opt,int,int,int); +void mgl_labelw_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const wchar_t *text, const char *fnt, const char *opt); +/// Draw labels for points coordinate(s) at points {x,y} +void mgl_label_xy(HMGL graph, HCDT x, HCDT y, const char *text, const char *fnt, const char *opt); void mgl_label_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int); +void mgl_labelw_xy(HMGL graph, HCDT x, HCDT y, const wchar_t *text, const char *fnt, const char *opt); +/// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range +void mgl_label_y(HMGL graph, HCDT y, const char *text, const char *fnt, const char *opt); +void mgl_labelw_y(HMGL graph, HCDT y, const wchar_t *text, const char *fnt, const char *opt); void mgl_label_y_(uintptr_t *graph, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int); -/*****************************************************************************/ -void mgl_dew_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); -void mgl_dew_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int l); -/*****************************************************************************/ + +/// Draw table for values val along given direction with row labels text at position {x,y} +void mgl_table(HMGL gr, double x, double y, HCDT val, const char *text, const char *fnt, const char *opt); +void mgl_table_(uintptr_t *gr, mreal *x, mreal *y, uintptr_t *val, const char *text, const char *fnt, const char *opt,int,int,int); +void mgl_tablew(HMGL gr, double x, double y, HCDT val, const wchar_t *text, const char *fnt, const char *opt); + #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/qmathgl.h b/include/mgl2/qmathgl.h new file mode 100644 index 0000000..b4c4173 --- /dev/null +++ b/include/mgl2/qmathgl.h @@ -0,0 +1,206 @@ +/*************************************************************************** + * window.h is part of Math Graphic Library + * Copyright (C) 2007-2012 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _MGL_QMATHGL_H_ +#define _MGL_QMATHGL_H_ +//----------------------------------------------------------------------------- +#include +#include +#include +#include +//----------------------------------------------------------------------------- +class QTextEdit; +class QMenu; +class QMainWindow; +class QScrollArea; +class QSpinBox; +class QTimer; +class mglCanvas; +//----------------------------------------------------------------------------- +/// Class is Qt widget which display MathGL graphics +class QMathGL : public QWidget +{ + Q_OBJECT +public: + QString appName; ///< Application name for message boxes + bool autoResize; ///< Allow auto resizing (default is false) + bool enableMouse; ///< Enable mouse handlers + bool enableWheel; ///< Enable mouse wheel handlers + QString primitives; ///< Manual primitives, defined by user + + QMathGL(QWidget *parent = 0, Qt::WindowFlags f = 0); + ~QMathGL(); + double getRatio(); + void setPopup(QMenu *p) { popup = p; } ///< Set popup menu pointer + void setSize(int w, int h); ///< Set window/picture sizes + void setGraph(HMGL GR); ///< Set grapher object + inline void setGraph(mglGraph *GR) + { setGraph(GR->Self()); } + inline HMGL getGraph() { return (HMGL)gr; } + /// Set drawing functions and its parameter + inline void setDraw(int (*func)(mglBase *gr, void *par), void *par=0) + { draw_func = func; draw_par = par; emit usePrimChanged(draw_func || draw); } + inline void setDraw(mglDraw *dr) + { draw = dr; emit usePrimChanged(draw_func || draw); } + inline void setDraw(int (*draw)(mglGraph *gr)) + { setDraw(draw?mgl_draw_graph:0,(void*)draw); } + inline void zoomRegion(mreal xx1,mreal xx2,mreal yy1, mreal yy2) + { x1=xx1; y1=yy1; x2=xx2; y2=yy2; } + + int getPer() {return int(per);} ///< Get perspective value + int getPhi() {return int(phi);} ///< Get Phi-angle value + int getTet() {return int(tet);} ///< Get Theta-angle value + bool getAlpha() {return alpha;} ///< Get transparency state + bool getLight() {return light;} ///< Get lightning state + bool getZoom() {return zoom;} ///< Get mouse zooming state + bool getRotate(){return rotate;} ///< Get mouse rotation state + bool isActive(int xs,int ys); ///< Check if active point is pressed + +public slots: + void refresh(); + void update(); ///< Update picture + void copy(); ///< copy graphics to clipboard + void copyClickCoor(); ///< copy click coordinates to clipboard + void print(); ///< Print plot + void stop(); ///< Stop execution + void setPer(int p); ///< Set perspective value + void setPhi(int p); ///< Set Phi-angle value + void setTet(int t); ///< Set Theta-angle value + void setAlpha(bool a); ///< Switch on/off transparency + void setLight(bool l); ///< Switch on/off lightning + void setGrid(bool r); ///< Switch on/off grid drawing + void imgSize(int w, int h); ///< Set image size + + void setZoom(bool z); ///< Switch on/off mouse zooming + void setRotate(bool r); ///< Switch on/off mouse rotation + void zoomIn(); ///< Zoom in graphics + void zoomOut(); ///< Zoom out graphics + void restore(); ///< Restore zoom and rotation to default values + // void reload(); ///< Reload data and execute script + + void shiftLeft(); ///< Shift graphics to left direction + void shiftRight(); ///< Shift graphics to right direction + void shiftUp(); ///< Shift graphics to up direction + void shiftDown(); ///< Shift graphics to down direction + + void exportPNG(QString fname=""); ///< export to PNG file + void exportPNGs(QString fname=""); ///< export to PNG file (no transparency) + void exportGIF(QString fname=""); ///< export to GIF file + void exportJPG(QString fname=""); ///< export to JPEG file + void exportBPS(QString fname=""); ///< export to bitmap EPS file + void exportEPS(QString fname=""); ///< export to vector EPS file + void exportSVG(QString fname=""); ///< export to SVG file + void exportTEX(QString fname=""); ///< export to SVG file + void exportTGA(QString fname=""); ///< export to TGA file + + void exportXYZ(QString fname=""); ///< export to XYZ file + void exportOBJ(QString fname=""); ///< export to OBJ file + void exportSTL(QString fname=""); ///< export to STL file + void exportOFF(QString fname=""); ///< export to OFF file +// void exportX3D(QString fname=""); ///< export to XYZ file + void exportPRC(QString fname=""); ///< export to PRC file + void exportMGLD(QString fname=""); ///< export to MGLD file + void setMGLFont(QString path); ///< restore/load font for graphics + + void addMark(); ///< add marker into primitives + void addLine(); ///< add line into primitives + void addRect(); ///< add rectangle into primitives + void addCurve(); ///< add curve into primitives + void addRhomb(); ///< add rhombus into primitives + void addEllipse(); ///< add ellipse into primitives + void addText(QString txt=""); ///< add text into primitives + void setStyle(int id, QString stl);///< set style for primitive with id + + void adjust(); ///< Adjust plot size to fill entire window + void nextSlide(); ///< Show next slide + void prevSlide(); ///< Show previous slide + void animation(bool st=true); ///< Start animation + void about(); ///< Show about information + void aboutQt(); ///< Show information about Qt version + +signals: + void gridChanged(int); ///< Grid drawing changed (by mouse or by toolbar) + void phiChanged(int); ///< Phi angle changed (by mouse or by toolbar) + void tetChanged(int); ///< Tet angle changed (by mouse or by toolbar) + void perChanged(int); ///< Perspective changed (by mouse or by toolbar) + void alphaChanged(bool); ///< Transparency changed (by toolbar) + void lightChanged(bool); ///< Lighting changed (by toolbar) + void zoomChanged(bool); ///< Zooming changed (by toolbar) + void rotateChanged(bool); ///< Rotation changed (by toolbar) + void usePrimChanged(bool); ///< Use primitive changed (i.e. have or not drawing function) + void mouseClick(mreal,mreal,mreal); ///< Position of mouse click + void frameChanged(int); ///< Need another frame to show + void showWarn(QString); ///< Show warnings + void posChanged(QString message); ///< user click to show mouse position + void objChanged(int objId); ///< User double-click to select object/line + void refreshData(); + void doubleClick(int id); ///< Double mouse click by object with id + void askStyle(int id); ///< Update style + +protected: + void paintEvent(QPaintEvent *); + void resizeEvent(QResizeEvent *); + void mousePressEvent(QMouseEvent *); + void mouseReleaseEvent(QMouseEvent *); + void mouseMoveEvent(QMouseEvent *); + void wheelEvent(QWheelEvent *); + void mouseDoubleClickEvent(QMouseEvent *); + + mglCanvas *gr; ///< Built-in mglCanvasQT-er instance (used by default) + void *draw_par; ///< Parameters for drawing function mglCanvasWnd::DrawFunc. + /// Drawing function for window procedure. It should return the number of frames. + int (*draw_func)(mglBase *gr, void *par); + mglDraw *draw; ///< Class for drawing -- need to call directly due to inheritance mechanism + QString mousePos; ///< Last mouse position + QPixmap pic; ///< Pixmap for drawing (changed by update) + double tet, phi; ///< Rotation angles + double per; ///< Value of perspective ( must be in [0,1) ) + bool alpha; ///< Transparency state + bool light; ///< Lightning state + bool zoom; ///< Mouse zoom state + bool grid; ///< Grid drawing state + bool rotate; ///< Mouse rotation state + mreal x1,x2,y1,y2; ///< Zoom in region + mreal ax1,ax2,ay1,ay2; ///< Axis range zoom + bool showMessage; ///< Flag for showing messages (enabled by each execute()) + QMenu *popup; ///< Pointer to pop-up menu + QTimer *timer; ///< Timer for animation +private: + int x0, y0, xe, ye; ///< Temporary variables for mouse + uchar *grBuf; +}; +//----------------------------------------------------------------------------- +/// Class for drawing the MGL script +struct mglDrawScript : public mglDraw +{ + HMPR par; ///< Parser to be used + QString text; ///< Script to be drawn + long line; ///< Line which will be highlited + mglDrawScript(HMPR p):mglDraw() { par=p; line=-1; } + virtual ~mglDrawScript() {} + int Draw(mglGraph *gr) + { gr->Highlight(line+1); mgl_parse_textw(gr->Self(),par,text.toStdWString().c_str()); return 0; } +}; +//----------------------------------------------------------------------------- +/// Convert bitmap from mglCanvasWnd to QPixmap +void mglConvertFromGraph(QPixmap &pic, mglCanvas *gr, uchar **buf); +/// Make menu, toolbars and return popup menu for MainWindow +QMenu *mglMakeMenu(QMainWindow* Wnd, QMathGL* QMGL, QSpinBox*& tet, QSpinBox*& phi); +//----------------------------------------------------------------------------- +#endif diff --git a/include/mgl2/qt.h b/include/mgl2/qt.h index 59dc72b..a346191 100644 --- a/include/mgl2/qt.h +++ b/include/mgl2/qt.h @@ -1,6 +1,6 @@ /*************************************************************************** * window.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -19,206 +19,39 @@ ***************************************************************************/ #ifndef _MGL_QT_H_ #define _MGL_QT_H_ -/*****************************************************************************/ -#ifdef __cplusplus +#include //----------------------------------------------------------------------------- -#include "mgl2/canvas_wnd.h" -#if MGL_HAVE_QT -#include -#include +#ifdef __cplusplus +extern "C" { +#endif +/// Creates Qt window for plotting +HMGL mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); +uintptr_t mgl_create_graph_qt_(const char *title, int); +/// Run main Qt loop for event handling. +int mgl_qt_run(); +int mgl_qt_run_(); +#ifdef __cplusplus +} //----------------------------------------------------------------------------- -class QTextEdit; -class QMenu; -class QMainWindow; -class QScrollArea; -class QSpinBox; -class QTimer; +#include //----------------------------------------------------------------------------- -/// Class is Qt widget which display MathGL graphics -class QMathGL : public QWidget +/// Wrapper class for windows displaying graphics +class mglQT : public mglWnd { - Q_OBJECT public: - QString appName; ///< Application name for message boxes - bool autoResize; ///< Allow auto resizing (default is false) - - QMathGL(QWidget *parent = 0, Qt::WindowFlags f = 0); - ~QMathGL(); - double getRatio() { return double(gr->GetWidth())/gr->GetHeight(); }; - void setPopup(QMenu *p) { popup = p; }; ///< Set popup menu pointer - void setSize(int w, int h); ///< Set window/picture sizes - void setGraph(mglCanvas *GR) ///< Set grapher object - { if(gr) { delete gr; gr=GR; } } - inline void setGraph(mglGraph *GR) - { setGraph(dynamic_cast(GR->Self())); } - inline HMGL getGraph() { return gr; } - /// Set drawing functions and its parameter - inline void setDraw(int (*func)(mglBase *gr, void *par), void *par=0) - { draw_func = func; draw_par = par; } - inline void setDraw(mglDraw *dr) - { draw = dr; } - inline void setDraw(int (*draw)(mglGraph *gr)) - { setDraw(mgl_draw_graph,(void*)draw); } - inline void zoomRegion(mreal xx1,mreal xx2,mreal yy1, mreal yy2) - { x1=xx1; y1=yy1; x2=xx2; y2=yy2; } - - int getPer() {return int(per);}; ///< Get perspective value - int getPhi() {return int(phi);}; ///< Get Phi-angle value - int getTet() {return int(tet);}; ///< Get Theta-angle value - bool getAlpha() {return alpha;}; ///< Get transparency state - bool getLight() {return light;}; ///< Get lightning state - bool getZoom() {return zoom;}; ///< Get mouse zooming state - bool getRotate(){return rotate;}; ///< Get mouse rotation state - -public slots: - void refresh(); - void update(); ///< Update picture - void copy(); ///< copy graphics to clipboard - void copyClickCoor(); ///< copy click coordinates to clipboard - void print(); ///< Print plot - void stop(); ///< Stop execution - void setPer(int p); ///< Set perspective value - void setPhi(int p); ///< Set Phi-angle value - void setTet(int t); ///< Set Theta-angle value - void setAlpha(bool a); ///< Switch on/off transparency - void setLight(bool l); ///< Switch on/off lightning - void setGrid(bool r); ///< Switch on/off grid drawing - void imgSize(int w, int h); ///< Set image size - - void setZoom(bool z); ///< Switch on/off mouse zooming - void setRotate(bool r); ///< Switch on/off mouse rotation - void zoomIn(); ///< Zoom in graphics - void zoomOut(); ///< Zoom out graphics - void restore(); ///< Restore zoom and rotation to default values - // void reload(); ///< Reload data and execute script - void shiftLeft(); ///< Shift graphics to left direction - void shiftRight(); ///< Shift graphics to right direction - void shiftUp(); ///< Shift graphics to up direction - void shiftDown(); ///< Shift graphics to down direction - - void exportPNG(QString fname=""); ///< export to PNG file - void exportPNGs(QString fname=""); ///< export to PNG file (no transparency) - void exportGIF(QString fname=""); ///< export to GIF file - void exportJPG(QString fname=""); ///< export to JPEG file - void exportBPS(QString fname=""); ///< export to bitmap EPS file - void exportEPS(QString fname=""); ///< export to vector EPS file - void exportSVG(QString fname=""); ///< export to SVG file - void exportTEX(QString fname=""); ///< export to SVG file - void exportTGA(QString fname=""); ///< export to TGA file - - void exportXYZ(QString fname=""); ///< export to XYZ file - void exportOBJ(QString fname=""); ///< export to OBJ file - void exportSTL(QString fname=""); ///< export to STL file - void exportOFF(QString fname=""); ///< export to OFF file -// void exportX3D(QString fname=""); ///< export to XYZ file - void exportPRC(QString fname=""); ///< export to PRC file - void setMGLFont(QString path); ///< restore/load font for graphics - - void adjust(); ///< Adjust plot size to fill entire window - void nextSlide(); ///< Show next slide - void prevSlide(); ///< Show previous slide - void animation(bool st=true); ///< Start animation - void about(); ///< Show about information - void aboutQt(); ///< Show information about Qt version -signals: - void gridChanged(int); ///< Grid drawing changed (by mouse or by toolbar) - void phiChanged(int); ///< Phi angle changed (by mouse or by toolbar) - void tetChanged(int); ///< Tet angle changed (by mouse or by toolbar) - void perChanged(int); ///< Perspective changed (by mouse or by toolbar) - void alphaChanged(bool); ///< Transparency changed (by toolbar) - void lightChanged(bool); ///< Lighting changed (by toolbar) - void zoomChanged(bool); ///< Zooming changed (by toolbar) - void rotateChanged(bool); ///< Rotation changed (by toolbar) - void mouseClick(mreal,mreal,mreal); ///< Position of mouse click - void frameChanged(int); ///< Need another frame to show - void showWarn(QString); ///< Show warnings - void posChanged(QString message); ///< user click to show mouse position - void objChanged(int objId); ///< User double-click to select object/line - void refreshData(); - -protected: - void paintEvent(QPaintEvent *); - void resizeEvent(QResizeEvent *); - void mousePressEvent(QMouseEvent *); - void mouseReleaseEvent(QMouseEvent *); - void mouseMoveEvent(QMouseEvent *); - - mglCanvas *gr; ///< Built-in mglCanvasQT-er instance (used by default) - void *draw_par; ///< Parameters for drawing function mglCanvasWnd::DrawFunc. - /// Drawing function for window procedure. It should return the number of frames. - int (*draw_func)(mglBase *gr, void *par); - mglDraw *draw; ///< Class for drawing -- need to call directly due to inheritance mechanism - QString mousePos; ///< Last mouse position - QPixmap pic; ///< Pixmap for drawing (changed by update) - double tet, phi; ///< Rotation angles - double per; ///< Value of perspective ( must be in [0,1) ) - bool alpha; ///< Transparency state - bool light; ///< Lightning state - bool zoom; ///< Mouse zoom state - bool grid; ///< Grid drawing state - bool rotate; ///< Mouse rotation state - mreal x1,x2,y1,y2; ///< Zoom in region - bool showMessage; ///< Flag for showing messages (enabled by each execute()) - QMenu *popup; ///< Pointer to pop-up menu - QTimer *timer; ///< Timer for animation -private: - int x0, y0, xe, ye; ///< Temporary variables for mouse - uchar *grBuf; + mglQT(const char *title="MathGL") : mglWnd() + { gr = mgl_create_graph_qt(0,title,0,0); } + mglQT(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL, void (*load)(void *p)=0) : mglWnd() + { gr = mgl_create_graph_qt(draw,title,par,load); } + mglQT(int (*draw)(mglGraph *gr), const char *title="MathGL") : mglWnd() + { gr = mgl_create_graph_qt(draw?mgl_draw_graph:0,title,(void*)draw,0); } + mglQT(mglDraw *draw, const char *title="MathGL") : mglWnd() + { gr = mgl_create_graph_qt(draw?mgl_draw_class:0,title,draw,mgl_reload_class); + mgl_set_click_func(gr, mgl_click_class); } + int Run() { return mgl_qt_run(); } ///< Run main loop for event handling }; //----------------------------------------------------------------------------- -/// Base class for windows containing MathGL graphics -class mglCanvasQT : public mglCanvasWnd -{ -public: -using mglCanvasWnd::Window; - int sshow; ///< Current state of animation switch (toggle button) - QMathGL *QMGL; ///< Control which draw graphics - QMainWindow *Wnd; ///< Pointer to window - - mglCanvasQT(); - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ñëóæåáíûå ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - /// Create a window for plotting. Now implemeted only for GLUT. - void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p),const char *title, - void *par=NULL, void (*reload)(void *p)=NULL, bool maximize=false); - /// Switch on/off transparency (do not overwrite switches in user drawing function) - void ToggleAlpha(); - /// Switch on/off lighting (do not overwrite switches in user drawing function) - void ToggleLight(); - void ToggleRotate();///< Switch on/off rotation by mouse - void ToggleZoom(); ///< Switch on/off zooming by mouse - void ToggleNo(); ///< Switch off all zooming and rotation - void Update(); ///< Update picture by calling user drawing function - void Adjust(); ///< Adjust size of bitmap to window size - void GotoFrame(int d); ///< Show arbitrary frame (use relative step) - void Animation(); ///< Run slideshow (animation) of frames - -protected: - QScrollArea *scroll; ///< Scrolling area - QMenu *popup; ///< Popup menu - QSpinBox *tet, *phi; ///< Spin box for angles -}; -//----------------------------------------------------------------------------- -/// Class for drawing the MGL script -struct mglDrawScript : public mglDraw -{ - HMPR par; ///< Parser to be used - QString text; ///< Script to be drawn - long line; ///< Line which will be highlited - mglDrawScript(HMPR p) { par=p; line=-1; } - int Draw(mglGraph *gr) - { gr->Highlight(line+1); mgl_parse_text(gr->Self(),par,text.toAscii()); return 0; } -}; -//----------------------------------------------------------------------------- -/// Convert bitmap from mglCanvasWnd to QPixmap -void mglConvertFromGraph(QPixmap &pic, mglCanvas *gr, uchar **buf); -/// Make menu, toolbars and return popup menu for MainWindow -QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *tet, QSpinBox *phi); -//----------------------------------------------------------------------------- void mgl_ask_qt(const wchar_t *quest, wchar_t *res); //----------------------------------------------------------------------------- -#else -#error "Please enable Qt support" -#endif #endif #endif diff --git a/include/mgl2/surf.h b/include/mgl2/surf.h index 5565009..dd5e205 100644 --- a/include/mgl2/surf.h +++ b/include/mgl2/surf.h @@ -1,90 +1,130 @@ /*************************************************************************** * surf.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Library General Public License as * - * published by the Free Software Foundation; either version 3 of the * - * License, or (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU Library General Public * - * License along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ #ifndef _MGL_SURF_H_ -#define _MGL_SURF_H_ +#define _MGL_SURF_H_ #include "mgl2/base.h" -/*****************************************************************************/ -#ifdef __cplusplus +//----------------------------------------------------------------------------- +#ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ + +/// Draw surface by formula with x,y in axis range void mgl_fsurf(HMGL graph, const char *fz, const char *stl, const char *opt); +void mgl_fsurf_(uintptr_t *graph, const char *fz, const char *stl, const char *opt,int,int,int); +/// Draw surface by formulas parametrically depended on u,v in range [0,1] void mgl_fsurf_xyz(HMGL graph, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt); +void mgl_fsurf_xyz_(uintptr_t *graph, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt, int, int, int, int, int); + +/// Draw grid lines for density plot of 2d data specified parametrically void mgl_grid_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *stl, const char *opt); +void mgl_grid_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *stl, const char *opt,int,int); +/// Draw grid lines for density plot of 2d data void mgl_grid(HMGL graph, HCDT a,const char *stl, const char *opt); +void mgl_grid_(uintptr_t *graph, uintptr_t *a,const char *stl, const char *opt,int,int); + +/// Draw mesh lines for 2d data specified parametrically void mgl_mesh_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_mesh_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw mesh lines for 2d data void mgl_mesh(HMGL graph, HCDT z, const char *sch, const char *opt); +void mgl_mesh_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw mesh lines for 2d data specified parametrically void mgl_fall_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_fall_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw mesh lines for 2d data void mgl_fall(HMGL graph, HCDT z, const char *sch, const char *opt); +void mgl_fall_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw belts for 2d data specified parametrically void mgl_belt_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_belt_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw belts for 2d data void mgl_belt(HMGL graph, HCDT z, const char *sch, const char *opt); +void mgl_belt_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw surface for 2d data specified parametrically with color proportional to z void mgl_surf_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_surf_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw surface for 2d data with color proportional to z void mgl_surf(HMGL graph, HCDT z, const char *sch, const char *opt); +void mgl_surf_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw density plot for 2d data specified parametrically void mgl_dens_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_dens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw density plot for 2d data void mgl_dens(HMGL graph, HCDT z, const char *sch, const char *opt); +void mgl_dens_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw vertical boxes for 2d data specified parametrically void mgl_boxs_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_boxs_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/// Draw vertical boxes for 2d data void mgl_boxs(HMGL graph, HCDT z, const char *sch, const char *opt); +void mgl_boxs_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw vertical tiles for 2d data specified parametrically void mgl_tile_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); +void mgl_tile_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); +/// Draw vertical tiles for 2d data void mgl_tile(HMGL graph, HCDT z, const char *sch, const char *opt); -void mgl_tiles_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *sch, const char *opt); -void mgl_tiles(HMGL graph, HCDT z, HCDT r, const char *sch, const char *opt); -void mgl_surfc_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); -void mgl_surfc(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt); -void mgl_surfa_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); -void mgl_surfa(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt); -void mgl_stfa_xy(HMGL graph, HCDT x, HCDT y, HCDT re, HCDT im, int dn, const char *sch, const char *opt); -void mgl_stfa(HMGL graph, HCDT re, HCDT im, int dn, const char *sch, const char *opt); -void mgl_map_xy(HMGL graph, HCDT x, HCDT y, HCDT a, HCDT b, const char *sch, const char *opt); -void mgl_map(HMGL graph, HCDT a, HCDT b, const char *sch, const char *opt); -/*****************************************************************************/ -void mgl_fsurf_(uintptr_t *graph, const char *fz, const char *stl, const char *opt,int,int,int); -void mgl_fsurf_xyz_(uintptr_t *graph, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt, int, int, int, int, int); -void mgl_grid_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *stl, const char *opt,int,int); -void mgl_grid_(uintptr_t *graph, uintptr_t *a,const char *stl, const char *opt,int,int); -void mgl_mesh_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_mesh_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_fall_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_fall_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_belt_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_belt_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_surf_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_surf_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_dens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_dens_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_boxs_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_boxs_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); -void mgl_tile_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); void mgl_tile_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); + +/// Draw vertical tiles with variable size r for 2d data specified parametrically +void mgl_tiles_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *sch, const char *opt); void mgl_tiles_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); +/// Draw vertical tiles with variable size r for 2d data +void mgl_tiles(HMGL graph, HCDT z, HCDT r, const char *sch, const char *opt); void mgl_tiles_(uintptr_t *graph, uintptr_t *z, uintptr_t *r, const char *sch, const char *opt,int,int); + +/// Draw surface for 2d data specified parametrically with color proportional to c +void mgl_surfc_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void mgl_surfc_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); +/// Draw surface for 2d data with color proportional to c +void mgl_surfc(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt); void mgl_surfc_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); + +/// Draw surface for 2d data specified parametrically with alpha proportional to c +void mgl_surfa_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void mgl_surfa_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); +/// Draw surface for 2d data with alpha proportional to c +void mgl_surfa(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt); void mgl_surfa_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); + +/// Draw density plot for spectra-gramm specified parametrically +void mgl_stfa_xy(HMGL graph, HCDT x, HCDT y, HCDT re, HCDT im, int dn, const char *sch, const char *opt); void mgl_stfa_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *re, uintptr_t *im, int *dn, const char *sch, const char *opt,int, int); +/// Draw density plot for spectra-gramm +void mgl_stfa(HMGL graph, HCDT re, HCDT im, int dn, const char *sch, const char *opt); void mgl_stfa_(uintptr_t *graph, uintptr_t *re, uintptr_t *im, int *dn, const char *sch, const char *opt,int, int); + +/// Color map of matrix a to matrix b, both matrix can parametrically depend on coordinates +void mgl_map_xy(HMGL graph, HCDT x, HCDT y, HCDT a, HCDT b, const char *sch, const char *opt); void mgl_map_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int); +/// Color map of matrix a to matrix b +void mgl_map(HMGL graph, HCDT a, HCDT b, const char *sch, const char *opt); void mgl_map_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int); -/*****************************************************************************/ + #ifdef __cplusplus } -#endif -/*****************************************************************************/ -#endif +#endif +//----------------------------------------------------------------------------- +#endif diff --git a/include/mgl2/type.h b/include/mgl2/type.h index f296432..e486f6d 100644 --- a/include/mgl2/type.h +++ b/include/mgl2/type.h @@ -1,6 +1,6 @@ /*************************************************************************** * type.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -26,6 +26,7 @@ //----------------------------------------------------------------------------- const mreal Pi = M_PI; const mreal NaN = NAN; +const mreal mgl_min_a = 1./256; //----------------------------------------------------------------------------- #define MGL_SET_XYZ(p,xx,yy,zz) {p.x=(xx);p.y=(yy);p.z=(zz);} #define MGL_SET_XY(p,xx,yy) {p.x=(xx);p.y=(yy);p.z=0;} @@ -113,14 +114,16 @@ struct mglColor /// Set color from symbolic id void Set(char p, float bright=1); /// Copy color from other one - inline bool operator==(const mglColor &c) - { return (r==c.r && g==c.g && b==c.b && a==c.a); } - inline bool operator!=(const mglColor &c) - { return (r!=c.r || g!=c.g || b!=c.b || a!=c.a); } + inline bool operator==(const mglColor &c) const + { return !memcmp(this, &c, sizeof(mglColor)); } + inline bool operator!=(const mglColor &c) const + { return memcmp(this, &c, sizeof(mglColor)); } + inline bool operator<(const mglColor &c) const + { return memcmp(this, &c, sizeof(mglColor))<0; } // transparency still the same - inline void operator*=(float v) { r*=v; g*=v; b*=v; } - inline void operator+=(const mglColor &c) { r+=c.r; g+=c.g; b+=c.b; } - inline void operator-=(const mglColor &c) { r-=c.r; g-=c.g; b-=c.b; } + inline void operator*=(float v) { r*=v; g*=v; b*=v; a*=v; } + inline void operator+=(const mglColor &c) { r+=c.r; g+=c.g; b+=c.b; a+=c.a; } + inline void operator-=(const mglColor &c) { r-=c.r; g-=c.g; b-=c.b; a-=c.a; } }; #ifndef SWIG inline mglColor operator+(const mglColor &a, const mglColor &b) @@ -137,4 +140,4 @@ inline mglColor operator!(const mglColor &a) { return mglColor(1-a.r, 1-a.g, 1-a.b, a.a); } #endif //----------------------------------------------------------------------------- -#endif \ No newline at end of file +#endif diff --git a/include/mgl2/vect.h b/include/mgl2/vect.h index 566b4b0..2406c53 100644 --- a/include/mgl2/vect.h +++ b/include/mgl2/vect.h @@ -1,6 +1,6 @@ /*************************************************************************** * vect.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,69 +20,89 @@ #ifndef _MGL_VECT_H_ #define _MGL_VECT_H_ #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- +/// Plot vectors at position {x,y} along {ax,ay} with length/color proportional to |a| void mgl_traj_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); -void mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); - -void mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); -void mgl_vect_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt); -void mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); -void mgl_vect_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); - -void mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); -void mgl_flow_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt); -void mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); -void mgl_flow_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); - -void mgl_flowp_xy(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); -void mgl_flowp_2d(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT ax, HCDT ay, const char *sch, const char *opt); -void mgl_flowp_xyz(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); -void mgl_flowp_3d(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); - -void mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, mreal r0, const char *opt); -void mgl_pipe_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, mreal r0, const char *opt); -void mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, mreal r0, const char *opt); -void mgl_pipe_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, mreal r0, const char *opt); - -void mgl_grad_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ph, const char *sch, const char *opt); -void mgl_grad_xy(HMGL gr, HCDT x, HCDT y, HCDT ph, const char *sch, const char *opt); -void mgl_grad(HMGL gr, HCDT ph, const char *sch, const char *opt); - -/*****************************************************************************/ void mgl_traj_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); +/// Plot vectors at position {x,y,z} along {ax,ay,az} with length/color proportional to |a| +void mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void mgl_traj_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); +/// Plot vector field {ax,ay} parametrically depended on coordinate {x,y} with length/color proportional to |a| +void mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void mgl_vect_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); +/// Plot vector field {ax,ay} with length/color proportional to |a| +void mgl_vect_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt); void mgl_vect_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); +/// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a| +void mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void mgl_vect_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); +/// Plot vector field {ax,ay,az} with length/color proportional to |a| +void mgl_vect_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void mgl_vect_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); +/// Plot flows for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| +void mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void mgl_flow_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); +/// Plot flows for vector field {ax,ay} with color proportional to |a| +void mgl_flow_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt); void mgl_flow_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); +/// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| +void mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void mgl_flow_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); +/// Plot flows for vector field {ax,ay,az} with color proportional to |a| +void mgl_flow_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void mgl_flow_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); +/// Plot flow from point p for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| +void mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void mgl_flowp_xy_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int, int); +/// Plot flow from point p for vector field {ax,ay} with color proportional to |a| +void mgl_flowp_2d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, const char *sch, const char *opt); void mgl_flowp_2d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int, int); +/// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| +void mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void mgl_flowp_xyz_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int, int); +/// Plot flow from point p for vector field {ax,ay,az} with color proportional to |a| +void mgl_flowp_3d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void mgl_flowp_3d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); +/// Plot flow pipes for vector field {ax,ay} parametrically depended on coordinate {x,y} with color and radius proportional to |a| +void mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt); void mgl_pipe_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, mreal *r0, const char *opt,int,int); +/// Plot flow pipes for vector field {ax,ay} with color and radius proportional to |a| +void mgl_pipe_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt); void mgl_pipe_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, mreal *r0, const char *opt,int,int); +/// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a| +void mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt); void mgl_pipe_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *r0, const char *opt,int,int); +/// Plot flow pipes for vector field {ax,ay,az} with color and radius proportional to |a| +void mgl_pipe_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt); void mgl_pipe_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *r0, const char *opt,int,int); +/// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y,z} +void mgl_grad_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ph, const char *sch, const char *opt); void mgl_grad_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ph, const char *sch, const char *opt,int, int); +/// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y} +void mgl_grad_xy(HMGL gr, HCDT x, HCDT y, HCDT ph, const char *sch, const char *opt); void mgl_grad_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ph, const char *sch, const char *opt,int,int); +/// Plot flows for gradient of scalar field phi +void mgl_grad(HMGL gr, HCDT ph, const char *sch, const char *opt); void mgl_grad_(uintptr_t *gr, uintptr_t *ph, const char *sch, const char *opt,int,int); -/*****************************************************************************/ +/// Draw vector plot at slice for 3d data specified parametrically +void mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt); +void mgl_vect3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int,int); +/// Draw vector plot at slice for 3d data +void mgl_vect3(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt); +void mgl_vect3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int,int); +//----------------------------------------------------------------------------- #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/volume.h b/include/mgl2/volume.h index 9895446..f5871d2 100644 --- a/include/mgl2/volume.h +++ b/include/mgl2/volume.h @@ -1,6 +1,6 @@ /*************************************************************************** * volume.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,60 +20,66 @@ #ifndef _MGL_VOL_H_ #define _MGL_VOL_H_ #include "mgl2/base.h" -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif -/*****************************************************************************/ -void mgl_surf3_xyz_val(HMGL graph, mreal Val, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); -void mgl_surf3_val(HMGL graph, mreal Val, HCDT a, const char *stl, const char *opt); -void mgl_surf3_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); -void mgl_surf3(HMGL graph, HCDT a, const char *stl, const char *opt); - -void mgl_surf3a_xyz_val(HMGL graph, mreal Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); -void mgl_surf3a_val(HMGL graph, mreal Val, HCDT a, HCDT b, const char *stl, const char *opt); -void mgl_surf3a_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); -void mgl_surf3a(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt); - -void mgl_surf3c_xyz_val(HMGL graph, mreal Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); -void mgl_surf3c_val(HMGL graph, mreal Val, HCDT a, HCDT b, const char *stl, const char *opt); -void mgl_surf3c_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); -void mgl_surf3c(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt); - -// NOTE: now style '.' draws dots instead of faces -void mgl_cloud_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); -void mgl_cloud(HMGL graph, HCDT a, const char *stl, const char *opt); - -void mgl_beam_val(HMGL graph, mreal Val, HCDT tr, HCDT g1, HCDT g2, HCDT a, mreal r, const char *stl, int norm); -void mgl_beam(HMGL graph, HCDT tr, HCDT g1, HCDT g2, HCDT a, mreal r, const char *stl, int norm, int num); - -/*****************************************************************************/ +//----------------------------------------------------------------------------- +/// Draw isosurface for 3d data specified parametrically +void mgl_surf3_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); void mgl_surf3_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); +/// Draw isosurface for 3d data +void mgl_surf3_val(HMGL graph, double Val, HCDT a, const char *stl, const char *opt); void mgl_surf3_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, const char *stl, const char *opt,int,int); +/// Draw isosurfaces for 3d data specified parametrically +void mgl_surf3_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); void mgl_surf3_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); +/// Draw isosurfaces for 3d data +void mgl_surf3(HMGL graph, HCDT a, const char *stl, const char *opt); void mgl_surf3_(uintptr_t *graph, uintptr_t *a, const char *stl, const char *opt,int,int); +/// Draw isosurface for 3d data specified parametrically with alpha proportional to b +void mgl_surf3a_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void mgl_surf3a_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurface for 3d data with alpha proportional to b +void mgl_surf3a_val(HMGL graph, double Val, HCDT a, HCDT b, const char *stl, const char *opt); void mgl_surf3a_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurfaces for 3d data specified parametrically with alpha proportional to b +void mgl_surf3a_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void mgl_surf3a_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurfaces for 3d data with alpha proportional to b +void mgl_surf3a(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt); void mgl_surf3a_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurface for 3d data specified parametrically with color proportional to b +void mgl_surf3c_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void mgl_surf3c_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurface for 3d data with color proportional to b +void mgl_surf3c_val(HMGL graph, double Val, HCDT a, HCDT b, const char *stl, const char *opt); void mgl_surf3c_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurfaces for 3d data specified parametrically with color proportional to b +void mgl_surf3c_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void mgl_surf3c_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurfaces for 3d data with color proportional to b +void mgl_surf3c(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt); void mgl_surf3c_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); -void mgl_cloudp_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); -void mgl_cloudp_(uintptr_t *graph, uintptr_t *a, const char *stl, const char *opt,int,int); +/// Draw a semi-transparent cloud for 3d data specified parametrically +void mgl_cloud_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); void mgl_cloud_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); +/// Draw a semi-transparent cloud for 3d data +void mgl_cloud(HMGL graph, HCDT a, const char *stl, const char *opt); void mgl_cloud_(uintptr_t *graph, uintptr_t *a, const char *stl, const char *opt,int,int); +/// Draw isosurface for 3d beam in curvilinear coordinates +void mgl_beam_val(HMGL graph, double Val, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int norm); void mgl_beam_val_(uintptr_t *gr, mreal *val, uintptr_t *tr, uintptr_t *g1, uintptr_t *g2, uintptr_t *a, mreal *r, const char *sch, int *norm,int l); +/// Draw several isosurfaces for 3d beam in curvilinear coordinates +void mgl_beam(HMGL graph, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int norm, int num); void mgl_beam_(uintptr_t *gr, uintptr_t *tr, uintptr_t *g1, uintptr_t *g2, uintptr_t *a, mreal *r, const char *sch, int *norm, int *num,int l); - -/*****************************************************************************/ +//----------------------------------------------------------------------------- #ifdef __cplusplus } #endif -/*****************************************************************************/ +//----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/window.h b/include/mgl2/window.h index 21e44cc..7835efc 100644 --- a/include/mgl2/window.h +++ b/include/mgl2/window.h @@ -1,6 +1,6 @@ /*************************************************************************** * window.h is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -17,115 +17,46 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -//----------------------------------------------------------------------------- #ifndef _MGL_WINDOW_H_ #define _MGL_WINDOW_H_ -/*****************************************************************************/ -#include "mgl2/mgl.h" -//----------------------------------------------------------------------------- -/// Class for drawing in windows (like, mglCanvasFL, mglCanvasQT and so on) -/// Make inherited class and redefine Draw() function if you don't want to use function pointers. -struct mglDraw -{ - virtual int Draw(mglGraph *)=0; ///< Function for drawing - virtual void Reload() {} ///< Function for reloading data - virtual void Click() {} ///< Callback function on mouse click -#if MGL_HAVE_PTHREAD - pthread_t thr; - bool running; - mglDraw() { running=false; } - virtual void Calc() {} ///< Function for calculations - inline void Run() ///< Run calculations in other thread - { mgl_draw_thr(this); } -#endif -}; -//----------------------------------------------------------------------------- -extern "C" { -int mgl_draw_graph(HMGL gr, void *p); -// NOTE: mgl_draw_class() and mgl_draw_load() use mglWindow* only. Don't use it with inherited classes -int mgl_draw_class(HMGL gr, void *p); -void mgl_click_class(void *p); -void mgl_reload_class(void *p); -} -//----------------------------------------------------------------------------- -#if MGL_HAVE_QT -#define MGL_WND_KIND 1 -#else -#define MGL_WND_KIND 0 -#endif + +#include "mgl2/qt.h" +#include "mgl2/fltk.h" +#include "mgl2/wx.h" //----------------------------------------------------------------------------- -/// Wrapper class for windows displaying graphics -class mglWindow : public mglGraph +/// Wrapper class for all windows displaying graphics +class mglWindow : public mglWnd { -friend int mgl_draw_class(HMGL gr, void *p); -friend void mgl_click_class(void *p); -friend void mgl_reload_class(void *p); -protected: - mglDraw *dr; int wnd; ///< Type of window public: - mglWindow(const char *title="MathGL") : mglGraph(-1) - { wnd=0; dr=0; gr = mgl_create_graph_fltk(0,title,0,0); mgl_use_graph(gr,1); } - inline int RunThr() ///< Run main loop for event handling in separate thread (for FLTK only) - { return wnd==0 ? mgl_fltk_thr():0; } -#ifndef SWIG - mglWindow(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL, int kind=MGL_WND_KIND, void (*load)(void *p)=0) : mglGraph(-1) + mglWindow(const char *title="MathGL") : mglWnd() + { wnd=1; gr = mgl_create_graph_fltk(0,title,0,0); } + mglWindow(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL, int kind=0, void (*load)(void *p)=0) : mglWnd() { - wnd=kind; dr=0; + wnd=kind; if(wnd==1) gr = mgl_create_graph_qt(draw,title,par,load); + else if(wnd==2) gr = mgl_create_graph_wx(draw,title,par,load); else gr = mgl_create_graph_fltk(draw,title,par,load); - mgl_use_graph(gr,1); } - mglWindow(int (*draw)(mglGraph *gr), const char *title="MathGL", int kind=MGL_WND_KIND) : mglGraph(-1) + mglWindow(int (*draw)(mglGraph *gr), const char *title="MathGL", int kind=0) : mglWnd() { - wnd=kind; dr=0; - if(wnd==1) gr = mgl_create_graph_qt(mgl_draw_graph,title,(void*)draw,0); - else gr = mgl_create_graph_fltk(mgl_draw_graph,title,(void*)draw,0); - mgl_use_graph(gr,1); + wnd=kind; + if(wnd==1) gr = mgl_create_graph_qt(draw?mgl_draw_graph:0,title,(void*)draw,0); + else if(wnd==2) gr = mgl_create_graph_wx(draw?mgl_draw_graph:0,title,(void*)draw,0); + else gr = mgl_create_graph_fltk(draw?mgl_draw_graph:0,title,(void*)draw,0); } - mglWindow(mglDraw *draw, const char *title="MathGL", int kind=MGL_WND_KIND) : mglGraph(-1) + mglWindow(mglDraw *draw, const char *title="MathGL", int kind=0) : mglWnd() { - wnd=kind; dr=draw; - if(wnd==1) gr = mgl_create_graph_qt(mgl_draw_class,title,this,mgl_reload_class); - else gr = mgl_create_graph_fltk(mgl_draw_class,title,this,mgl_reload_class); - mgl_use_graph(gr,1); + wnd=kind; + if(wnd==1) gr = mgl_create_graph_qt(draw?mgl_draw_class:0,title,draw,mgl_reload_class); + else if(wnd==2) gr = mgl_create_graph_wx(draw?mgl_draw_class:0,title,draw,mgl_reload_class); + else gr = mgl_create_graph_fltk(draw?mgl_draw_class:0,title,draw,mgl_reload_class); mgl_set_click_func(gr, mgl_click_class); } - inline int Run() ///< Run main loop for event handling - { return (wnd==1)? mgl_qt_run() : mgl_fltk_run(); } -#endif - - inline void ToggleAlpha() ///< Switch on/off transparency (do not overwrite user settings) - { mgl_wnd_toggle_alpha(gr); } - inline void ToggleLight() ///< Switch on/off lighting (do not overwrite user settings) - { mgl_wnd_toggle_light(gr); } - inline void ToggleZoom() ///< Switch on/off zooming by mouse - { mgl_wnd_toggle_zoom(gr); } - inline void ToggleRotate() ///< Switch on/off rotation by mouse - { mgl_wnd_toggle_rotate(gr); } - inline void ToggleNo() ///< Switch off all zooming and rotation - { mgl_wnd_toggle_no(gr); } - inline void Update() ///< Update picture by calling user drawing function - { mgl_wnd_update(gr); } - inline void ReLoad() ///< Reload user data and update picture - { mgl_wnd_reload(gr); } - inline void Adjust() ///< Adjust size of bitmap to window size - { mgl_wnd_adjust(gr); } - inline void NextFrame() ///< Show next frame (if one) - { mgl_wnd_next_frame(gr); } - inline void PrevFrame() ///< Show previous frame (if one) - { mgl_wnd_prev_frame(gr); } - inline void Animation() ///< Run slideshow (animation) of frames - { mgl_wnd_animation(gr); } - void SetClickFunc(void (*func)(void *p)) - { if(!dr) mgl_set_click_func(gr,func); } - - inline void SetDelay(mreal dt) ///< Delay for animation in seconds - { mgl_wnd_set_delay(gr, dt); } - inline void Setup(bool clf_upd=true, bool showpos=false) - { mgl_setup_window(gr, clf_upd, showpos); } - inline mglPoint LastMousePos() ///< Last mouse position - { mreal x,y,z; mgl_get_last_mouse_pos(gr,&x,&y,&z); return mglPoint(x,y,z); } + /// Run main loop for event handling + int Run() { return wnd==0? mgl_fltk_run():(wnd==1?mgl_qt_run():mgl_wx_run()); } + /// Run main loop for event handling in separate thread (for FLTK only) + inline int RunThr() { return wnd==0 ? mgl_fltk_thr():0; } }; //----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/wnd.h b/include/mgl2/wnd.h new file mode 100644 index 0000000..b2efad4 --- /dev/null +++ b/include/mgl2/wnd.h @@ -0,0 +1,93 @@ +/*************************************************************************** + * wnd.h is part of Math Graphic Library + * Copyright (C) 2007-2012 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _MGL_WND_H_ +#define _MGL_WND_H_ + +#include "mgl2/mgl.h" +//----------------------------------------------------------------------------- +/// Class for drawing in windows (like, mglCanvasFL, mglCanvasQT and so on) +/// Make inherited class and redefine Draw() function if you don't want to use function pointers. +struct mglDraw +{ + virtual int Draw(mglGraph *)=0; ///< Function for drawing + virtual void Reload() {} ///< Function for reloading data + virtual void Click() {} ///< Callback function on mouse click + virtual ~mglDraw() {} +#if MGL_HAVE_PTHREAD + pthread_t thr; + bool running; + mglDraw() { running=false; } + virtual void Calc() {} ///< Function for calculations + inline void Run() ///< Run calculations in other thread + { mgl_draw_thr(this); } +#else + mglDraw(){} +#endif +}; +//----------------------------------------------------------------------------- +extern "C" { +int mgl_draw_graph(HMGL gr, void *p); +// NOTE: mgl_draw_class() and mgl_draw_load() use mglWindow* only. Don't use it with inherited classes +int mgl_draw_class(HMGL gr, void *p); +void mgl_click_class(void *p); +void mgl_reload_class(void *p); +} +//----------------------------------------------------------------------------- +/// Abstract class for windows displaying graphics +class mglWnd : public mglGraph +{ +public: + mglWnd() : mglGraph(-1) {} + virtual int Run()=0; ///< Run main loop for event handling + + inline void ToggleAlpha() ///< Switch on/off transparency (do not overwrite user settings) + { mgl_wnd_toggle_alpha(gr); } + inline void ToggleLight() ///< Switch on/off lighting (do not overwrite user settings) + { mgl_wnd_toggle_light(gr); } + inline void ToggleZoom() ///< Switch on/off zooming by mouse + { mgl_wnd_toggle_zoom(gr); } + inline void ToggleRotate() ///< Switch on/off rotation by mouse + { mgl_wnd_toggle_rotate(gr); } + inline void ToggleNo() ///< Switch off all zooming and rotation + { mgl_wnd_toggle_no(gr); } + inline void Update() ///< Update picture by calling user drawing function + { mgl_wnd_update(gr); } + inline void ReLoad() ///< Reload user data and update picture + { mgl_wnd_reload(gr); } + inline void Adjust() ///< Adjust size of bitmap to window size + { mgl_wnd_adjust(gr); } + inline void NextFrame() ///< Show next frame (if one) + { mgl_wnd_next_frame(gr); } + inline void PrevFrame() ///< Show previous frame (if one) + { mgl_wnd_prev_frame(gr); } + inline void Animation() ///< Run slideshow (animation) of frames + { mgl_wnd_animation(gr); } + void SetClickFunc(void (*func)(void *p)) ///< Callback function for mouse click + { mgl_set_click_func(gr,func); } + + inline void SetDelay(double dt) ///< Delay for animation in seconds + { mgl_wnd_set_delay(gr, dt); } + inline void Setup(bool clf_upd=true, bool showpos=false) + { mgl_setup_window(gr, clf_upd, showpos); } + inline mglPoint LastMousePos() ///< Last mouse position + { double x,y,z; mgl_get_last_mouse_pos(gr,&x,&y,&z); return mglPoint(x,y,z); } +}; +//----------------------------------------------------------------------------- +#endif diff --git a/include/mgl2/wx.h b/include/mgl2/wx.h new file mode 100644 index 0000000..1f51ea7 --- /dev/null +++ b/include/mgl2/wx.h @@ -0,0 +1,170 @@ +/*************************************************************************** + * wx.h.cpp is part of Math Graphic Library + * Copyright (C) 2007-2012 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef MGL_WX_H +#define MGL_WX_H +//----------------------------------------------------------------------------- +#include +//----------------------------------------------------------------------------- +#ifdef __cplusplus +extern "C" { +#endif +/// Creates WX window for plotting +HMGL mgl_create_graph_wx(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); +uintptr_t mgl_create_graph_wx_(const char *title, int); +/// Run main WX loop for event handling. +int mgl_wx_run(); +int mgl_wx_run_(); +#ifdef __cplusplus +} +//----------------------------------------------------------------------------- +#include +//----------------------------------------------------------------------------- +/// Wrapper class for windows displaying graphics +class mglWX : public mglWnd +{ +public: + mglWX(const char *title="MathGL") : mglWnd() + { gr = mgl_create_graph_wx(0,title,0,0); } + mglWX(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL, void (*load)(void *p)=0) : mglWnd() + { gr = mgl_create_graph_wx(draw,title,par,load); } + mglWX(int (*draw)(mglGraph *gr), const char *title="MathGL") : mglWnd() + { gr = mgl_create_graph_wx(draw?mgl_draw_graph:0,title,(void*)draw,0); } + mglWX(mglDraw *draw, const char *title="MathGL") : mglWnd() + { gr = mgl_create_graph_wx(draw?mgl_draw_class:0,title,draw,mgl_reload_class); + mgl_set_click_func(gr, mgl_click_class); } + int Run() { return mgl_wx_run(); } ///< Run main loop for event handling + +}; +//----------------------------------------------------------------------------- +#include +#include +#include +#include +class mglCanvas; +//----------------------------------------------------------------------------- +/// Class is Wx widget which display MathGL graphics +class wxMathGL : public wxWindow +{ +public: + wxString appName; ///< Application name for message boxes + bool AutoResize; ///< Allow auto resizing (default is false) + + wxMathGL(wxWindow *parent, wxWindowID id=-1, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=0, const wxString& name=wxPanelNameStr); + virtual ~wxMathGL(); + double GetRatio(); + void SetPopup(wxMenu *p) { popup = p; }; ///< Set popup menu pointer + void SetSize(int w, int h); ///< Set window/picture sizes + void SetGraph(HMGL gr); ///< Set grapher object + inline void SetGraph(mglGraph *GR) + { SetGraph(GR->Self()); } + inline HMGL GetGraph() { return (HMGL)gr; } + + /// Set drawing functions and its parameter + inline void SetDraw(int (*func)(mglBase *gr, void *par), void *par=0) + { draw_func = func; draw_par = par; } + inline void SetDraw(mglDraw *dr) + { draw_cl = dr; } + inline void SetDraw(int (*draw)(mglGraph *gr)) + { SetDraw(draw?mgl_draw_graph:0,(void*)draw); } + inline void ZoomRegion(mreal xx1,mreal xx2,mreal yy1, mreal yy2) + { x1=xx1; y1=yy1; x2=xx2; y2=yy2; } + + int GetPer() {return per;}; ///< Get perspective value + int GetPhi() {return phi;}; ///< Get Phi-angle value + int GetTet() {return tet;}; ///< Get Theta-angle value + bool GetAlpha() {return alpha;}; ///< Get transparency state + bool GetLight() {return light;}; ///< Get lightning state + bool GetZoom() {return zoom;}; ///< Get mouse zooming state + bool GetRotate() {return rotate;}; ///< Get mouse rotation state + + void Repaint(); + void Update(); ///< Update picture + void Copy(); ///< copy graphics to clipboard + void Print(); ///< Print plot +// void Stop(); ///< Stop execution + void SetPer(int p); ///< Set perspective value + void SetPhi(int p); ///< Set Phi-angle value + void SetTet(int t); ///< Set Theta-angle value + void SetAlpha(bool a); ///< Switch on/off transparency + void SetLight(bool l); ///< Switch on/off lightning + void SetZoom(bool z); ///< Switch on/off mouse zooming + void SetRotate(bool r); ///< Switch on/off mouse rotation + void ZoomIn(); ///< Zoom in graphics + void ZoomOut(); ///< Zoom out graphics + void Restore(); ///< Restore zoom and rotation to default values +// void Reload(); ///< Reload data and execute script + void ShiftLeft(); ///< Shift graphics to left direction + void ShiftRight(); ///< Shift graphics to right direction + void ShiftUp(); ///< Shift graphics to up direction + void ShiftDown(); ///< Shift graphics to down direction + void ExportPNG(wxString fname=L""); ///< export to PNG file + void ExportPNGs(wxString fname=L""); ///< export to PNG file (no transparency) + void ExportJPG(wxString fname=L""); ///< export to JPEG file + void ExportBPS(wxString fname=L""); ///< export to bitmap EPS file + void ExportEPS(wxString fname=L""); ///< export to vector EPS file + void ExportSVG(wxString fname=L""); ///< export to SVG file + + void Adjust(); ///< Adjust plot size to fill entire window + void NextSlide(); ///< Show next slide + void PrevSlide(); ///< Show previous slide + void Animation(bool st=true); ///< Start animation + + void About(); ///< Show about information + void AboutQt(); ///< Show information about Qt version + +protected: + void OnPaint(wxPaintEvent& event); + void OnSize(wxSizeEvent& event); + void OnNextSlide(wxTimerEvent& evt); ///< Show next slide + void OnMouseLeftDown(wxMouseEvent &ev); + void OnMouseDown(wxMouseEvent &ev); + void OnMouseLeftUp(wxMouseEvent &ev); + void OnMouseRightUp(wxMouseEvent &ev); + void OnMouseMove(wxMouseEvent &ev); +// void MousePressEvent(QMouseEvent *); +// void MouseReleaseEvent(QMouseEvent *); +// void MouseMoveEvent(QMouseEvent *); + + mglCanvas *gr; ///< pointer to grapher + void *draw_par; ///< Parameters for drawing function mglCanvasWnd::DrawFunc. + /// Drawing function for window procedure. It should return the number of frames. + int (*draw_func)(mglBase *gr, void *par); + mglDraw *draw_cl; + + wxString MousePos; ///< Last mouse position + wxBitmap pic; ///< Pixmap for drawing (changed by update) + double tet, phi; ///< Rotation angles + double per; ///< Value of perspective ( must be in [0,1) ) + bool alpha; ///< Transparency state + bool light; ///< Lightning state + bool zoom; ///< Mouse zoom state + bool rotate; ///< Mouse rotation state + mreal x1,x2,y1,y2; ///< Zoom in region + bool showMessage; ///< Flag for showing messages (enabled by each execute()) + wxMenu *popup; ///< Pointer to pop-up menu + wxTimer *timer; ///< Timer for animation + DECLARE_EVENT_TABLE() +private: + int x0, y0, xe, ye; ///< Temporary variables for mouse + unsigned char *grBuf; +}; +//----------------------------------------------------------------------------- +#endif +#endif diff --git a/include/xpm/axis_sh.xpm b/include/xpm/axis_sh.xpm new file mode 100644 index 0000000..eab287c --- /dev/null +++ b/include/xpm/axis_sh.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static char * axis_sh_xpm[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #FF0000", +" ", +" . ", +". . + ", +" . +++ ", +" . + ", +". . + + + ", +" . +++++++++ ", +" . + + + ", +". . + ", +" . +++ ", +" . + ", +". . ", +" . ", +" ............. ", +". ", +" . . . . . "}; diff --git a/include/xpm/box.xpm b/include/xpm/box.xpm new file mode 100644 index 0000000..e2d9d12 --- /dev/null +++ b/include/xpm/box.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static char * box_xpm[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #666666", +" ", +" ......... ", +" .+ .. ", +" . + . . ", +" . + . . ", +" . + . . ", +" ......... . ", +" . + . . ", +" . + . . ", +" . +++.++++. ", +" . + . . ", +" . + . . ", +" . + . . ", +" .+ .. ", +" ......... ", +" "}; diff --git a/include/xpm/curve.xpm b/include/xpm/curve.xpm new file mode 100644 index 0000000..88e37e3 --- /dev/null +++ b/include/xpm/curve.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * curve_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" .", +" .", +" . ", +" . ", +" . ", +" . ", +" .. ", +" .. ", +" .. ", +" .. ", +" . ", +" . ", +" . ", +" . ", +". ", +". "}; diff --git a/include/xpm/hist.xpm b/include/xpm/hist.xpm new file mode 100644 index 0000000..5c7eb5c --- /dev/null +++ b/include/xpm/hist.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * hist_xpm[] = { +"16 16 2 1", +" c None", +". c #0000FF", +" ", +" ", +" ... ", +" ... ", +" ... ", +" ... ... ", +" ... ... ", +" ... ... ", +" ... ... ", +" ... ... ", +" ... ... ... ", +" ... ... ... ", +"... ... ... ... ", +"... ... ... ... ", +"... ... ... ... ", +" "}; diff --git a/include/xpm/line.xpm b/include/xpm/line.xpm new file mode 100644 index 0000000..aff1af3 --- /dev/null +++ b/include/xpm/line.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * line_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" .", +" . ", +" . ", +" . ", +" . ", +" . ", +" . ", +" . ", +" . ", +" . ", +" . ", +" . ", +" . ", +" . ", +" . ", +". "}; diff --git a/include/xpm/oper_dir.xpm b/include/xpm/oper_dir.xpm new file mode 100644 index 0000000..f6f7b8a --- /dev/null +++ b/include/xpm/oper_dir.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * oper_dir_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" . ", +" . . ", +" . . ", +" . .... . ", +" . . . . ", +" . .... . ", +" . ", +" ..... ", +" . . ", +" .. . ", +" . . . ", +" . . ", +" .... . . ", +". .. . ..... ", +". . . ", +" .. . . "}; diff --git a/include/xpm/oper_of.xpm b/include/xpm/oper_of.xpm new file mode 100644 index 0000000..c22a9ba --- /dev/null +++ b/include/xpm/oper_of.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char * oper_of_xpm[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #FF0000", +" . ++ ", +" . . ++ ", +" . . ++++++", +" . .... .++++++", +" . . . . ++ ", +" . .... . ++ ", +" . ", +" ..... ", +" . . ", +" .. . ", +" . . . ", +" . . ", +" .... . . ", +". .. . ..... ", +". . . ", +" .. . . "}; diff --git a/include/xpm/text.xpm b/include/xpm/text.xpm new file mode 100644 index 0000000..56317c0 --- /dev/null +++ b/include/xpm/text.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * text_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ............ ", +" ............ ", +" . .. . ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" .... ", +" "}; diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index cfdc3a7..a9205ba 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -1,50 +1,32 @@ -set(src_dep -${CMAKE_BINARY_DIR}/lang/mgl.i -${CMAKE_BINARY_DIR}/lang/numpy.i -) set(src_imp_dep -${CMAKE_SOURCE_DIR}/include/mgl2/type.h -${CMAKE_SOURCE_DIR}/include/mgl2/data.h -${CMAKE_SOURCE_DIR}/include/mgl2/mgl.h -${CMAKE_SOURCE_DIR}/include/mgl2/window.h +../include/mgl2/type.h +../include/mgl2/data.h +../include/mgl2/mgl.h ) -configure_file(${MathGL_SOURCE_DIR}/lang/mgl.i.in ${MathGL_BINARY_DIR}/lang/mgl.i COPYONLY) -configure_file(${MathGL_SOURCE_DIR}/lang/numpy.i.in ${MathGL_BINARY_DIR}/lang/numpy.i COPYONLY) -file(TO_NATIVE_PATH ${MathGL_BINARY_DIR}/lang/mgl.i MGL_I) -file(TO_NATIVE_PATH ${MathGL_SOURCE_DIR}/include SRC_INC) -file(TO_NATIVE_PATH ${MathGL_BINARY_DIR}/include BIN_INC) +set(mgl_clean_files "") -file(TO_NATIVE_PATH ${MathGL_BINARY_DIR}/src MGL_LINK_DIR) -file(TO_NATIVE_PATH ${MathGL_BINARY_DIR}/widgets MGL_WND_LINK_DIR) +SET_SOURCE_FILES_PROPERTIES(mathgl.i numpy.i PROPERTIES CPLUSPLUS ON) -get_directory_property(DEF_LIST COMPILE_DEFINITIONS) -foreach(def_i ${DEF_LIST}) - if(MGL_DEF) - set(MGL_DEF ${MGL_DEF} -D${def_i}) - else(MGL_DEF) - set(MGL_DEF -D${def_i}) - endif(MGL_DEF) -endforeach() -SET(dep_libs mgl-wnd mgl) if(MGL_HAVE_PYTHON) - configure_file(${MathGL_SOURCE_DIR}/lang/setup.py.in ${MathGL_BINARY_DIR}/lang/setup.py) - add_custom_command(OUTPUT _mathgl.so mathgl.py - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/lang/setup.py - build build_ext - --include-dirs='${BIN_INC}:${SRC_INC}' -# --library-dirs='$:$' #commented out for compatibilty reason with old cmake - --library-dirs='${MGL_LINK_DIR}:${MGL_WND_LINK_DIR}' -# --libraries='mgl-wnd' - --swig ${SWIG_EXECUTABLE} - --swig-opts='-c++ -threads -I${BIN_INC} -I${SRC_INC} ${MGL_DEF}' - DEPENDS ${dep_libs} ${src_dep} - IMPLICIT_DEPENDS CXX ${src_imp_dep} + include_directories(${PYTHON_INCLUDE_DIR}) + execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(prefix='${CMAKE_INSTALL_PREFIX}')" + OUTPUT_VARIABLE MGL_PYTHON_SITE_PACKAGES + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(SWIG_MODULE_mathgl_EXTRA_DEPS numpy.i ${src_imp_dep}) + SWIG_ADD_MODULE(mathgl python mathgl.i) + SWIG_LINK_LIBRARIES(mathgl mgl ${PYTHON_LIBRARIES}) + add_custom_command(OUTPUT mathgl.pyc + COMMAND ${PYTHON_EXECUTABLE} -c \"from py_compile import compile\; compile('mathgl.py')\" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang + DEPENDS _mathgl ) - add_custom_target(mgl_python_module ALL DEPENDS _mathgl.so mathgl.py) - install(CODE "execute_process(COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/lang/setup.py install --prefix=${CMAKE_INSTALL_PREFIX} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang )") - set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "mgl_wrap.cpp;build;mathgl.pyc") + add_custom_target(mgl_python_module ALL DEPENDS _mathgl mathgl.pyc) + + install(FILES ${MathGL_BINARY_DIR}/lang/mathgl.py ${MathGL_BINARY_DIR}/lang/mathgl.pyc DESTINATION ${MGL_PYTHON_SITE_PACKAGES}) + install (TARGETS _mathgl LIBRARY DESTINATION ${MGL_PYTHON_SITE_PACKAGES}) + set(mgl_clean_files ${mgl_clean_files} mathgl.py) endif(MGL_HAVE_PYTHON) if(MGL_HAVE_OCTAVE) @@ -60,51 +42,32 @@ if(MGL_HAVE_OCTAVE) message(STATUS "${oct_prog} ${oct_host} ${oct_api}") set(oct_arch ${oct_host}-${oct_api}) set(pkg_name mathgl) - file(MAKE_DIRECTORY ${MathGL_BINARY_DIR}/lang/${pkg_name}/inst/${oct_arch}) + set(mgl_pkg_dir ${MathGL_BINARY_DIR}/lang/${pkg_name}/inst/${oct_arch}) - configure_file(${MathGL_SOURCE_DIR}/COPYING ${MathGL_BINARY_DIR}/lang/${pkg_name} COPYONLY) - configure_file(${MathGL_SOURCE_DIR}/lang/DESCRIPTION ${MathGL_BINARY_DIR}/lang/${pkg_name} COPYONLY) - configure_file(${MathGL_SOURCE_DIR}/lang/INDEX ${MathGL_BINARY_DIR}/lang/${pkg_name} COPYONLY) - configure_file(${MathGL_SOURCE_DIR}/lang/PKG_ADD_template ${MathGL_BINARY_DIR}/lang/${pkg_name}/PKG_ADD COPYONLY) - - add_custom_command(OUTPUT mgl_octave.cpp - COMMAND ${SWIG_EXECUTABLE} -octave -c++ ${MGL_DEF} - -I${BIN_INC} -I${SRC_INC} - -o mgl_octave.cpp ${MGL_I} - DEPENDS ${src_dep} - IMPLICIT_DEPENDS CXX ${src_imp_dep} - ) -# -L$ #commented out for compatibilty reason with old cmake -# -L$ #commented out for compatibilty reason with old cmake - add_custom_command(OUTPUT mgl_octave.o - COMMAND ${oct_mk} -c ${MGL_DEF} - -I${oct_inc} -I${BIN_INC} -I${SRC_INC} - -o mgl_octave.o mgl_octave.cpp - DEPENDS ${src_dep} mgl_octave.cpp - IMPLICIT_DEPENDS CXX ${src_imp_dep} - ) - add_custom_command(OUTPUT ${pkg_name}/inst/${oct_arch}/mathgl.oct - COMMAND ${oct_mk} - -L${MGL_LINK_DIR} - -L${MGL_WND_LINK_DIR} - -lmgl-wnd -lmgl - -o ${pkg_name}/inst/${oct_arch}/mathgl.oct mgl_octave.o - DEPENDS ${dep_libs} mgl_octave.o - ) -# add_custom_command(OUTPUT ${pkg_name}/inst/${oct_arch}/mathgl.oct -# COMMAND ${oct_mk} ${MGL_DEF} -# -I${oct_inc} -I${BIN_INC} -I${SRC_INC} -# -L${MGL_LINK_DIR} -# -L${MGL_WND_LINK_DIR} -# -lmgl-wnd -lmgl -# -o ${pkg_name}/inst/${oct_arch}/mathgl.oct mgl_octave.cpp -# DEPENDS ${dep_libs} ${src_dep} mgl_octave.cpp -# ) + include_directories(${oct_inc} ${oct_inc}/..) + SET(SWIG_MODULE_mgl-oct_EXTRA_DEPS numpy.i ${src_imp_dep}) + SWIG_ADD_MODULE(mgl-oct octave mathgl.i) + SWIG_LINK_LIBRARIES(mgl-oct mgl) + set_target_properties(mgl-oct PROPERTIES OUTPUT_NAME mathgl PREFIX "" SUFFIX ".oct") add_custom_command(OUTPUT mathgl.tar.gz + COMMAND ${CMAKE_COMMAND} -E make_directory ${mgl_pkg_dir} + COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/COPYING ${MathGL_BINARY_DIR}/lang/${pkg_name} + COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/lang/DESCRIPTION ${MathGL_BINARY_DIR}/lang/${pkg_name} + COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/lang/INDEX ${MathGL_BINARY_DIR}/lang/${pkg_name} + COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/lang/PKG_ADD_template ${MathGL_BINARY_DIR}/lang/${pkg_name} + COMMAND ${CMAKE_COMMAND} -E copy $ ${mgl_pkg_dir} COMMAND ${oct_tar} cpzvf mathgl.tar.gz ${pkg_name} - DEPENDS ${pkg_name}/inst/${oct_arch}/mathgl.oct + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang + DEPENDS mgl-oct ) add_custom_target(mgl_octave_module ALL DEPENDS mathgl.tar.gz) - install(CODE "execute_process(COMMAND ${oct_exec} ${CMAKE_SOURCE_DIR}/lang/install.m WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang )") + install(FILES ${CMAKE_BINARY_DIR}/lang/mathgl.tar.gz DESTINATION ${MGL_DATA_PATH}) + if(enable-octave-install) + install(CODE "execute_process( + COMMAND ${oct_exec} -q --eval \"pkg install mathgl.tar.gz\" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang )") + endif(enable-octave-install) + set(mgl_clean_files ${mgl_clean_files} mathgl) endif(MGL_HAVE_OCTAVE) +set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mgl_clean_files}") diff --git a/lang/install.m b/lang/install.m deleted file mode 100644 index b95a5ad..0000000 --- a/lang/install.m +++ /dev/null @@ -1 +0,0 @@ -pkg install mathgl.tar.gz diff --git a/lang/mgl.i.in b/lang/mathgl.i similarity index 98% rename from lang/mgl.i.in rename to lang/mathgl.i index d675422..7069cfd 100644 --- a/lang/mgl.i.in +++ b/lang/mathgl.i @@ -41,7 +41,7 @@ #include "mgl2/type.h" #include "mgl2/data.h" #include "mgl2/mgl.h" -#include "mgl2/window.h" +//#include "mgl2/window.h" %} #if MGL_USE_DOUBLE @@ -90,7 +90,7 @@ import_array(); %include "mgl2/type.h" %include "mgl2/data.h" %include "mgl2/mgl.h" -%include "mgl2/window.h" +//%include "mgl2/window.h" %extend mglData { float __getitem__( int i) { return self->GetVal(i); }; diff --git a/lang/numpy.i.in b/lang/numpy.i similarity index 100% rename from lang/numpy.i.in rename to lang/numpy.i diff --git a/lang/setup.py.in b/lang/setup.py.in deleted file mode 100644 index 05edce4..0000000 --- a/lang/setup.py.in +++ /dev/null @@ -1,43 +0,0 @@ -from distutils.core import setup, Extension -import os - -mgl_i="${MGL_I}" -dep_libs="${dep_libs}" -d_l=[] -for i in dep_libs.split(';'): - d_l.append(i) - -def_list="${DEF_LIST}" -defs=[] -for i in def_list.split(';'): - k=i.split('=') - if len(k)==1: defs.append((i,None)) - else: defs.append((k[0],k[1])) -mgl_module = Extension('_mathgl', - sources=[mgl_i], - define_macros=defs, - libraries=d_l -) - -setup ( - name = "mathgl", - version = "2.0", - maintainer="Dmitry Kulagin", - maintainer_email="dik@ufp.appl.sci-nnov.ru", - author="Alexey Balakin", - author_email= "mathgl.ablakin@gmail.com", - license="Same terms as MathGL", - platforms = ["any"], - url = "http://mathgl.sf.net", - description = "Python interface for MathGL", - long_description = "MathGL is a library for the plotting of the data \ - MathGL is a free library of fast C++ routines for the plotting \ - of the data varied in one or more dimensions. It uses OpenGL \ - (www.opengl.org) for the plotting. Also there is a simple window \ - interface based on GLUT. This provides high compatibility with \ - any operating system (really any which has OpenGL-like libraries). \ - Python interface for MathGL", - package_dir = {"": ""}, - py_modules = ["mathgl"], - ext_modules = [mgl_module] - ) diff --git a/mgllab/CMakeLists.txt b/mgllab/CMakeLists.txt deleted file mode 100644 index 106ff36..0000000 --- a/mgllab/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -if(MGL_HAVE_FLTK) - include_directories(${FLTK_INCLUDE_DIR}) - set(mgl_lab_src animate.cpp editor.cpp help.cpp mathgl.cpp setup.cpp write.cpp data.cpp grid.cpp main.cpp option.cpp table.cpp) - add_executable(mgllab ${mgl_lab_src}) - target_link_libraries(mgllab mgl mgl-wnd ${FLTK_LIBRARIES}) - install( - TARGETS mgllab - RUNTIME DESTINATION bin ) -endif(MGL_HAVE_FLTK) - diff --git a/mgllab/animate.cpp b/mgllab/animate.cpp deleted file mode 100644 index 0571d5f..0000000 --- a/mgllab/animate.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/* animate.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -struct ArgumentDlg -{ -public: - Fl_Window* wnd; - int OK; - Fl_Input *a[10]; - - ArgumentDlg() { memset(this,0,sizeof(ArgumentDlg)); create_dlg(); }; - ~ArgumentDlg() { delete wnd; }; - void FillResult(); -protected: - void create_dlg(); -} argument_dlg; -//----------------------------------------------------------------------------- -void argument_dlg_cb(Fl_Widget *, void *v) -{ argument_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void ArgumentDlg::create_dlg() -{ - wnd = new Fl_Window(325, 275, gettext("Script arguments")); - a[1] = new Fl_Input(10, 25, 150, 25, gettext("Value for $1")); a[1]->align(FL_ALIGN_TOP_LEFT); - a[2] = new Fl_Input(165, 25, 150, 25, gettext("Value for $2")); a[2]->align(FL_ALIGN_TOP_LEFT); - a[3] = new Fl_Input(10, 70, 150, 25, gettext("Value for $3")); a[3]->align(FL_ALIGN_TOP_LEFT); - a[4] = new Fl_Input(165, 70, 150, 25, gettext("Value for $4")); a[4]->align(FL_ALIGN_TOP_LEFT); - a[5] = new Fl_Input(10, 115, 150, 25, gettext("Value for $5")); a[5]->align(FL_ALIGN_TOP_LEFT); - a[6] = new Fl_Input(165, 115, 150, 25, gettext("Value for $6"));a[6]->align(FL_ALIGN_TOP_LEFT); - a[7] = new Fl_Input(10, 160, 150, 25, gettext("Value for $7")); a[7]->align(FL_ALIGN_TOP_LEFT); - a[8] = new Fl_Input(165, 160, 150, 25, gettext("Value for $8"));a[8]->align(FL_ALIGN_TOP_LEFT); - a[9] = new Fl_Input(10, 205, 150, 25, gettext("Value for $9")); a[9]->align(FL_ALIGN_TOP_LEFT); - a[0] = new Fl_Input(165, 205, 150, 25, gettext("Value for $0"));a[0]->align(FL_ALIGN_TOP_LEFT); - - Fl_Button *o; - o = new Fl_Button(75, 240, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(175, 240, 75, 25, gettext("OK")); o->callback(argument_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void ArgumentDlg::FillResult() -{ - if(a[0]->value()[0]) Parse->AddParam(0,a[0]->value()); - if(a[1]->value()[0]) Parse->AddParam(1,a[1]->value()); - if(a[2]->value()[0]) Parse->AddParam(2,a[2]->value()); - if(a[3]->value()[0]) Parse->AddParam(3,a[3]->value()); - if(a[4]->value()[0]) Parse->AddParam(4,a[4]->value()); - if(a[5]->value()[0]) Parse->AddParam(5,a[5]->value()); - if(a[6]->value()[0]) Parse->AddParam(6,a[6]->value()); - if(a[7]->value()[0]) Parse->AddParam(7,a[7]->value()); - if(a[8]->value()[0]) Parse->AddParam(8,a[8]->value()); - if(a[9]->value()[0]) Parse->AddParam(9,a[9]->value()); -} -//----------------------------------------------------------------------------- -void argument_cb(Fl_Widget *, void *) -{ - ArgumentDlg *s = &argument_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) s->FillResult(); -} -//----------------------------------------------------------------------------- -void argument_set(int n, const char *s) -{ - if(n<0 || n>9) return; - Parse->AddParam(n,s); - argument_dlg.a[n]->value(s); -} -//----------------------------------------------------------------------------- -AnimateDlg animate_dlg; -//----------------------------------------------------------------------------- -void animate_dlg_cb(Fl_Widget *, void *v) -{ - animate_dlg.swap = false; - if(!animate_dlg.rt->value() && !animate_dlg.rv->value()) - fl_message(gettext("You have to select textual string or numeric cycle")); - else if(animate_dlg.rv->value() && animate_dlg.dx->value()==0) - fl_message(gettext("You have to set nonzero step in cycle")); - else - { - double t0=atof(animate_dlg.x0->value()), t1=atof(animate_dlg.x1->value()), dt=atof(animate_dlg.dx->value()); - if((t1-t0)*dt<0) - { - if(fl_ask(gettext("Order of first and last value is wrong. Swap it?"))) - { - char s[32]; sprintf(s,"%g",t0); - animate_dlg.x0->value(animate_dlg.x1->value()); - animate_dlg.x1->value(s); - } - else - { fl_message(gettext("Wrong boundaries")); return; } - } - animate_dlg.OK = true; ((Fl_Window *)v)->hide(); - } -} -//----------------------------------------------------------------------------- -void animate_rad_cb(Fl_Widget *, void *v) -{ - animate_dlg.rt->value(0); - animate_dlg.rv->value(0); - ((Fl_Round_Button *)v)->value(1); -} -//----------------------------------------------------------------------------- -void animate_put_cb(Fl_Widget *, void *) -{ - if(animate_dlg.rt->value()) - { - if(animate_dlg.txt->value()==0 || strlen(animate_dlg.txt->value())==0) return; - char *s = new char[1+strlen(animate_dlg.txt->value())], *a=s; - strcpy(s, animate_dlg.txt->value()); - for(int i=0;s[i]!=0;i++) - { - if(s[i]=='\n') - { - s[i] = 0; - textbuf->append("\n##a "); - textbuf->append(a); - a = s+i+1; - } - } - if(*a) - { textbuf->append("\n##a "); textbuf->append(a); } - delete []s; - } - else if(animate_dlg.rv->value()) - { - char *s = new char[128]; - sprintf(s,"\n##c %s %s %s",animate_dlg.x0->value(),animate_dlg.x1->value(),animate_dlg.dx->value()); - textbuf->append(s); - delete []s; - } -} -//----------------------------------------------------------------------------- -void AnimateDlg::create_dlg() -{ - wnd = new Fl_Window(335, 350, gettext("Animation")); - new Fl_Box(10, 5, 315, 25, gettext("Redraw picture for $0 equal to:")); - rt = new Fl_Round_Button(10, 30, 200, 25, gettext("strings in lines below")); - rt->callback(animate_rad_cb, rt); - rv = new Fl_Round_Button(220, 30, 105, 25, gettext("values")); - rv->callback(animate_rad_cb, rv); - txt = new Fl_Multiline_Input(10, 60, 200, 250); - x0 = new Fl_Float_Input(220, 80, 105, 25, gettext("from")); x0->align(FL_ALIGN_TOP_LEFT); - x1 = new Fl_Float_Input(220, 130, 105, 25, gettext("to")); x1->align(FL_ALIGN_TOP_LEFT); - dx = new Fl_Float_Input(220, 180, 105, 25, gettext("with step")); dx->align(FL_ALIGN_TOP_LEFT); - - Fl_Button *o; - o = new Fl_Button(230, 215, 80, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(230, 250, 80, 25, gettext("OK")); o->callback(animate_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - save = new Fl_Check_Button(220, 285, 105, 25, gettext("save slides")); - save->tooltip(gettext("Keep slides in memory (faster animation but require more memory)")); - save->down_box(FL_DOWN_BOX); save->hide(); - - o = new Fl_Button(10, 315, 100, 25, gettext("Put to script")); o->callback(animate_put_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - dt = new Fl_Float_Input(220, 315, 105, 25, gettext("Delay (in sec)"));// dx->align(FL_ALIGN_TOP_LEFT); - - wnd->end(); -} -//----------------------------------------------------------------------------- -void AnimateDlg::FillResult(Fl_MGL* e) -{ - e->NArgs = e->ArgCur = 0; - if(e->ArgBuf) delete [](e->ArgBuf); e->ArgBuf = 0; - e->AnimDelay = atof(dt->value()); - if(rt->value()) - { - char *s; - e->ArgBuf = new char[1+strlen(txt->value())]; - strcpy(e->ArgBuf, txt->value()); - s = e->Args[0] = e->ArgBuf; e->NArgs = 1; - for(int i=0;s[i]!=0;i++) - if(s[i]=='\n') - { - s[i] = 0; e->Args[e->NArgs] = s+i+1; e->NArgs += 1; - } - if(e->Args[e->NArgs-1][0]==0) e->NArgs -= 1; - } - else if(rv->value() && atof(dx->value())) - { - double t0=atof(x0->value()), t1=atof(x1->value()), dt=atof(dx->value()), t; - if((t1-t0)/dt<1) - { - e->ArgBuf = new char[32]; sprintf(e->ArgBuf,"%g",t0); - e->NArgs = 1; e->Args[0] = e->ArgBuf; return; - } - if((t1-t0)/dt>999) - { - fl_message(gettext("Too many slides. Reduce to 1000 slides.")); - dt = (t1-t0)/998; - } - e->ArgBuf = new char[32*int(1+(t1-t0)/dt)]; - for(t=t0;(dt>0&&t<=t1)||(dt<0&&t>=t1);t+=dt) - { - sprintf(e->ArgBuf + 32*e->NArgs,"%g\0",t); - e->Args[e->NArgs] = e->ArgBuf + 32*e->NArgs; - e->NArgs += 1; - } - } - else fl_message(gettext("No selection. So nothing to do")); -} -//----------------------------------------------------------------------------- -void animate_cb(Fl_Widget *, void *v) -{ - ScriptWindow* e = (ScriptWindow*)v; - AnimateDlg *s = &animate_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) s->FillResult(e->graph); -} -//----------------------------------------------------------------------------- -void cpy_arg_buf(const char *str, long *size, char **buf) -{ - const char *end; - for(end=str; *end>' '; end++); - if(end>=str+*size) - { *size = end-str+1; *buf = (char *)realloc(*buf,*size); } - memset(*buf,0,*size); - strncpy(*buf,str,end-str); -} -//----------------------------------------------------------------------------- -void fill_animate(const char *text) -{ - long size=128,i; - const char *str = text; - char *buf = (char *)malloc(size), tmp[4]="#$0"; - for(i=0;i<10;i++) // first read script arguments (if one) - { - tmp[2] = '0'+i; - if((str=strstr(text,tmp))) - { - str+=3; - while(*str>0 && *str<=' ' && *str!='\n') str++; - cpy_arg_buf(str,&size,&buf); - argument_dlg.a[i]->value(buf); - Parse->AddParam(i,buf); - } - } - - char *a = (char *)malloc(size); - memset(a,0,size); i = 0; - str = text; - while((str = strstr(str, "##"))) // now read animation parameters - { - if(str[2]=='a') - { - str += 3; - while(*str>0 && *str<=' ' && *str!='\n') str++; - if(*str==0 || *str=='\n') return; // empty comment - cpy_arg_buf(str,&size,&buf); - if(i==0) Parse->AddParam(0,buf); // put first value as $0 - i += strlen(buf)+1; - if(i>=size) - { - size = (1+ (i+2)/128)*128; - a = (char *)realloc(a,size); - } - strcat(a,buf); strcat(a,"\n"); - } - if(str[2]=='c') - { - str += 3; - register long j=0,l=strlen(str); - char *s=new char[l+1],*s1=0,*s2=0,*s3=0; - bool sp=true; strcpy(s,str); - for(j=0;jvalue(s1); - animate_dlg.x1->value(s2); - animate_dlg.dx->value(s3); - animate_dlg.rv->value(1); - } - delete []s; - } - } - if(i) - { animate_dlg.txt->value(a); animate_dlg.rt->value(1); } - free(buf); free(a); -} diff --git a/mgllab/data.cpp b/mgllab/data.cpp deleted file mode 100644 index 461ebb3..0000000 --- a/mgllab/data.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/* data.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -void get_doc_dir(char *&docdir); -void option_in_cb(Fl_Widget *, void *v); -void style_in_cb(Fl_Widget *, void *v); -//----------------------------------------------------------------------------- -struct VarDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Choice *var; - Fl_Spinner *dim1, *dim2, *dim3; - VarDlg() { memset(this,0,sizeof(VarDlg)); create_dlg(); }; - ~VarDlg() { delete wnd; }; - void create_dlg(); - char *get_result(); - void init(); -} var_dlg; -//----------------------------------------------------------------------------- -void VarDlg::init() -{ - char ss[1024]; - var->clear(); - mglVar *v=Parse->Self()->DataList; - while(v) - { - wcstombs(ss,v->s.c_str(),1024); - var->add(ss,0,0,v); - v = v->next; - } -} -//----------------------------------------------------------------------------- -char *VarDlg::get_result() -{ - static char res[64],a1[16]=":",a2[16]=":",a3[16]=":"; - res[0]=0; - if(var->value()<0) return res; - const Fl_Menu_Item m=var->menu()[var->value()]; - if(m.text[0]) - { - if(dim3->value()>=0) - { - if(dim1->value()>=0) sprintf(a1,"%g",dim1->value()); - if(dim2->value()>=0) sprintf(a2,"%g",dim2->value()); - sprintf(a3,"%g",dim3->value()); - sprintf(res,"%s(%s,%s,%s)",m.text,a1,a2,a3); - } - else if(dim2->value()>=0) - { - if(dim1->value()>=0) sprintf(a1,"%g",dim1->value()); - sprintf(a2,"%g",dim2->value()); - sprintf(res,"%s(%s,%s)",m.text,a1,a2); - } - else if(dim1->value()>=0) - { - sprintf(a1,"%g",dim1->value()); - sprintf(res,"%s(%s)",m.text,a1); - } - else strcpy(res,m.text); - } - return res; -} -//----------------------------------------------------------------------------- -void var_chg_cb(Fl_Widget *, void *) -{ - const Fl_Menu_Item m=var_dlg.var->menu()[var_dlg.var->value()]; - if(m.text[0] && m.user_data()) - { - mglVar *a = (mglVar *)m.user_data(); - var_dlg.dim1->range(-1,a->d.nx-1); - var_dlg.dim2->range(-1,a->d.ny-1); - var_dlg.dim3->range(-1,a->d.nz-1); - } -} -//----------------------------------------------------------------------------- -void var_in_cb(Fl_Widget *, void *v) -{ - Fl_Input *e = (Fl_Input*)v; - VarDlg *s = &var_dlg; - s->OK = false; - s->init(); - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) e->value(s->get_result()); -} -//----------------------------------------------------------------------------- -void var_dlg_cb(Fl_Widget *, void *v) -{ var_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void VarDlg::create_dlg() -{ - wnd = new Fl_Double_Window(190, 180, gettext("Variable")); - var = new Fl_Choice(100, 10, 75, 25, gettext("Variable name")); // !!! add variables here !!! - var->callback(var_chg_cb); - dim1 = new Fl_Spinner(100, 40, 75, 25, gettext("First index")); - dim1->range(-1,0); dim1->value(-1); dim1->step(1); - dim1->tooltip(gettext("Value of first dimensions (-1 for all range)")); - dim2 = new Fl_Spinner(100, 70, 75, 25, gettext("Second index")); - dim2->range(-1,0); dim2->value(-1); dim2->step(1); - dim2->tooltip(gettext("Value of second dimensions (-1 for all range)")); - dim3 = new Fl_Spinner(100, 100, 75, 25, gettext("Third index")); - dim3->range(-1,0); dim3->value(-1); dim3->step(1); - dim3->tooltip(gettext("Value of third dimensions (-1 for all range)")); - Fl_Button *o; - o = new Fl_Button(15, 140, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o = new Fl_Return_Button(100, 140, 75, 25, gettext("OK")); o->callback(var_dlg_cb,wnd); - wnd->end(); -} -//----------------------------------------------------------------------------- -const char *cmds[]={ -"plot|area|bars|barh|boxplot|chart|error|mark|region|stem|step|tens|textmark|torus|tube", -"surf|axial|belt|boxs|cont|contd|contf|dens|fall|grid2|mesh|tile|grad", -"surf3|cloud|beam|cont3|conta|contf3|contfa|dens3|densa|grid3|grida", -"map|stfa|surfa|surfc|tile|surf3a|surf3c", -"flow|pipe|traj|vect|vectc|vectl|dew", -"contx|conty|contz|contfx|contfy|contfz|densx|densy|densz|triplot|tricont|quadplot|crust|dots", -"text|title|fgets|legend|addlegend|clearlegend|legendbox", -"new|var|copy|delete|insert|read|readmat|readall|readhdf|save|savehdf|export|import|info|idset", -"fill|fillsample|modify|put|crop|extend|rearrange|squeeze|transpose|cumsum|diff|diff2|sinfft|cosfft|hankel|envelop|integrate|mirror|norm|normsl|sew|smooth|swap|roll|addto|subto|divto|multo", -"combine|evaluate|max|min|hist|jacobian|momentum|resize|sum|trace|transform|transforma|stfad|pde|qo2d|ray", -"axis|box|colorbar|grid|xlabel|ylabel|zlabel|tlabel", -"alpha|alphadef|transparent|transptype|ambient|light|fog|arrowsize|barwidth|linewidth|marksize|plotfactor|zoom|cut|axialdir|mesgnum|font|palette|rotatetext", -"axis|ranges|caxis|crange|xrange|yrange|zrange|origin|ternary|adjust|ctick|xtick|ytick|ztick|ticklen|tickstl", -"subplot|inplot|rotate|aspect|columnplot|perspective", -"call|func|chdir|define|if|elseif|else|endif|for|next|once|stop|write|setsize", -"fit|fits|putsfit", -"fplot|fsurf|ball|cone|curve|drop|facex|facey|facez|line|rect|sphere"}; -const char *first[]={"plot", "surf", "surf3", "map", "flow", "contx", "text", "new", "fill", "combine", "alpha", "axis", "subplot", "call", "fit", "fplot"}; -const char *cmd_types="1D plots|2D plots|3D plots|Dual plots|Vector plots|Other plots|Text and legend|Create data and I-O|Data handling|Data extraction|Axis and colorbar|General setup|Axis setup|Scale and rotate|Program flow|Nonlinear fitting|Primitives"; -//----------------------------------------------------------------------------- -void data_file(char *fn) -{ - static int num=0; - static char name[32], res[256]; - sprintf(name,"mgl_%d",num); num++; - mglData *v = Parse->AddVar(name); - v->Read(fn); - if(v->nz>1) - sprintf(res,"#read %s '%s'\nrotate 40 60\ncrange %s\nbox\nsurf3 %s\n", name, fn, name, name); - else if(v->ny>1) - sprintf(res,"#read %s '%s'\nrotate 40 60\ncrange %s\nzrange %s\nbox\nsurf %s\n", name, fn, name, name, name); - else - sprintf(res,"#read %s '%s'\nyrange %s\nbox\nplot %s\n", name, fn, name, name); - textbuf->text(res); -} -//----------------------------------------------------------------------------- -// -// New Command dialog -// -//----------------------------------------------------------------------------- -struct CmdDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Choice *type, *cmd; - Fl_Input *var_x, *var_y, *var_z, *var_u, *var_v, *var_w; - Fl_Box *fmt, *dsc; - Fl_Input *stl, *zval, *par1, *par2, *opt; - Fl_Help_View *help; - - CmdDlg() { memset(this,0,sizeof(CmdDlg)); create_dlg(); }; - ~CmdDlg() { delete wnd; }; - void create_dlg(); - char *get_result(); -} cmd_dlg; -//----------------------------------------------------------------------------- -void cmd_dlg_cb(Fl_Widget *, void *v) // add variables checking -{ cmd_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void type_cmd_cb(Fl_Widget *, void *) -{ - int val = cmd_dlg.type->value(); - if(val>=0 && val<16) - { - cmd_dlg.cmd->clear(); cmd_dlg.cmd->add(cmds[val]); - cmd_dlg.dsc->copy_label(Parse->CmdDesc(first[val])); - cmd_dlg.fmt->copy_label(Parse->CmdFormat(first[val])); - - static char str[300]; // load help for command - char *docdir; get_doc_dir(docdir); -#ifdef WIN32 - sprintf(str,"%s\\mgl_en.html#%s",docdir,first[val]); -#else - sprintf(str,"%s/mgl_en.html#%s",docdir,first[val]); -#endif - free(docdir); cmd_dlg.help->load(str); - } - cmd_dlg.cmd->value(0); -} -//----------------------------------------------------------------------------- -void desc_cmd_cb(Fl_Widget *, void *) -{ - const char *name = cmd_dlg.cmd->mvalue()->text; - cmd_dlg.dsc->copy_label(Parse->CmdDesc(name)); - cmd_dlg.fmt->copy_label(Parse->CmdFormat(name)); - - static char str[300]; // load help for command - char *docdir; get_doc_dir(docdir); -#ifdef WIN32 - sprintf(str,"%s\\mgl_en.html#%s",docdir,name); -#else - sprintf(str,"%s/mgl_en.html#%s",docdir,name); -#endif - free(docdir); cmd_dlg.help->load(str); -} -//----------------------------------------------------------------------------- -void CmdDlg::create_dlg() -{ - Fl_Button *o; - wnd = new Fl_Double_Window(500, 450, gettext("Command properties")); - type = new Fl_Choice(90, 10, 170, 25, gettext("Type of plot")); - type->tooltip(gettext("Select one of general types of plot")); - cmd = new Fl_Choice(350, 10, 100, 25, gettext("Command")); - cmd->tooltip(gettext("Select kind of plot in this group")); - - fmt = new Fl_Box(0, 40, 500, 25); - fmt->box(UDAV_DOWN_BOX); - fmt->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - fmt->tooltip(gettext("Format of command and its arguments")); - dsc = new Fl_Box(0, 70, 500, 25); - dsc->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - dsc->tooltip(gettext("Short command description")); - - type->callback(type_cmd_cb,cmd); cmd->callback(desc_cmd_cb,0); - type->add(gettext(cmd_types)); type_cmd_cb(0,0); - - var_x = new Fl_Input(15, 115, 50, 25, "X"); var_x->align(FL_ALIGN_TOP); - o = new Fl_Button(65, 115, 25, 25, ".."); o->callback(var_in_cb,var_x); - var_y = new Fl_Input(95, 115, 50, 25, "Y"); var_y->align(FL_ALIGN_TOP); - o = new Fl_Button(145, 115, 25, 25, ".."); o->callback(var_in_cb,var_y); - var_z = new Fl_Input(175, 115, 50, 25, "Z"); var_z->align(FL_ALIGN_TOP); - o = new Fl_Button(225, 115, 25, 25, ".."); o->callback(var_in_cb,var_z); - var_u = new Fl_Input(255, 115, 50, 25, gettext("Vx or A")); var_u->align(FL_ALIGN_TOP); - o = new Fl_Button(305, 115, 25, 25, ".."); o->callback(var_in_cb,var_u); - var_v = new Fl_Input(335, 115, 50, 25, gettext("Vy or C")); var_v->align(FL_ALIGN_TOP); - o = new Fl_Button(385, 115, 25, 25, ".."); o->callback(var_in_cb,var_v); - var_w = new Fl_Input(415, 115, 50, 25, "Vz");var_w->align(FL_ALIGN_TOP); - o = new Fl_Button(465, 115, 25, 25, ".."); o->callback(var_in_cb,var_w); - - stl = new Fl_Input(15, 165, 50, 25, gettext("Style")); - stl->align(FL_ALIGN_TOP); stl->tooltip(gettext("String argument with command style (or scheme or font)")); - o = new Fl_Button(65, 165, 25, 25, ".."); o->callback(style_in_cb, stl); - - zval = new Fl_Input(95, 165, 75, 25, gettext("zVal or sVal")); - zval->align(FL_ALIGN_TOP); - zval->tooltip(gettext("Z-value or value of slice.\nKeep empty for default value")); - par1 = new Fl_Input(175, 165, 75, 25, gettext("Text or dir")); - par1->align(FL_ALIGN_TOP); - par1->tooltip(gettext("Text (in text command) or direction (in cont3, contf3, dens3)")); - par2 = new Fl_Input(255, 165, 75, 25, gettext("Number")); - par2->align(FL_ALIGN_TOP); - par2->tooltip(gettext("Number of contours in cont* commands")); - - opt = new Fl_Input(15, 215, 290, 25, gettext("Options")); - opt->align(FL_ALIGN_TOP_LEFT); - opt->tooltip(gettext("Command options")); - o = new Fl_Button(305, 215, 25, 25, ".."); o->callback(option_in_cb, opt); - - o = new Fl_Button(405, 180, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb, wnd); - o = new Fl_Return_Button(405, 215, 75, 25, gettext("OK")); o->callback(cmd_dlg_cb, wnd); - - help = new Fl_Help_View(0, 250, 500, 200); - wnd->end(); -} -//----------------------------------------------------------------------------- -char *CmdDlg::get_result() -{ - static char res[1024],buf[128]; - res[0]=0; - const char *cn = cmd->mvalue()->text; - - bool sl3 = !strcmp(cn,"cont3") || !strcmp(cn,"contf3") || !strcmp(cn,"dens3"); - strcpy(res,"\n"); strcat(res,cn); - sprintf(buf,"%s%s%s%s%s%s%s%s%s%s%s%s", var_x->value()[0]?" ":"", var_x->value(), - var_y->value()[0]?" ":"", var_y->value(), var_z->value()[0]?" ":"", var_z->value(), - var_u->value()[0]?" ":"", var_u->value(), var_v->value()[0]?" ":"", var_v->value(), - var_w->value()[0]?" ":"", var_w->value()); - strcat(res,buf); - - if(!strcmp(cn,"text") && par1->value()[0]) - { strcat(res," '"); strcat(res,par1->value()); strcat(res,"'"); } - if(sl3 && !par1->value()[0]) - { - strcat(res," 'x'"); - fl_message(gettext("You should specify direction.\nDirection 'x' is selected by default")); - if(zval->value()[0]) - { sprintf(buf," %d",atoi(zval->value())); strcat(res,buf); } - } - if(sl3 && par1->value()[0]) - { - strcat(res," '"); strcat(res,par1->value()); strcat(res,"'"); - if(zval->value()[0]) - { sprintf(buf," %d",atoi(zval->value())); strcat(res,buf); } - } - if(stl->value()[0]) - { strcat(res," '"); strcat(res,stl->value()); strcat(res,"'"); } - if(!sl3 && zval->value()[0]) - { sprintf(buf," %d",atoi(zval->value())); strcat(res,buf); } - if(!sl3 && par2->value()[0]) - { sprintf(buf," %d",atoi(par2->value())); strcat(res,buf); } - if(opt->value()[0]) strcat(res,opt->value()); -// strcat(res,"\n"); - return res; -} -//----------------------------------------------------------------------------- -void command_cb(Fl_Widget *, void *v) -{ - CmdDlg *s = &cmd_dlg; - ScriptWindow* e = (ScriptWindow*)v; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - { - long i=e->editor->insert_position(), j=textbuf->line_end(i); - e->editor->insert_position(j); - e->editor->insert(s->get_result()); - } -} -//----------------------------------------------------------------------------- -void plot_dat_cb(Fl_Widget *, void *) -{ - CmdDlg *s = &cmd_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - textbuf->insert(textbuf->length(), s->get_result()); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/editor.cpp b/mgllab/editor.cpp deleted file mode 100644 index 4b88a40..0000000 --- a/mgllab/editor.cpp +++ /dev/null @@ -1,516 +0,0 @@ -/* editor.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#ifdef __MWERKS__ -# define FL_DLL -#endif -#include "udav.h" -//----------------------------------------------------------------------------- -int changed = 0; -char filename[256] = ""; -Fl_Text_Buffer *textbuf = 0; -void data_file(char *v); -//----------------------------------------------------------------------------- -// Syntax highlighting stuff... -Fl_Text_Buffer *stylebuf = 0; -Fl_Text_Display::Style_Table_Entry styletable[] = { // Style table - { FL_BLACK, FL_COURIER, 14, 0 }, // A - Plain - { FL_DARK_GREEN,FL_COURIER_ITALIC, 14, 0 }, // B - Line comments - { FL_BLUE, FL_COURIER, 14, 0 }, // C - Number - { FL_RED, FL_COURIER, 14, 0 }, // D - Strings - { FL_DARK_BLUE, FL_COURIER_BOLD, 14, 0 }, // E - Usual ommand - { FL_DARK_CYAN, FL_COURIER_BOLD, 14, 0 }, // F - Flow command - { FL_DARK_MAGENTA, FL_COURIER_BOLD,14, 0 }, // G - New-data command - { FL_DARK_RED, FL_COURIER_BOLD, 14, 0 }, // H - Option - { FL_DARK_GREEN,FL_COURIER_BOLD, 14, 0 }}; // I - Inactive command -//----------------------------------------------------------------------------- -bool is_sfx(const char *s) // suffix -{ - register long i,n=strlen(s); - for(i=0;i='a';i++); - if(i==1 && s[0]=='a') return true; - if(i==2 && strchr("axyz",s[1]) && strchr("nmawsk",s[0])) return true; - if(i==3 && (!strncmp("fst",s,3) || !strncmp("lst",s,3) || !strncmp("max",s,3) || - !strncmp("min",s,3) || !strncmp("sum",s,3))) - return true; - return false; -// char *t = new char[i+1]; memcpy(t,s,i*sizeof(char)); t[i]=0; -} -//----------------------------------------------------------------------------- -bool is_opt(const char *s) // option -{ - const char *o[]={"xrange","yrange","zrange","crange","alpha", - "cut","ambient","meshnum","fontsize","alphadef", - "marksize","legend"}; - int l[12] = {6, 6, 6, 6, 5, 3, 7, 7, 8, 8, 8, 6}; - register long i; - for(i=0;i<12;i++) if(!strncmp(o[i],s,l[i]) && s[l[i]]<=' ') return true; - return false; -} -//----------------------------------------------------------------------------- -bool is_num(const char *s) // number -{ - register long i,n=strlen(s); - if(s[0]==':' && (s[1]<=' ' || s[1]==';')) return true; - if(n>=2 && !strncmp("pi",s,2) && (s[2]<=' ' || s[2]==';' || s[2]==':')) return true; - if(n>=2 && !strncmp("on",s,2) && (s[2]<=' ' || s[2]==';' || s[2]==':')) return true; - if(n>=3 && !strncmp("off",s,3) && (s[3]<=' ' || s[3]==';' || s[2]==':')) return true; - if(n>=3 && !strncmp("nan",s,3) && (s[3]<=' ' || s[3]==';' || s[2]==':')) return true; - for(i=0;iCmdType(w); - if(rts==5) res = 'G'; - else if(rts==7) res = 'F'; - else if(rts) res = 'E'; - delete []w; return res; -} -//----------------------------------------------------------------------------- -// Parse text and produce style data. -void style_parse(const char *text, char *style, int /*length*/) -{ - register long i; - long n=strlen(text); - bool nl=true, arg=true; - // Style letters: - // A - Plain - // B - Line comments - // C - Number - // D - Strings - // E - Usual command - // F - Flow command - // G - New data command - // H - Option - - for(i=0;ilength() + 1]; - char *text = textbuf->text(); - memset(style, 'A', textbuf->length()); - style[textbuf->length()] = '\0'; - if (!stylebuf) stylebuf = new Fl_Text_Buffer(textbuf->length()); - style_parse(text, style, textbuf->length()); - stylebuf->text(style); - delete[] style; - free(text); -} -//----------------------------------------------------------------------------- -// Update unfinished styles. -void style_unfinished_cb(int, void*) {} -//----------------------------------------------------------------------------- -// Update the style buffer... -void style_update(int pos, // Position of update - int nInserted, // Number of inserted chars - int nDeleted, // Number of deleted chars - int /*nRestyled*/, // Number of restyled chars - const char */*deletedText*/,// Text that was deleted - void *cbArg) // Callback data -{ - long start, end; // Start and end of text - char last, // Last style on line - *style, // Style data - *text; // Text data - - // If this is just a selection change, just unselect the style buffer... - if (nInserted == 0 && nDeleted == 0) { stylebuf->unselect(); return; } - // Track changes in the text buffer... - if (nInserted > 0) - { - // Insert characters into the style buffer... - style = new char[nInserted + 1]; - memset(style, 'A', nInserted); - style[nInserted] = '\0'; - - stylebuf->replace(pos, pos + nDeleted, style); - delete[] style; - } - else // Just delete characters in the style buffer... - stylebuf->remove(pos, pos + nDeleted); - - // Select the area that was just updated to avoid unnecessary callbacks... - stylebuf->select(pos, pos + nInserted - nDeleted); - - // Re-parse the changed region; we do this by parsing from the - // beginning of the previous line of the changed region to the end of - // the line of the changed region... Then we check the last - // style character and keep updating if we have a multi-line - // comment character... - start = textbuf->line_start(pos); - end = textbuf->line_end(pos + nInserted); - text = textbuf->text_range(start, end); - style = stylebuf->text_range(start, end); - if (start==end) last = 0; - else last = style[end-start-1]; - style_parse(text, style, end - start); - stylebuf->replace(start, end, style); - ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end); - - if (start==end || last != style[end-start-1]) - { - // Either the user deleted some text, or the last character on - // the line changed styles, so reparse the remainder of the buffer... - free(text); free(style); - - end = textbuf->length(); - text = textbuf->text_range(start, end); - style = stylebuf->text_range(start, end); - style_parse(text, style, end - start); - stylebuf->replace(start, end, style); - ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end); - } - free(text); free(style); -} -//----------------------------------------------------------------------------- -ScriptWindow::ScriptWindow(int w, int h, const char* t) : Fl_Double_Window(w, h, t) -{ - replace_dlg = new Fl_Window(300, 105, gettext("Replace")); - replace_find = new Fl_Input(80, 10, 210, 25, gettext("Find:")); - replace_find->align(FL_ALIGN_LEFT); - - replace_with = new Fl_Input(80, 40, 210, 25, gettext("Replace:")); - replace_with->align(FL_ALIGN_LEFT); - - replace_all = new Fl_Button(10, 70, 90, 25, gettext("Replace All")); - replace_all->callback((Fl_Callback *)replall_cb, this); - replace_all->box(UDAV_UP_BOX); replace_all->down_box(UDAV_DOWN_BOX); - - replace_next = new Fl_Return_Button(105, 70, 120, 25, "Replace Next"); - replace_next->callback((Fl_Callback *)replace2_cb, this); - replace_next->box(UDAV_UP_BOX); replace_next->down_box(UDAV_DOWN_BOX); - - replace_cancel = new Fl_Button(230, 70, 60, 25, gettext("Cancel")); - replace_cancel->callback((Fl_Callback *)replcan_cb, this); - replace_cancel->box(UDAV_UP_BOX); replace_cancel->down_box(UDAV_DOWN_BOX); - - replace_dlg->end(); - replace_dlg->set_non_modal(); - editor = 0; *search = 0; - - setup_dlg = new SetupDlg; - setup_dlg->CreateDlg(); -} -//----------------------------------------------------------------------------- -ScriptWindow::~ScriptWindow() -{ - delete replace_dlg; - delete setup_dlg->wnd; -} -//----------------------------------------------------------------------------- -int check_save(void) -{ - if (!changed) return 1; - int r = fl_choice(gettext("The current file has not been saved.\n" - "Would you like to save it now?"), - gettext("Cancel"), gettext("Save"), gettext("Don't Save")); - if(r==1) { save_cb(0,0); return !changed; } // Save the file... - return (r==2) ? 1 : 0; -} -//----------------------------------------------------------------------------- -int loading = 0; -void load_file(char *newfile, int ipos) -{ - long len = strlen(newfile); - pref.set("last_file",newfile); - if(ipos==-1 && (!strcmp(newfile+len-4,".dat") || !strcmp(newfile+len-4,".csv"))) - { - data_file(newfile); - strcpy(newfile+len-4,".mgl"); - strcpy(filename, newfile); - } - else - { - loading = 1; - int insert = (ipos != -1); - changed = insert; - if(!insert) strcpy(filename, ""); - long r; - if(!insert) r = textbuf->loadfile(newfile); - else r = textbuf->insertfile(newfile, ipos); - - char *t = textbuf->text(); -#ifndef WIN32 - for(unsigned long i=0;itext(t); -#endif - fill_animate(t); free(t); - - if (r) - fl_alert(gettext("Error reading from file \'%s\':\n%s."), newfile, strerror(errno)); - else if(!insert) strcpy(filename, newfile); - loading = 0; - textbuf->call_modify_callbacks(); - } -} -//----------------------------------------------------------------------------- -void save_file(char *newfile) -{ - pref.set("last_file",newfile); - if (textbuf->savefile(newfile)) - fl_alert(gettext("Error writing to file \'%s\':\n%s."), newfile, strerror(errno)); - else - strcpy(filename, newfile); - changed = 0; - textbuf->call_modify_callbacks(); -} -//----------------------------------------------------------------------------- -void copy_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - Fl_Text_Editor::kf_copy(0, e->editor); -} -//----------------------------------------------------------------------------- -void cut_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - Fl_Text_Editor::kf_cut(0, e->editor); -} -//----------------------------------------------------------------------------- -void delete_cb(Fl_Widget*, void*) { textbuf->remove_selection(); } -//----------------------------------------------------------------------------- -void find_cb(Fl_Widget* w, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - const char *val; - val = fl_input(gettext("Search String:"), e->search); - if (val != NULL) { strcpy(e->search, val); find2_cb(w, v); } -} -//----------------------------------------------------------------------------- -void find2_cb(Fl_Widget* w, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - if (e->search[0] == '\0') { find_cb(w, v); return; } - - int pos = e->editor->insert_position(); - long found = textbuf->search_forward(pos, e->search, &pos); - if (found) { - // Found a match; select and update the position... - textbuf->select(pos, pos+strlen(e->search)); - e->editor->insert_position(pos+strlen(e->search)); - e->editor->show_insert_position(); - } - else fl_alert(gettext("No occurrences of \'%s\' found!"), e->search); -} -//----------------------------------------------------------------------------- -void changed_cb(int, int nInserted, int nDeleted,int, const char*, void* v) -{ - if ((nInserted || nDeleted) && !loading) changed = 1; - ScriptWindow *w = (ScriptWindow *)v; - set_title(w); - if (loading) w->editor->show_insert_position(); -} -//----------------------------------------------------------------------------- -void insert_cb(Fl_Widget*, void *v) -{ - char *newfile = fl_file_chooser(gettext("Insert File?"), "*", filename); - ScriptWindow *w = (ScriptWindow *)v; - if (newfile != NULL) load_file(newfile, w->editor->insert_position()); -} -//----------------------------------------------------------------------------- -void paste_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - Fl_Text_Editor::kf_paste(0, e->editor); -} -//----------------------------------------------------------------------------- -void replace_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - e->replace_dlg->show(); -} -//----------------------------------------------------------------------------- -void replace2_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - const char *find = e->replace_find->value(); - const char *replace = e->replace_with->value(); - if (find[0] == '\0') { e->replace_dlg->show(); return; } - e->replace_dlg->hide(); - - int pos = e->editor->insert_position(); - long found = textbuf->search_forward(pos, find, &pos); - if (found) - { - // Found a match; update the position and replace text... - textbuf->select(pos, pos+strlen(find)); - textbuf->remove_selection(); - textbuf->insert(pos, replace); - textbuf->select(pos, pos+strlen(replace)); - e->editor->insert_position(pos+strlen(replace)); - e->editor->show_insert_position(); - } - else fl_alert(gettext("No occurrences of \'%s\' found!"), find); -} -//----------------------------------------------------------------------------- -void replall_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - const char *find = e->replace_find->value(); - const char *replace = e->replace_with->value(); - - find = e->replace_find->value(); - if (find[0] == '\0') { e->replace_dlg->show(); return; } - e->replace_dlg->hide(); - e->editor->insert_position(0); - long times = 0; - - // Loop through the whole string - for (long found = 1; found;) - { - int pos = e->editor->insert_position(); - found = textbuf->search_forward(pos, find, &pos); - if (found) - { - // Found a match; update the position and replace text... - textbuf->select(pos, pos+strlen(find)); - textbuf->remove_selection(); - textbuf->insert(pos, replace); - e->editor->insert_position(pos+strlen(replace)); - e->editor->show_insert_position(); - times++; - } - } - if (times) fl_message(gettext("Replaced %ld occurrences."), times); - else fl_alert(gettext("No occurrences of \'%s\' found!"), find); -} -//----------------------------------------------------------------------------- -void replcan_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - e->replace_dlg->hide(); -} -//----------------------------------------------------------------------------- -void view_cb(Fl_Widget*, void*); -//#include "xpm/window.xpm" -//#include "xpm/option.xpm" -//#include "xpm/table.xpm" -#include "xpm/plot.xpm" -#include "xpm/help-contents.xpm" -#include "xpm/edit-cut.xpm" -#include "xpm/edit-copy.xpm" -#include "xpm/edit-paste.xpm" -#include "xpm/edit-find.xpm" -#include "xpm/document-open.xpm" -#include "xpm/document-new.xpm" -#include "xpm/document-save.xpm" -Fl_Widget *add_editor(ScriptWindow *w) -{ - Fl_Window *w1=new Fl_Window(0,30,300,430,0); - Fl_Group *g = new Fl_Group(0,0,290,30); - Fl_Button *o; - - o = new Fl_Button(0, 1, 25, 25); o->image(new Fl_Pixmap(document_new_xpm)); - o->tooltip(gettext("New script")); o->callback(new_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(25, 1, 25, 25); o->tooltip(gettext("Open script or data file")); - o->image(new Fl_Pixmap(document_open_xpm)); o->callback(open_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(50, 1, 25, 25); o->tooltip(gettext("Save script to file")); - o->image(new Fl_Pixmap(document_save_xpm)); o->callback(save_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - o = new Fl_Button(80, 1, 25, 25); o->tooltip(gettext("Cut selection to clipboard")); - o->image(new Fl_Pixmap(edit_cut_xpm)); o->callback(cut_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(105, 1, 25, 25); o->tooltip(gettext("Copy selection to clipboard")); - o->image(new Fl_Pixmap(edit_copy_xpm)); o->callback(copy_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(130, 1, 25, 25); o->tooltip(gettext("Paste text from clipboard")); - o->image(new Fl_Pixmap(edit_paste_xpm)); o->callback(paste_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(155, 1, 25, 25); o->tooltip(gettext("Find text")); - o->image(new Fl_Pixmap(edit_find_xpm)); o->callback(find_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - o = new Fl_Button(185, 1, 25, 25); o->tooltip(gettext("Insert MGL command")); - o->image(new Fl_Pixmap(plot_xpm)); o->callback(command_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); -// o = new Fl_Button(185, 1, 25, 25); o->tooltip(gettext("Insert command options")); -// o->image(new Fl_Pixmap(option_xpm)); o->callback(option_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); -// o = new Fl_Button(210, 1, 25, 25); o->tooltip(gettext("Edit data array")); -// o->image(new Fl_Pixmap(table_xpm)); o->callback(table_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); -// o = new Fl_Button(235, 1, 25, 25); o->tooltip(gettext("New view window")); -// o->image(new Fl_Pixmap(window_xpm));o->callback(view_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(210, 1, 25, 25); o->tooltip(gettext("Show help window")); - o->image(new Fl_Pixmap(help_contents_xpm)); o->callback(help_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - g->end(); g->resizable(0); - - w->editor = new Fl_Text_Editor(0, 28, 300, 400); - w->editor->buffer(textbuf); - w->editor->highlight_data(stylebuf, styletable, sizeof(styletable) / sizeof(styletable[0]), 'A', style_unfinished_cb, 0); - w->editor->textfont(FL_COURIER); - - textbuf->add_modify_callback(style_update, w->editor); - textbuf->add_modify_callback(changed_cb, w); - textbuf->call_modify_callbacks(); - - w1->end(); - w1->resizable(w->editor); //w->graph); - return w1; -} -//----------------------------------------------------------------------------- diff --git a/mgllab/grid.cpp b/mgllab/grid.cpp deleted file mode 100644 index 3c32945..0000000 --- a/mgllab/grid.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* grid.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -Fl_Callback input_cb; -//----------------------------------------------------------------------------- -void input_cb(Fl_Widget*, void* v) { ((Fl_Data_Table*)v)->set_value(); } -//----------------------------------------------------------------------------- -Fl_Data_Table::Fl_Data_Table(int x, int y, int w, int h, const char *l) : Fl_Table(x,y,w,h,l) -{ - callback(&event_callback, (void*)this); - input = new Fl_Input(w/2,h/2,0,0); - input->hide(); - input->callback(input_cb, (void*)this); - input->when(FL_WHEN_ENTER_KEY_ALWAYS); - input->maximum_size(16); -// (new Fl_Box(9999,9999,0,0))->hide(); // HACK: prevent flickering in Fl_Scroll - end(); -} -//----------------------------------------------------------------------------- -// Handle drawing all cells in table -void Fl_Data_Table::draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H) -{ - static char s[32]; - fl_push_clip(X, Y, W, H); - switch ( context ) - { - case CONTEXT_COL_HEADER: - fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color()); - fl_font(FL_HELVETICA | FL_BOLD, 14); - fl_color(FL_BLACK); sprintf(s,"%d",C); - fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER); - break; - case CONTEXT_ROW_HEADER: - fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color()); - fl_font(FL_HELVETICA | FL_BOLD, 14); - fl_color(FL_BLACK); sprintf(s,"%d",R); - fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER); - break; - case CONTEXT_CELL: - if (R == row && C == col && input->visible()) break; - fl_draw_box(FL_THIN_DOWN_BOX, X, Y, W, H, FL_WHITE); - fl_pop_clip(); - fl_push_clip(X+3, Y+3, W-6, H-6); - fl_font(FL_HELVETICA, 14); - fl_color(FL_BLACK); - if(mgl_isnan(data[C+nx*R])) strcpy(s,"nan"); - else sprintf(s,"%g",data[C+nx*R]); - fl_draw(s, X+3, Y+3, W-6, H-6, FL_ALIGN_RIGHT); - break; - case CONTEXT_RC_RESIZE: - if (!input->visible()) break; - find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); - if (X!=input->x() || Y!=input->y() || W!=input->w() || H!=input->h()) - input->resize(X,Y,W,H); - break; - default: break; - } - fl_pop_clip(); -} -//----------------------------------------------------------------------------- -void Fl_Data_Table::cell_click() -{ - int R = callback_row(), C = callback_col(); - TableContext context = callback_context(); - - if(context==CONTEXT_CELL) - { - if (input->visible()) //input->do_callback(); - { - const char *s = input->value(); - data[col + nx*row] = (s[0]==0 || !strcmp(s,"nan")) ? NAN : atof(s); - } - row = R; col = C; - int XX,YY,WW,HH; - find_cell(CONTEXT_CELL, R, C, XX, YY, WW, HH); - input->resize(XX,YY,WW,HH); - char s[32]; - if(mgl_isnan(data[C+nx*R])) strcpy(s,"nan"); - else sprintf(s,"%g",data[C+nx*R]); - input->value(s); input->show(); - input->take_focus(); - } -} -//----------------------------------------------------------------------------- -void Fl_Data_Table::set_value() -{ - const char *s = input->value(); - data[col + nx*row] = (s[0]==0 || !strcmp(s,"nan")) ? NAN : atof(s); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/help.cpp b/mgllab/help.cpp deleted file mode 100644 index 012031c..0000000 --- a/mgllab/help.cpp +++ /dev/null @@ -1,273 +0,0 @@ -/* help.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "udav.h" -#include -#include -//----------------------------------------------------------------------------- -void get_doc_dir(char *&docdir) -{ - static char str[300]; - pref.get("help_dir",docdir,""); -#ifdef WIN32 - sprintf(str,"%s\\mgl_en.html",docdir); -#else - sprintf(str,"%s/mgl_en.html",docdir); -#endif - FILE *fp = fopen(str,"r"); - if(fp) fclose(fp); - else - { - const char *p=0; - if((p=fl_input("Please enter a path for help/font files:",""))) - pref.set("help_dir",p); - pref.get("help_dir",docdir,""); - } -} -//----------------------------------------------------------------------------- -void help_cb(Fl_Widget*, void*v) -{ - ScriptWindow* e = (ScriptWindow*)v; - long i=e->editor->insert_position(), j0=textbuf->line_start(i),j; - - static char str[300]; - char s[32]="", *buf = textbuf->text(); - memset(s,0,32*sizeof(char)); - for(j=j0;!isspace(buf[j]) && buf[j]!='#' && buf[j]!=';' && j<31+j0;j++) - s[j-j0] = buf[j]; - free(buf); - get_doc_dir(buf); -#ifdef WIN32 - sprintf(str,"%s\\mgl_en.html#%s",buf,s); -#else - sprintf(str,"%s/mgl_en.html#%s",buf,s); -#endif - free(buf); e->hd->load(str); - if(e->rtab) e->rtab->value(e->ghelp); -} -//----------------------------------------------------------------------------- -void link_cb(Fl_Widget*, void*v) -{ - ScriptWindow* e = (ScriptWindow*)v; - static char str[300]; - char *docdir; - get_doc_dir(docdir); -#ifdef WIN32 - sprintf(str,"%s\\mgl_en.html#%s",docdir,e->link_cmd->value()); -#else - sprintf(str,"%s/mgl_en.html#%s",docdir,e->link_cmd->value()); -#endif - free(docdir); e->hd->load(str); - if(e->rtab) e->rtab->value(e->ghelp); -} -//----------------------------------------------------------------------------- -void example_cb(Fl_Widget*, void*v) -{ - char *docdir; - static char str[300]; - ScriptWindow* e = (ScriptWindow*)v; - get_doc_dir(docdir); -#ifdef WIN32 - sprintf(str,"%s\\mgl_en.html\\mgl_en_2.html",docdir); -#else - sprintf(str,"%s/mgl_en.html/mgl_en_2.html",docdir); -#endif - free(docdir); e->hd->load(str); e->rtab->value(e->ghelp); - if(e->rtab) e->rtab->value(e->ghelp); -} -//----------------------------------------------------------------------------- -void help_in_cb(Fl_Widget*, void*v) -{ - ScriptWindow* e = (ScriptWindow*)v; - e->hd->textsize(e->hd->textsize()+1); -} -//----------------------------------------------------------------------------- -void help_out_cb(Fl_Widget*, void*v) -{ - ScriptWindow* e = (ScriptWindow*)v; - e->hd->textsize(e->hd->textsize()-1); -} -//----------------------------------------------------------------------------- -#include "xpm/udav.xpm" -void about_cb(Fl_Widget*, void*) -{ - static char s[128]; - sprintf(s,gettext("UDAV v. 2.%g\n(c) Alexey Balakin, 2007\nhttp://udav.sf.net/"), MGL_VER2); - Fl_Double_Window* w = new Fl_Double_Window(355, 130, "About UDAV"); - Fl_Box* o = new Fl_Box(10, 15, 65, 65); - o->box(FL_UP_BOX); o->color(55); o->image(new Fl_Pixmap(udav_xpm)); - o = new Fl_Box(85, 15, 260, 65); o->box(UDAV_DOWN_BOX); - o->label(s); - Fl_Button *b = new Fl_Return_Button(255, 90, 90, 30, "Close"); - b->callback(close_dlg_cb,w); - b->box(UDAV_UP_BOX); b->down_box(UDAV_DOWN_BOX); - w->end(); w->set_modal(); w->show(); -} -//----------------------------------------------------------------------------- -#include "xpm/zoom-out.xpm" -#include "xpm/zoom-in.xpm" -#include "xpm/help-faq.xpm" -Fl_Widget *add_help(ScriptWindow *w) -{ - Fl_Window *w1=new Fl_Window(300,30,630,430,0); - Fl_Group *g = new Fl_Group(0,0,290,30); - Fl_Button *o; - - w->link_cmd = new Fl_Input(0,1,150,25); - w->link_cmd->when(FL_WHEN_CHANGED); - w->link_cmd->callback(link_cb,w); - - o = new Fl_Button(155, 1, 25, 25); o->tooltip(gettext("MGL samples and hints")); - o->image(new Fl_Pixmap(help_faq_xpm)); o->callback(example_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(180, 1, 25, 25); o->tooltip(gettext("Increase font size")); - o->image(new Fl_Pixmap(zoom_in_xpm)); o->callback(help_in_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(205, 1, 25, 25); o->tooltip(gettext("Decrease font size")); - o->image(new Fl_Pixmap(zoom_out_xpm)); o->callback(help_out_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - g->end(); g->resizable(0); - - w->hd = new Fl_Help_View(0,28,630,400); - w1->end(); link_cb(w,w); - w1->resizable(w->hd); return w1; -} -//----------------------------------------------------------------------------- -void mem_dlg_cb0(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_pressed(0); } -//----------------------------------------------------------------------------- -void mem_dlg_cb1(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_pressed(1); } -//----------------------------------------------------------------------------- -void mem_dlg_cb2(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_pressed(2); } -//----------------------------------------------------------------------------- -void mem_dlg_cb3(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_pressed(3); } -//----------------------------------------------------------------------------- -void mem_update_cb(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_init(); } -//----------------------------------------------------------------------------- -Fl_Widget *add_mem(ScriptWindow *w) -{ - static int widths[] = {220,205,0}; - Fl_Button *o; - Fl_Box *b; -// wnd = new Fl_Double_Window(335, 405, gettext("Data browser")); - Fl_Window *wnd = new Fl_Window(300,30,630,430,0); - -// Fl_Group *g = new Fl_Group(10,10,610,395); - b = new Fl_Box(0, 10, 630, 25, gettext("Existed data arrays")); b->labeltype(FL_ENGRAVED_LABEL); - b = new Fl_Box(0, 35, 220, 25, gettext("name")); - b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - b = new Fl_Box(220, 35, 205, 25, gettext("dimensions")); - b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - b = new Fl_Box(425, 35, 205, 25, gettext("mem. usage")); - b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - - w->var = new Fl_Select_Browser(0, 60, 630, 335); w->var->column_char('\t'); - w->var->align(FL_ALIGN_TOP); w->var->column_widths(widths); - w->var->tooltip(gettext("List of available data.")); -// g->end(); - - o = new Fl_Button(10, 400, 95, 25, gettext("Edit")); o->callback(mem_dlg_cb0,w); - o->tooltip(gettext("Open table with selected data for editing.")); - o = new Fl_Button(120, 400, 95, 25, gettext("Plot")); o->callback(mem_dlg_cb1,w); - o->tooltip(gettext("Plot selected data.")); - o = new Fl_Button(230, 400, 95, 25, gettext("Delete")); o->callback(mem_dlg_cb2,w); - o->tooltip(gettext("Delete selected data.")); - o = new Fl_Button(340, 400, 95, 25, gettext("New")); o->callback(mem_dlg_cb3,w); - o->tooltip(gettext("Open dialog for new data creation.")); - o = new Fl_Button(450, 400, 95, 25, gettext("Refresh")); o->callback(mem_update_cb,w); - o->tooltip(gettext("Refresh list of variables.")); -// o = new Fl_Button(120, 335, 95, 25, gettext("Load")); o->callback(mem_dlg_cb,(void *)4); -// o = new Fl_Button(230, 335, 95, 25, gettext("Save")); o->callback(mem_dlg_cb,(void *)5); -// o = new Fl_Button(10, 370, 95, 25, gettext("Update")); o->callback(mem_upd_cb,0); - wnd->end(); wnd->resizable(w->var); return wnd; -} -//----------------------------------------------------------------------------- -void ScriptWindow::mem_init() -{ - char str[128]; - var->clear(); - mglVar *v=Parse->Self()->DataList; - while(v) - { - sprintf(str,"%ls\t%ld*%ld*%ld\t%ld\t", v->s.c_str(), v->d.nx, v->d.ny, - v->d.nz, 4*v->d.nx*v->d.ny*v->d.nz); - var->add(str,v); - v = v->next; - } -} -//----------------------------------------------------------------------------- -void ScriptWindow::mem_pressed(int kind) -{ - TableWindow *w; - int ind = var->value(); - mglVar *v = (mglVar *)var->data(ind); - static char res[128]; - if(!v && kind!=3) return; - if(kind==0) - { - w = (TableWindow *)v->o; - if(!w) - { - char ss[1024]; - wcstombs(ss,v->s.c_str(),1024); ss[v->s.length()]=0; - ltab->begin(); - Fl_Group *gg = new Fl_Group(0,30,300,430); - w = new TableWindow(0,30,300,430); - gg->label(ss); gg->end(); ltab->end(); - } - w->update(v); ltab->value(w->parent()); w->show(); - } - else if(kind==1) - { - if(v->d.nz>1) sprintf(res,"box\nsurf3 %ls\n",v->s.c_str()); - else if(v->d.ny>1) sprintf(res,"box\nsurf %ls\n",v->s.c_str()); - else sprintf(res,"box\nplot %ls\n",v->s.c_str()); - textbuf->text(res); - } - else if(kind==2) - { - if(Parse->Self()->DataList==v) Parse->Self()->DataList = v->next; - delete v; - } - else if(kind==3) - { - const char *name = fl_input(gettext("Enter name for new variable"),"dat"); - if(!name) return; - v = Parse->Self()->AddVar(name); - - ltab->begin(); - Fl_Group *gg = new Fl_Group(0,30,300,430); - w = new TableWindow(0,30,300,430); - gg->label(name); gg->end(); ltab->end(); - w->update(v); ltab->value(w->parent()); w->show(); - } - mem_init(); -} -//----------------------------------------------------------------------------- -void variables_cb(Fl_Widget *, void *v) -{ -/* MemDlg *s = &mem_dlg; - s->wnd->set_modal(); - s->init(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait();*/ -} -//----------------------------------------------------------------------------- diff --git a/mgllab/main.cpp b/mgllab/main.cpp deleted file mode 100644 index 3f94e74..0000000 --- a/mgllab/main.cpp +++ /dev/null @@ -1,299 +0,0 @@ -/* main.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -char title[256]; -int num_windows = 0, auto_exec=1, plastic_scheme=1, internal_font=0; -Fl_Preferences pref(Fl_Preferences::USER,"abalakin","UDAV"); -//----------------------------------------------------------------------------- -void set_title(Fl_Window* w) -{ - if (filename[0] == '\0') strcpy(title, "Untitled"); - else - { - char *slash; - slash = strrchr(filename, '/'); -#ifdef WIN32 - if (slash == NULL) slash = strrchr(filename, '\\'); -#endif - if (slash != NULL) strcpy(title, slash + 1); - else strcpy(title, filename); - } - if (changed) strcat(title, gettext(" (modified)")); - w->label(title); -} -//----------------------------------------------------------------------------- -void fname_cb(Fl_Widget*, void *v) -{ - ScriptWindow* e = (ScriptWindow*)v; - char *file = fl_file_chooser(gettext("Insert File Name?"), gettext("All Files (*)"), 0); - if(file) - { - char *str = new char[strlen(file)+4]; - sprintf(str," '%s'",file); - e->editor->insert(str); - delete []str; - } -} -//----------------------------------------------------------------------------- -void new_cb(Fl_Widget*, void*) -{ - if (!check_save()) return; - filename[0] = '\0'; - textbuf->select(0, textbuf->length()); - textbuf->remove_selection(); - changed = 0; - textbuf->call_modify_callbacks(); -} -//----------------------------------------------------------------------------- -void open_cb(Fl_Widget*, void *v) -{ - if (!check_save()) return; - char *lastname=0; - if(*filename==0) { pref.get("last_file",lastname,""); strcpy(filename, lastname); } - char *newfile = fl_file_chooser(gettext("Open File?"), - gettext("MGL Files (*.mgl)\tDAT Files (*.{dat,csv})\tAll Files (*)"), filename); - if(lastname) free(lastname); - if(newfile != NULL) - { - load_file(newfile, -1); - if(auto_exec) ((ScriptWindow*)v)->graph->update(); - } -} -//----------------------------------------------------------------------------- -void close_cb(Fl_Widget*, void* v) -{ - Fl_Window* w = (Fl_Window*)v; - if (num_windows == 1 && !check_save()) return; - - w->hide(); - textbuf->remove_modify_callback(changed_cb, w); - delete w; - num_windows--; - if (!num_windows) exit(0); -} -//----------------------------------------------------------------------------- -void quit_cb(Fl_Widget*, void*) -{ - if (changed && !check_save()) return; - exit(0); -} -//----------------------------------------------------------------------------- -void save_cb(Fl_Widget*w, void*v) -{ - if (filename[0] == '\0') { saveas_cb(w,v); return; } // No filename - get one! - else save_file(filename); -} -//----------------------------------------------------------------------------- -void saveas_cb(Fl_Widget*, void*) -{ - char *newfile, *fname=0; - FILE *fp=0; - while(1) - { - newfile = fl_file_chooser(gettext("Save File As?"), "*.mgl", filename); - if(!newfile || !newfile[0]) break; - if(!strchr(newfile,'.')) - { - if(fname) delete []fname; - fname = new char[strlen(newfile)+5]; - strcpy(fname,newfile); strcat(fname,".mgl"); - newfile = fname; - } - fp = fopen(newfile,"r"); - if(fp) - { - fclose(fp); - if(fl_choice(gettext("File is exesist. Overwrite it?"),0,gettext("No"),gettext(" Yes "))==2) - break; - } - else break; - } - if (newfile != NULL) save_file(newfile); - if(fname) delete []fname; -} -//----------------------------------------------------------------------------- -ScriptWindow *new_view(); -//----------------------------------------------------------------------------- -void view_cb(Fl_Widget*, void*) -{ Fl_Window* w = new_view(); w->show(); } -//----------------------------------------------------------------------------- -void hint_cb(Fl_Widget*, void*) {} -//----------------------------------------------------------------------------- -Fl_Menu_Item menuitems[] = { - { gettext("File"), 0, 0, 0, FL_SUBMENU }, - { gettext("New File"), 0, new_cb }, - { gettext("Open File..."), FL_CTRL + 'o', open_cb }, - { gettext("Insert File..."), FL_CTRL + 'i', insert_cb }, - { gettext("Save File"), FL_CTRL + 's', save_cb }, - { gettext("Save File As..."), FL_CTRL + FL_SHIFT + 's', saveas_cb, 0, FL_MENU_DIVIDER }, -/* { gettext("Export"), 0, 0, 0, FL_SUBMENU }, - { gettext("... as PNG"), FL_ALT + 'p', export_png_cb }, - { gettext("... as PNG (solid)"), FL_ALT + 'f', export_pngn_cb }, - { gettext("... as JPEG"), FL_ALT + 'j', export_jpeg_cb }, - { gettext("... as SVG"), FL_ALT + 's', export_svg_cb }, - { gettext("... as vector EPS"), FL_ALT + 'e', export_eps_cb }, - { gettext("... as bitmap EPS"), 0, export_bps_cb, 0, FL_MENU_DIVIDER }, - {0},*/ - { gettext("New View"), FL_ALT + 'w', view_cb }, - { gettext("Close View"), FL_CTRL + 'w', close_cb, 0, FL_MENU_DIVIDER }, - { gettext("Exit"), FL_ALT + 'x', quit_cb }, - { 0 }, - { gettext("Edit"), 0, 0, 0, FL_SUBMENU }, - { gettext("Cut"), FL_CTRL + 'x', cut_cb }, - { gettext("Copy"), FL_CTRL + 'c', copy_cb }, - { gettext("Paste"), FL_CTRL + 'v', paste_cb }, - { gettext("Delete"), 0, delete_cb, 0, FL_MENU_DIVIDER }, - { gettext("Insert"), 0, 0, 0, FL_SUBMENU }, - { gettext("options"), FL_ALT + 'o', option_cb }, - { gettext("style"), FL_ALT + 'i', style_cb }, - { gettext("filename"), 0, fname_cb }, - { gettext("command"), FL_ALT + 'c', command_cb }, - { 0 }, - { gettext("Properties"), 0, settings_cb }, - { 0 }, - { gettext("Search"), 0, 0, 0, FL_SUBMENU }, - { gettext("Find..."), FL_CTRL + 'f', find_cb }, - { gettext("Find Again"), FL_F + 3, find2_cb }, - { gettext("Replace..."), FL_CTRL + 'r', replace_cb }, - { gettext("Replace Again"), FL_F + 4, replace2_cb }, - { 0 }, -/* { gettext("Animate"), 0, 0, 0, FL_SUBMENU }, - { gettext("Slideshow"), FL_CTRL + FL_F + 5, sshow_cb, 0, FL_MENU_TOGGLE }, - { gettext("Next slide"),0, snext_cb }, - { gettext("Prev slide"),0, sprev_cb }, - { gettext("Parameters"),0, animate_cb }, - { 0 }, - { gettext("Graphics"), 0, 0, 0, FL_SUBMENU }, - { gettext("Alpha"), FL_ALT + 'a', alpha_cb, 0, FL_MENU_TOGGLE }, - { gettext("Light"), FL_ALT + 'l', light_cb, 0, FL_MENU_TOGGLE }, - { gettext("Settings"), FL_F + 2, setup_cb }, - { gettext("Copy graphics"), 0, 0, 0, FL_MENU_INACTIVE|FL_MENU_DIVIDER}, - { gettext("Normal view"), FL_ALT + ' ', norm_cb }, - { gettext("Execute script"),FL_F + 5, draw_cb }, - { gettext("Adjust size"), FL_F + 6, adjust_cb }, - { gettext("Reload data"), FL_F + 9, oncemore_cb }, - { gettext("Script arguments"), 0, argument_cb }, - { 0 },*/ -/* { gettext("Data"), 0, 0, 0, FL_SUBMENU }, - { gettext("Edit data"), FL_ALT + 'd', table_cb }, - { gettext("List of data"), FL_ALT + 'v', variables_cb }, - { gettext("Reload data"), FL_F + 9, oncemore_cb }, - { 0 },*/ - { gettext("Help"), 0, 0, 0, FL_SUBMENU }, - { gettext("MGL Help"), FL_F + 1, help_cb }, - { gettext("MGL Examples"), 0, example_cb }, - { gettext("Hints and FAQ"), 0, hint_cb , 0, FL_MENU_INACTIVE}, - { gettext("About UDAV"), 0, about_cb }, - { 0 }, - { 0 } -}; -//----------------------------------------------------------------------------- -void mem_upd_cb(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_init(); } -//----------------------------------------------------------------------------- -ScriptWindow *new_view() -{ - Fl_Tabs* tt; - Fl_Group *gg; - ScriptWindow *w = new ScriptWindow(930, 510, title); - w->begin(); - w->menu = new Fl_Menu_Bar(0, 0, 930, 30); - w->menu->copy(menuitems, w); - - Fl_Tile *t = new Fl_Tile(0,30,930,455); - tt = new Fl_Tabs(0,30,300,455,0); tt->box(UDAV_UP_BOX); - gg = new Fl_Group(0,30,300,430); gg->label(gettext("Script")); - add_editor(w); gg->end(); - tt->end(); w->ltab = tt; - - tt = new Fl_Tabs(300,30,930,455,0); tt->box(UDAV_UP_BOX); - w->graph = new Fl_MGL(300,30,930,430,gettext("Canvas")); - gg = new Fl_Group(300,30,930,430,gettext("Help")); - add_help(w); gg->end(); w->ghelp = gg; - gg = new Fl_Group(300,30,930,430,gettext("Memory")); - add_mem(w); gg->end(); - tt->end(); w->rtab = tt; - - w->status = new Fl_Box(0,485,930,25,"Ready"); - w->status->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - w->status->color(FL_BACKGROUND_COLOR); - w->status->box(FL_DOWN_BOX); - w->graph->status = w->status; - - t->end(); t->resizable(t); - w->end(); w->resizable(t); - tt->callback(mem_upd_cb, w); - w->callback((Fl_Callback *)close_cb, w); - - num_windows++; - return w; -} -//----------------------------------------------------------------------------- -void argument_set(int n, const char *s); -int main(int argc, char **argv) -{ -// Fl::lock(); - mgl_ask_func = mgl_ask_fltk; - char *buf, *buf2; - pref.get("locale",buf,"ru_RU.cp1251"); setlocale(LC_CTYPE, buf); free(buf); - pref.get("plastic_scheme",plastic_scheme,1); - pref.get("internal_font",internal_font,0); - pref.get("auto_exec",auto_exec,1); -#ifdef USE_GETTEXT -// setlocale (LC_NUMERIC, ""); -// bindtextdomain (PACKAGE, LOCALEDIR); -// textdomain (PACKAGE); -#endif - - Fl::visual(FL_DOUBLE); - if(plastic_scheme) Fl::scheme("plastic"); -#ifdef DOC_DIR - char dir[64]; - if(!pref.get("help_dir",dir,"",64)); - pref.set("help_dir",DOC_DIR); -#endif - textbuf = new Fl_Text_Buffer; - style_init(); - ScriptWindow *w = new_view(); - - pref.get("font_dir",buf2,""); - pref.get("font_name",buf,""); - mgl_load_font(w->graph->FMGL->get_graph(),buf,buf2); - if(buf) free(buf); - if(buf2) free(buf2); - - w->show(1, argv); - for(int i=1;igraph->update(); - } - else - { - char ch = argv[i][1]; - if(ch>='0' && ch<='9') argument_set(ch-'0',argv[i]+2); - } - } - return Fl::run(); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/mathgl.cpp b/mgllab/mathgl.cpp deleted file mode 100644 index f32b001..0000000 --- a/mgllab/mathgl.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* mathgl.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "mgl2/mgl.h" -#include "udav.h" -//----------------------------------------------------------------------------- -#include "xpm/alpha.xpm" -#include "xpm/light.xpm" -#include "xpm/alpha_on.xpm" -#include "xpm/light_on.xpm" -#include "xpm/zoom-fit-best.xpm" -#include "xpm/zoom-fit-best-r.xpm" -#include "xpm/film-r.xpm" -#include "xpm/film-b.xpm" -#include "xpm/media-seek-forward.xpm" -#include "xpm/media-seek-backward.xpm" -#include "xpm/go-previous.xpm" -#include "xpm/go-next.xpm" -#include "xpm/go-down.xpm" -#include "xpm/zoom-out.xpm" -#include "xpm/zoom-in.xpm" -#include "xpm/go-up.xpm" -#include "xpm/zoom-original.xpm" -#include "xpm/view-refresh.xpm" -#include "xpm/rotate.xpm" -#include "xpm/rotate_on.xpm" -#include "xpm/document-properties.xpm" -//#include "xpm/preferences-system.xpm" -#include "xpm/wire.xpm" -//----------------------------------------------------------------------------- -extern int internal_font; -mglParse *Parse=0; -void get_doc_dir(char *&docdir); -//----------------------------------------------------------------------------- -void udav_error(const char *Message, void *v) -{ ((Fl_MGL*)v)->status->label(Message); } -mreal udav_delay(void *v) -{ return ((Fl_MGL*)v)->AnimDelay; } -void udav_reload(void *v) -{ Parse->RestoreOnce(); ((Fl_MGL*)v)->update(); } -//----------------------------------------------------------------------------- -void udav_next(void *v) { ((Fl_MGL*)v)->next_frame(); } -void Fl_MGL::next_frame() -{ - if(NArgs==0) - { - animate_cb(this,this); - if(NArgs==0) return; - } - ArgCur = (ArgCur+1) % NArgs; - Parse->AddParam(0,Args[ArgCur]); - update(); -} -//----------------------------------------------------------------------------- -void udav_prev(void *v) { ((Fl_MGL*)v)->prev_frame(); } -void Fl_MGL::prev_frame() -{ - if(NArgs==0) - { - animate_cb(this,this); - if(NArgs==0) return; - } - ArgCur = ArgCur>0 ? ArgCur-1 : NArgs-1; - Parse->AddParam(0,Args[ArgCur]); - update(); -} -//----------------------------------------------------------------------------- -Fl_MGL::Fl_MGL(int x, int y, int w, int h, char *label) : Fl_MGLView(x,y,w,h,label) -{ - if(!Parse) Parse = new mglParse; - Parse->AllowSetSize(true); - ArgBuf = 0; NArgs = ArgCur = 0; - script = script_pre = 0; par = this; - next = udav_next; delay = udav_delay; - prev = udav_prev; reload = udav_reload; -/*#ifdef WIN32 -// setlocale(LC_TYPE,"russian_Russia.CP1251"); - char *path; - get_doc_dir(path); - if(!FMGL->GetFont()->Load("STIX",path && path[0] ? path : ".")) FMGL->GetFont()->Restore(); - free(path); -#endif*/ -} -//----------------------------------------------------------------------------- -Fl_MGL::~Fl_MGL() { clear_scripts(); if(ArgBuf) delete []ArgBuf; } -//----------------------------------------------------------------------------- -void Fl_MGL::clear_scripts() -{ - if(script) free(script); - if(script_pre) free(script_pre); -} -//----------------------------------------------------------------------------- -void Fl_MGL::scripts(char *scr, char *pre) -{ clear_scripts(); script=scr; script_pre=pre; } -//----------------------------------------------------------------------------- -int Fl_MGL::Draw(mglGraph *gr) -{ - Parse->Execute(gr,script_pre); - Parse->Execute(gr,script); - status->label(gr->Message()); - return 0; -} -//----------------------------------------------------------------------------- -void Fl_MGL::update() -{ - // NOTE: hint for old style View(). May be I should remove it! - if(!script || !strstr(script,"rotate")) mgl_rotate(FMGL->get_graph(),0,0,0); - - Fl_MGLView::update(); - - mglVar *v = Parse->Self()->DataList; - while(v) - { - if(v->o) ((TableWindow *)v->o)->update(v); - v = v->next; - } -} -//----------------------------------------------------------------------------- -void add_suffix(char *fname, const char *ext) -{ - long n=strlen(fname); - if(n>4 && fname[n-4]=='.') - { fname[n-3]=ext[0]; fname[n-2]=ext[1]; fname[n-1]=ext[2]; } - else { strcat(fname,"."); strcat(fname,ext); } - -} -//----------------------------------------------------------------------------- diff --git a/mgllab/option.cpp b/mgllab/option.cpp deleted file mode 100644 index d107abd..0000000 --- a/mgllab/option.cpp +++ /dev/null @@ -1,439 +0,0 @@ -/* option.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -extern Fl_Menu_Item colors[]; -extern Fl_Text_Buffer *textbuf; -//----------------------------------------------------------------------------- -struct OptionDlg -{ -public: - Fl_Window* wnd; - int OK; - char result[256]; - OptionDlg() { memset(this,0,sizeof(OptionDlg)); create_dlg(); }; - ~OptionDlg() { delete wnd; }; - void FillResult(); -protected: - Fl_Input *xmin, *xmax, *ymin, *ymax, *zmin, *zmax, *cmin, *cmax; - Fl_Input *alpha, *amb, *mesh, *font; - Fl_Choice *cut; - - void create_dlg(); -} option_dlg; -//----------------------------------------------------------------------------- -struct StyleDlg -{ -public: -friend void style_set_cb(Fl_Widget *, void *v); -friend void style_rdo_cb(Fl_Widget *, void *v); -friend void font_cb(Fl_Widget *, void *v); -friend void line_cb(Fl_Widget *, void *v); -friend void face_cb(Fl_Widget *, void *v); - Fl_Window* wnd; - int OK; - char result[16]; - StyleDlg() { memset(this,0,sizeof(StyleDlg)); create_dlg(); }; - ~StyleDlg() { delete wnd; }; -protected: - Fl_Tabs *tab; - Fl_Group *ltab, *stab, *ftab; - Fl_Choice *cl, *cf, *c[7], *ae, *as; - Fl_Choice *dash, *mark, *dir, *text; - Fl_Spinner *lw; - Fl_Output *res; - Fl_Check_Button *d, *w, *sc, *rm, *it, *bf, *gt; - Fl_Round_Button *rl, *rc, *rr; - - void create_dlg(); -} style_dlg; -//----------------------------------------------------------------------------- -void option_dlg_cb(Fl_Widget *, void *v) -{ option_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void style_dlg_cb(Fl_Widget *, void *v) -{ style_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void OptionDlg::create_dlg() -{ - Fl_Button *o; - wnd = new Fl_Window(490, 180, gettext("Command options")); - new Fl_Box(10, 15, 75, 25, gettext("X-Range")); - xmin = new Fl_Input(85, 15, 75, 25); - xmin->tooltip(gettext("Minimal value of X for cutting or for coordinate filling")); - xmax = new Fl_Input(165, 15, 75, 25); - xmax->tooltip(gettext("Maximal value of X for cutting or for coordinate filling")); - new Fl_Box(245, 15, 75, 25, gettext("Y-Range")); - ymin = new Fl_Input(320, 15, 75, 25); - ymin->tooltip(gettext("Minimal value of Y for cutting or for coordinate filling")); - ymax = new Fl_Input(400, 15, 75, 25); - ymax->tooltip(gettext("Maximal value of Y for cutting or for coordinate filling")); - new Fl_Box(10, 45, 75, 25, gettext("Z-Range")); - zmin = new Fl_Input(85, 45, 75, 25); - zmin->tooltip(gettext("Minimal value of Z for cutting or for coordinate filling")); - zmax = new Fl_Input(165, 45, 75, 25); - zmax->tooltip(gettext("Maximal value of Z for cutting or for coordinate filling")); - new Fl_Box(245, 45, 75, 25, gettext("C-Range")); - cmin = new Fl_Input(320, 45, 75, 25); - cmin->tooltip(gettext("Low border for determining color or alpha")); - cmax = new Fl_Input(400, 45, 75, 25); - cmax->tooltip(gettext("Upper border for determining color or alpha")); - { Fl_Box *o = new Fl_Box(15, 75, 460, 5); o->box(FL_UP_BOX); } - alpha = new Fl_Input(25, 105, 75, 25, "Alpha"); alpha->align(FL_ALIGN_TOP); - alpha->tooltip(gettext("Alpha value (transparency) of surface or cloud")); - amb = new Fl_Input(110, 105, 75, 25, gettext("Ambient")); amb->align(FL_ALIGN_TOP); - amb->tooltip(gettext("Own brightness of the surface")); - mesh = new Fl_Input(195, 105, 75, 25, gettext("Mesh Num")); mesh->align(FL_ALIGN_TOP); - mesh->tooltip(gettext("Approximate number of mesh lines in plot")); - font = new Fl_Input(280, 105, 75, 25, gettext("Font Size")); font->align(FL_ALIGN_TOP); - font->tooltip(gettext("Act as default value for font size")); - cut = new Fl_Choice(365, 105, 75, 25, gettext("Cutting")); cut->align(FL_ALIGN_TOP); - cut->add(gettext("on")); cut->add(gettext("off")); - cut->tooltip(gettext("Set cutting off/on for particular plot")); - - o = new Fl_Button(320, 145, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(405, 145, 75, 25, gettext("OK")); o->callback(option_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void OptionDlg::FillResult() -{ - double x1=0,y1=0,z1=0,x2=0,y2=0,z2=0; - bool u1,v1,w1,u2,v2,w2; - char str[64]; - result[0]=0; - - u1 = xmin->value()[0]; if(u1) x1 = atof(xmin->value()); - u2 = xmax->value()[0]; if(u2) x2 = atof(xmax->value()); - v1 = ymin->value()[0]; if(v1) y1 = atof(ymin->value()); - v2 = ymin->value()[0]; if(v2) y2 = atof(ymax->value()); - w1 = zmin->value()[0]; if(w1) z1 = atof(zmin->value()); - w2 = zmin->value()[0]; if(w2) z2 = atof(zmax->value()); - if(u1 && u2) {sprintf(str,"; xrange %g %g",x1,x2); strcat(result,str);} - if(v1 && v2) {sprintf(str,"; yrange %g %g",y1,y2); strcat(result,str);} - if(w1 && w2) {sprintf(str,"; zrange %g %g",z1,z2); strcat(result,str);} - - u1 = cmin->value()[0]; if(u1) x1 = atof(cmin->value()); - u2 = cmax->value()[0]; if(u2) x2 = atof(cmax->value()); - if(u1&&u2) {sprintf(str,"; crange %g %g",x1,x2); strcat(result,str);} - - if(alpha->value()[0]) - { sprintf(str,"; alpha %g",atof(alpha->value())); strcat(result,str);} - if(amb->value()[0]) - { sprintf(str,"; ambient %g",atof(amb->value())); strcat(result,str);} - if(mesh->value()[0]) - { sprintf(str,"; meshnum %g",atof(mesh->value()));strcat(result,str);} - if(font->value()[0]) - { sprintf(str,"; fontsize '%g'",atof(font->value())); strcat(result,str);} - if(cut->value()>=0) - {sprintf(str,"; cut %s",cut->value()==0?"on":"off"); strcat(result,str);} -} -//----------------------------------------------------------------------------- -void option_cb(Fl_Widget *, void *v) -{ - ScriptWindow* e = (ScriptWindow*)v; - OptionDlg *s = &option_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // insert at the end of string - { - long i=e->editor->insert_position(), j=textbuf->line_end(i); - s->FillResult(); - e->editor->insert_position(j); - e->editor->insert(s->result); - } -} -//----------------------------------------------------------------------------- -void option_in_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input*)v; - OptionDlg *s = &option_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) - { - s->FillResult(); - e->value(s->result); - } -} -//----------------------------------------------------------------------------- -Fl_Menu_Item arrows[] = { - {("none")}, //_ - {("arrow")}, //A - {("back arrow")}, //V - {("stop")}, //I - {("size")}, //K - {("triangle")}, //T - {("square")}, //S - {("rhomb")}, //D - {("circle")}, //O - {0}}; -//----------------------------------------------------------------------------- -Fl_Menu_Item dashing[] = { - {("solid")}, //- - {("dash")}, //| - {("dash dot")}, //j - {("small dash")}, //; - {("small dash dot")}, //i - {("dots")}, //: - {("none")}, // - {0}}; -//----------------------------------------------------------------------------- -Fl_Menu_Item markers[] = { - {("none")}, // - {("circle")}, //o - {("cross")}, //+ - {("skew cross")}, //x - {("square")}, //s - {("rhomb")}, //d - {("point")}, //. - {("triangle up")}, //^ - {("triangle down")}, //v - {0}}; -//----------------------------------------------------------------------------- -void style_set_cb(Fl_Widget *,void *) -{ - StyleDlg *s = &style_dlg; - Fl_Widget *t = s->tab->value(); - const char *cols = " wbgrcmylenuqphkWBGRCMYLENUQPH"; - char *r = s->result; - long i=0,j; - if(t==s->ltab) // line style - { - const char *aa = "_AVIKTSDO", *dd="-|j;i: ", *mm="#o+xsd.^v"; - if(s->cl->value()>0) r[i++]=cols[s->cl->value()]; - if(s->dash->value()>0) r[i++]=dd[s->dash->value()]; - if(s->mark->value()>0) r[i++]=mm[s->mark->value()]; - if(s->lw->value()>1 || s->lw->value()==0) - r[i++] = '0'+int(0.1+s->lw->value()); - if(s->as->value()>0) - { r[i++]=aa[s->ae->value()]; r[i++]=aa[s->as->value()]; } - else if(s->ae->value()>0) r[i++]=aa[s->ae->value()]; - } - else if(t==s->stab) // surf style - { - for(j=0;j<7;j++) - { - if(s->c[j]->value()>0) r[i++]=cols[s->c[j]->value()]; - else break; - } - if(s->d->value()) r[i++] = 'd'; - if(s->w->value()) r[i++] = '#'; - if(s->dir->value()>=0) r[i++] = 'x'+s->dir->value(); - if(s->text->value()>0) r[i++] = s->text->value()==1 ? 't':'T'; - } - else if(t==s->ftab) // text style - { - if(s->rm->value()) r[i++] = 'r'; - if(s->sc->value()) r[i++] = 's'; - if(s->it->value()) r[i++] = 'i'; - if(s->bf->value()) r[i++] = 'b'; - if(s->gt->value() && !s->rm->value()) r[i++] = 'g'; - if(s->rl->value()) r[i++] = 'L'; - else if(s->rc->value()) r[i++] = 'C'; - else if(s->rr->value()) r[i++] = 'R'; - if(s->cf->value()>0) - { r[i++]=':'; r[i++]=cols[s->cf->value()]; } - } - r[i]=0; - s->res->value(r); -} -//----------------------------------------------------------------------------- -void style_rdo_cb(Fl_Widget *,void *v) -{ - StyleDlg *s = &style_dlg; - s->rl->value(0); s->rc->value(0); s->rr->value(0); - ((Fl_Round_Button *)v)->value(1); - style_set_cb(0,0); -} -//----------------------------------------------------------------------------- -void StyleDlg::create_dlg() -{ - wnd = new Fl_Window(295, 337, gettext("String with line/surf/text style")); - tab = new Fl_Tabs(0, 0, 295, 255); tab->callback(style_set_cb); - tab->box(UDAV_UP_BOX); - - ltab = new Fl_Group(0, 25, 295, 230, gettext("Line style")); - as = new Fl_Choice(10, 50, 80, 25, gettext("Arrow at start")); - as->align(FL_ALIGN_TOP); as->copy(arrows); as->callback(style_set_cb); -// as->tooltip(gettext("Type of arrow at first point of line or curve")); - dash = new Fl_Choice(110, 50, 80, 25, gettext("Dashing")); - dash->align(FL_ALIGN_TOP); dash->copy(dashing);dash->callback(style_set_cb); -// dash->tooltip(gettext("Type dashing for line or curve")); - ae = new Fl_Choice(210, 50, 80, 25, gettext("Arrow at end")); - ae->align(FL_ALIGN_TOP); ae->copy(arrows); ae->callback(style_set_cb); -// ae->tooltip(gettext("Type of arrow at last point of line or curve")); - cl = new Fl_Choice(110, 85, 80, 25, gettext("Color")); cl->copy(colors); - cl->callback(style_set_cb); - mark = new Fl_Choice(110, 120, 80, 25, gettext("Marks")); - mark->copy(markers); mark->callback(style_set_cb); -// mark->tooltip(gettext("Type of marks at positions of data points")); - lw = new Fl_Spinner(110, 155, 80, 25, gettext("Line width")); - lw->range(0,9); lw->step(1); lw->callback(style_set_cb); -// lw->tooltip(gettext("Relative width of line or curve")); - ltab->end(); - - stab = new Fl_Group(0, 25, 295, 230, gettext("Color scheme")); stab->hide(); - c[0] = new Fl_Choice(15, 45, 75, 25, gettext("Color order")); - c[0]->align(FL_ALIGN_TOP); c[0]->copy(colors); c[0]->callback(style_set_cb); - c[1] = new Fl_Choice(15, 75, 75, 25); c[1]->copy(colors); c[1]->callback(style_set_cb); - c[2] = new Fl_Choice(15, 105, 75, 25); c[2]->copy(colors); c[2]->callback(style_set_cb); - c[3] = new Fl_Choice(15, 135, 75, 25); c[3]->copy(colors); c[3]->callback(style_set_cb); - c[4] = new Fl_Choice(15, 165, 75, 25); c[4]->copy(colors); c[4]->callback(style_set_cb); - c[5] = new Fl_Choice(15, 195, 75, 25); c[5]->copy(colors); c[5]->callback(style_set_cb); - c[6] = new Fl_Choice(15, 225, 75, 25); c[6]->copy(colors); c[6]->callback(style_set_cb); - d = new Fl_Check_Button(100, 45, 180, 25, gettext("Colors along coordinates")); -// w->tooltip(gettext("Set face color proportional to its position")); - d->callback(style_set_cb); - w = new Fl_Check_Button(100, 75, 180, 25, gettext("Wire or mesh plot")); - w->callback(style_set_cb); -// w->tooltip(gettext("Switch to draw wire isosurface or set to draw mesh on surface")); - dir = new Fl_Choice(210, 105, 75, 25, gettext("Axial direction")); - dir->add("x"); dir->add("y"); dir->add("z"); dir->callback(style_set_cb); - text = new Fl_Choice(210, 135, 75, 25, gettext("Text on contours")); -// text->tooltip("Draw contour values near contour lines")); - text->add(gettext("none")); text->add(gettext("under")); - text->add(gettext("above")); text->callback(style_set_cb); - stab->end(); - - ftab = new Fl_Group(0, 25, 295, 230, gettext("Text style")); ftab->hide(); - sc = new Fl_Check_Button(15, 40, 120, 25, gettext("Script font/style")); sc->callback(style_set_cb); - rm = new Fl_Check_Button(15, 70, 120, 25, gettext("Roman font")); rm->callback(style_set_cb); - gt = new Fl_Check_Button(15, 100, 120, 25, gettext("Gothic font")); gt->callback(style_set_cb); - it = new Fl_Check_Button(15, 130, 120, 25, gettext("Italic style")); it->callback(style_set_cb); - bf = new Fl_Check_Button(15, 160, 120, 25, gettext("Bold style")); bf->callback(style_set_cb); - cf = new Fl_Choice(200, 40, 80, 25, gettext("Text color")); cf->copy(colors);cf->callback(style_set_cb); - { Fl_Box* o = new Fl_Box(160, 90, 120, 90, gettext("Alignment")); - o->box(FL_DOWN_BOX); o->align(FL_ALIGN_TOP);} - rl = new Fl_Round_Button(170, 100, 100, 25, gettext("left")); rl->callback(style_rdo_cb,rl); - rc = new Fl_Round_Button(170, 125, 100, 25, gettext("at center")); rc->callback(style_rdo_cb,rc); - rr = new Fl_Round_Button(170, 150, 100, 25, gettext("right")); rr->callback(style_rdo_cb,rr); - ftab->end(); - - tab->end(); - res = new Fl_Output(50, 265, 235, 25, gettext("Result")); -// res->tooltip(gettext("Resulting string which will be used as argument of a command")); - Fl_Button *o; - o = new Fl_Button(125, 300, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(210, 300, 75, 25, gettext("OK")); o->callback(style_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void style_cb(Fl_Widget *, void *v) -{ - ScriptWindow* e = (ScriptWindow*)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - { - int p,q; - char str[20]; - sprintf(str,"'%s'",s->result); - textbuf->selection_position(&p, &q); - if(p==q) e->editor->insert(str); - else textbuf->replace_selection(str); - } -} -//----------------------------------------------------------------------------- -void style_in_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input*)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) e->value(s->result); -} -//----------------------------------------------------------------------------- -void font_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input *)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->tab->value(s->ftab); - s->ltab->deactivate(); - s->stab->deactivate(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - e->value(s->result); - s->ltab->activate(); - s->stab->activate(); -} -//----------------------------------------------------------------------------- -void line_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input *)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->tab->value(s->ltab); - s->ftab->deactivate(); - s->stab->deactivate(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - e->value(s->result); - s->ftab->activate(); - s->stab->activate(); -} -//----------------------------------------------------------------------------- -void face_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input *)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->tab->value(s->stab); - s->ltab->deactivate(); - s->ftab->deactivate(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - e->value(s->result); - s->ltab->activate(); - s->ftab->activate(); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/setup.cpp b/mgllab/setup.cpp deleted file mode 100644 index f6304e4..0000000 --- a/mgllab/setup.cpp +++ /dev/null @@ -1,424 +0,0 @@ -/* setup.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "mgl2/mgl.h" -#include -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -extern int auto_exec, plastic_scheme, internal_font; -extern Fl_Preferences pref; -void get_doc_dir(char *&docdir); -//----------------------------------------------------------------------------- -void setup_dlg_cb(Fl_Widget *, void *v) -{ SetupDlg *s = (SetupDlg *)v; s->OK = true; s->wnd->hide(); } -//----------------------------------------------------------------------------- -void setup_sav_cb(Fl_Widget *, void *v) -{ - SetupDlg *e = (SetupDlg *)v; - char *buf = e->ToScript(); - const char *fname; - if(buf[0]) - { - fname = e->templ->value(); - if(fname[0]==0) fname = "template.mgl"; - FILE *fp = fopen(fname,"w"); - fputs(buf,fp); - fclose(fp); - } - free(buf); -} -//----------------------------------------------------------------------------- -void close_dlg_cb(Fl_Widget *, void *v) -{ ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void SetupDlg::CreateGen() -{ - xmin = new Fl_Input(105, 50, 75, 25); xmax = new Fl_Input(105, 80, 75, 25); - ymin = new Fl_Input(190, 50, 75, 25); ymax = new Fl_Input(190, 80, 75, 25); - zmin = new Fl_Input(275, 50, 75, 25); zmax = new Fl_Input(275, 80, 75, 25); - cmin = new Fl_Input(360, 50, 75, 25); cmax = new Fl_Input(360, 80, 75, 25); - - xorg = new Fl_Input(105, 110, 75, 25); - yorg = new Fl_Input(190, 110, 75, 25); - zorg = new Fl_Input(275, 110, 75, 25); - xlab = new Fl_Input(105, 140, 75, 25); - ylab = new Fl_Input(190, 140, 75, 25); - zlab = new Fl_Input(275, 140, 75, 25); - - xpos = new Fl_Choice(105, 170, 75, 25); xpos->add(gettext("at minumum")); - xpos->add("at center"); xpos->add(gettext("at maxumum")); xpos->value(1); - ypos = new Fl_Choice(190, 170, 75, 25); ypos->add(gettext("at minumum")); - ypos->add("at center"); ypos->add(gettext("at maxumum")); ypos->value(1); - zpos = new Fl_Choice(275, 170, 75, 25); zpos->add(gettext("at minumum")); - zpos->add("at center"); zpos->add(gettext("at maxumum")); zpos->value(1); - xtik = new Fl_Input(105, 200, 75, 25); - ytik = new Fl_Input(190, 200, 75, 25); - ztik = new Fl_Input(275, 200, 75, 25); - xsub = new Fl_Input(105, 230, 75, 25); - ysub = new Fl_Input(190, 230, 75, 25); - zsub = new Fl_Input(275, 230, 75, 25); - - { Fl_Box* o = new Fl_Box(10, 260, 470, 5); o->box(FL_DOWN_BOX); } - alphad = new Fl_Input(20, 285, 75, 25, gettext("AlphaDef")); alphad->align(FL_ALIGN_TOP); - ambient = new Fl_Input(105, 285, 75, 25, gettext("Ambient")); ambient->align(FL_ALIGN_TOP); - basew = new Fl_Input(190, 285, 75, 25, gettext("Base Width")); basew->align(FL_ALIGN_TOP); - mesh = new Fl_Input(275, 285, 75, 25, gettext("Mesh Num")); mesh->align(FL_ALIGN_TOP); - axial = new Fl_Choice(360, 285, 75, 25, gettext("Axial Dir")); axial->align(FL_ALIGN_TOP); - axial->add("x"); axial->add("y"); axial->add("z"); - font = new Fl_Input(20, 330, 50, 25, gettext("Font")); font->align(FL_ALIGN_TOP); - { Fl_Button* o = new Fl_Button(70, 330, 25, 25, ".."); o->callback(font_cb, font); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); } - size = new Fl_Input(105, 330, 75, 25, gettext("Font Size")); size->align(FL_ALIGN_TOP); - alpha = new Fl_Check_Button(190, 330, 75, 25, gettext("Alpha on")); - light = new Fl_Check_Button(275, 330, 75, 25, gettext("Light on")); - rotate = new Fl_Check_Button(360, 330, 90, 25, gettext("Rotate text")); -} -//----------------------------------------------------------------------------- -void SetupDlg::CreateLid() -{ - const char *str[10]={"0:", "1:", "2:", "3:", "4:", "5:", "6:", "7:", "8:", "9:"}; - int h; - for(long i=0;i<10;i++) - { - h = 55 + 30*i; - new Fl_Box(10, h, 25, 25, str[i]); - lid[i] = new Fl_Check_Button(35, h, 40, 25, gettext("on")); - xid[i] = new Fl_Input(85, h, 75, 25); - yid[i] = new Fl_Input(165, h, 75, 25); - zid[i] = new Fl_Input(245, h, 75, 25); - cid[i] = new Fl_Choice(325, h, 75, 25); - cid[i]->copy(colors); - bid[i] = new Fl_Input(405, h, 75, 25); - } -} -//----------------------------------------------------------------------------- -void SetupDlg::CreateDlg() -{ - OK = false; - wnd = new Fl_Window(490, 406, gettext("Setup graphics")); - Fl_Tabs* t = new Fl_Tabs(0, 0, 490, 360); t->box(UDAV_UP_BOX); - - Fl_Group *g = new Fl_Group(0, 25, 485, 330, gettext("General")); - new Fl_Box(105, 30, 75, 20, gettext("X axis")); - new Fl_Box(190, 30, 75, 20, gettext("Y axis")); - new Fl_Box(275, 30, 75, 20, gettext("Z axis")); - new Fl_Box(360, 30, 75, 20, gettext("Color")); - - new Fl_Box(25, 50, 75, 25, gettext("Minimal")); - new Fl_Box(25, 80, 75, 25, gettext("Maximal")); - new Fl_Box(25, 110, 75, 25, gettext("Origin")); - new Fl_Box(25, 140, 75, 25, gettext("Label")); - new Fl_Box(25, 170, 75, 25, gettext("Position")); - new Fl_Box(25, 200, 75, 25, gettext("Ticks")); - new Fl_Box(25, 230, 75, 25, gettext("SubTicks")); - CreateGen(); - g->end(); - - g = new Fl_Group(0, 25, 485, 330, gettext("Light")); g->hide(); - new Fl_Box(10, 30, 25, 25, gettext("ID")); - new Fl_Box(40, 30, 40, 25, gettext("State")); - new Fl_Box(85, 30, 75, 25, gettext("X position")); - new Fl_Box(165, 30, 75, 25, gettext("Y position")); - new Fl_Box(245, 30, 75, 25, gettext("Z position")); - new Fl_Box(325, 30, 75, 25, gettext("Color")); - new Fl_Box(405, 30, 75, 25, gettext("Brightness")); - CreateLid(); - g->end(); - - g = new Fl_Group(0, 25, 485, 330, gettext("Setup code")); g->hide(); - code = new Fl_Help_View(0, 25, 485, 330); - g->end(); - - t->end(); //Fl_Group::current()->resizable(t); - Fl_Button *o; - templ = new Fl_Input(120, 370, 110, 25, gettext("Template name")); - templ->value("template.mgl"); - o = new Fl_Button(230, 370, 80, 25, gettext("Save")); o->callback(setup_sav_cb, wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Save settings to file template.mgl.\nYou may use it later by 'call template.mgl'")); - - o = new Fl_Button(315, 370, 80, 25, gettext("Cancel")); o->callback(close_dlg_cb, wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(400, 370, 80, 25, gettext("OK")); o->callback(setup_dlg_cb, this); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -char *SetupDlg::ToScript() -{ - long i; - double x1=0,y1=0,z1=0,x2=0,y2=0,z2=0; - bool u1,v1,w1,u2,v2,w2; - const char *cols = " wbgrcmylenuqphkWBGRCMYLENUQPH"; - char *buf = (char *)malloc(1024*sizeof(char)), str[128]; - long num = 1024, cur = 0; - buf[0]=0; - if(!OK) return buf; - - for(i=0;i<10;i++) // set light sources - { -//fl_message("before %d lid:%d xid:%s yid:%s zid:%s",i,lid[i]->value(), xid[i]->value(),yid[i]->value(),zid[i]->value()); - if(!lid[i]->value()) continue; - if(!xid[i]->value()[0] || !yid[i]->value()[0] || !zid[i]->value()[0]) continue; - x1=atof(xid[i]->value()); y1=atof(yid[i]->value()); z1=atof(zid[i]->value()); - if(!bid[i]->value()[0]) - cur += sprintf(str,"light %ld %g %g %g '%c'\n",i,x1,y1,z1, - cols[cid[i]->value()]); - else - cur += sprintf(str,"light %ld %g %g %g '%c' %g\n",i,x1,y1,z1, - cols[cid[i]->value()],atof(bid[i]->value())); - strcat(buf,str); - } - u1 = xmin->value()[0]; if(u1) x1 = atof(xmin->value()); - u2 = xmax->value()[0]; if(u2) x2 = atof(xmax->value()); - v1 = ymin->value()[0]; if(v1) y1 = atof(ymin->value()); - v2 = ymin->value()[0]; if(v2) y2 = atof(ymax->value()); - w1 = zmin->value()[0]; if(w1) z1 = atof(zmin->value()); - w2 = zmin->value()[0]; if(w2) z2 = atof(zmax->value()); - if(u1&&v1&&w1&&u2&&v2&&w2) - { - cur+=sprintf(str,"axis %g %g %g %g %g %g\n",x1,y1,z1,x2,y2,z2); - strcat(buf,str); - } - else - { - if(u1 && u2) {cur+=sprintf(str,"xrange %g %g\n",x1,x2); strcat(buf,str);} - if(v1 && v2) {cur+=sprintf(str,"yrange %g %g\n",y1,y2); strcat(buf,str);} - if(w1 && w2) {cur+=sprintf(str,"zrange %g %g\n",z1,z2); strcat(buf,str);} - } - u1 = cmin->value()[0]; if(u1) x1 = atof(cmin->value()); - u2 = cmax->value()[0]; if(u2) x2 = atof(cmax->value()); - if(u1&&u2) {cur+=sprintf(str,"crange %g %g\n",x1,x2); strcat(buf,str);} - if(cur>num-256) { num+=512; buf = (char *)realloc(buf,num*sizeof(char)); } - - u1 = xorg->value()[0]; if(u1) x1 = atof(xorg->value()); - v1 = yorg->value()[0]; if(v1) y1 = atof(yorg->value()); - w1 = zorg->value()[0]; if(w1) z1 = atof(zorg->value()); - if(u1&&v1&&w1) {sprintf(str,"origin %g %g %g\n",x1,y1,z1); strcat(buf,str);} - - u1 = xtik->value()[0]; if(u1) x1 = atof(xtik->value()); - u2 = xsub->value()[0]; if(u2) x2 = atoi(xsub->value()); - v1 = ytik->value()[0]; if(v1) y1 = atof(ytik->value()); - v2 = ysub->value()[0]; if(v2) y2 = atoi(ysub->value()); - w1 = ztik->value()[0]; if(w1) z1 = atof(ztik->value()); - w2 = zsub->value()[0]; if(w2) z2 = atoi(zsub->value()); - if(u1 && u2) {cur+=sprintf(str,"xtick %g %g\n",x1,x2); strcat(buf,str);} - if(v1 && v2) {cur+=sprintf(str,"ytick %g %g\n",y1,y2); strcat(buf,str);} - if(w1 && w2) {cur+=sprintf(str,"ztick %g %g\n",z1,z2); strcat(buf,str);} - if(u1 && !u2) {cur+=sprintf(str,"xtick %g\n",x1); strcat(buf,str);} - if(v1 && !v2) {cur+=sprintf(str,"ytick %g\n",y1); strcat(buf,str);} - if(w1 && !w2) {cur+=sprintf(str,"ztick %g\n",z1); strcat(buf,str);} - - if(xlab->value()[0]) - { - cur+=sprintf(str,"xlabel '%s' %d\n",xlab->value(), xpos->value()-1); - strcat(buf,str); - } - if(ylab->value()[0]) - { - cur+=sprintf(str,"ylabel '%s' %d\n",ylab->value(), ypos->value()-1); - strcat(buf,str); - } - if(zlab->value()[0]) - { - cur+=sprintf(str,"zlabel '%s' %d\n",zlab->value(), zpos->value()-1); - strcat(buf,str); - } - if(alphad->value()[0]) - { - cur+=sprintf(str,"alphadef %g\n",atof(alphad->value())); - strcat(buf,str); - } - if(ambient->value()[0]) - { - cur+=sprintf(str,"ambient %g\n",atof(ambient->value())); - strcat(buf,str); - } - - if(basew->value()[0]) - { - cur+=sprintf(str,"baselinewidth %g\n",atof(basew->value())); - strcat(buf,str); - } - if(mesh->value()[0]) - { - cur+=sprintf(str,"meshnum %g\n",atof(mesh->value())); - strcat(buf,str); - } - if(axial->value()>=0) - { - cur+=sprintf(str,"axialdir '%c'\n",'x'+axial->value()); - strcat(buf,str); - } - - if(font->value()[0]) - { - cur+=sprintf(str,"font '%s'",font->value()); - strcat(buf,str); - if(size->value()) cur+=sprintf(str," %g\n",atof(size->value())); - else cur+=sprintf(str,"\n"); - strcat(buf,str); - } - if(rotate->value()) {cur+=sprintf(str,"rotatetext on\n"); strcat(buf,str);} - - if(alpha->value()) {cur+=sprintf(str,"alpha on\n"); strcat(buf,str);} - if(light->value()) {cur+=sprintf(str,"light on\n"); strcat(buf,str);} - - code->value(buf); - return buf; -} -//----------------------------------------------------------------------------- -void setup_cb(Fl_Widget *, void *d) -{ - if(d==0) return; - SetupDlg *s = ((ScriptWindow *)d)->setup_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) ((ScriptWindow *)d)->graph->update(); -} -//----------------------------------------------------------------------------- -Fl_Menu_Item colors[] = { - {"-----", 0,0,0,0,0,0,0, 0}, // - {("white"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,0)}, //w - {("blue"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,255)}, //b - {("lime"), 0,0,0,0,0,0,0, fl_rgb_color(0,255,0)}, //g - {("red"), 0,0,0,0,0,0,0, fl_rgb_color(255,0,0)}, //r - {("cyan"), 0,0,0,0,0,0,0, fl_rgb_color(0,255,255)}, //c - {("magenta"), 0,0,0,0,0,0,0, fl_rgb_color(255,0,255)}, //m - {("yellow"), 0,0,0,0,0,0,0, fl_rgb_color(255,255,0)}, //y - {("springgreen"), 0,0,0,0,0,0,0, fl_rgb_color(0,255,127)},//l - {("lawngreen"), 0,0,0,0,0,0,0, fl_rgb_color(127,255,0)}, //e - {("skyblue"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,255)}, //n - {("blueviolet"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,255)}, //u - {("orange"), 0,0,0,0,0,0,0, fl_rgb_color(255,127,0)}, //q - {("deeppink"), 0,0,0,0,0,0,0, fl_rgb_color(255,0,127)}, //p - {("gray"), 0,0,0,0,0,0,0, fl_rgb_color(127,127,127)}, //h - - {("black"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,0)}, //k - {("lightgray"), 0,0,0,0,0,0,0, fl_rgb_color(179,179,179)}, //W - {("navy"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,127)}, //B - {("green"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,0)}, //G - {("maroon"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,0)}, //R - {("teal"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,127)}, //C - {("purple"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,127)}, //M - {("olive"), 0,0,0,0,0,0,0, fl_rgb_color(127,127,0)}, //Y - {("seagreen"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,77)}, //L - {("darklawn"), 0,0,0,0,0,0,0, fl_rgb_color(77,127,0)}, //E - {("darkskyblue"), 0,0,0,0,0,0,0, fl_rgb_color(0,77,127)}, //N - {("indigo"), 0,0,0,0,0,0,0, fl_rgb_color(77,0,127)}, //U - {("brown"), 0,0,0,0,0,0,0, fl_rgb_color(127,77,0)}, //Q - {("darkpink"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,77)}, //P - {("darkgray"), 0,0,0,0,0,0,0, fl_rgb_color(77,77,77)}, //H -{0, 0,0,0,0,0,0,0, 0}}; -//----------------------------------------------------------------------------- -struct PropDlg -{ - Fl_Window *wnd; - Fl_MGL *graph; - - Fl_Input *path, *locale, *font, *fpath; - Fl_Check_Button *plast, *aexec, *ifont; - PropDlg() { memset(this,0,sizeof(PropDlg)); create_dlg(); }; - ~PropDlg() { delete wnd; }; - void create_dlg(); - void finish(); - void init(); -} prop_dlg; -//----------------------------------------------------------------------------- -void PropDlg::init() -{ - int a, p; - char *buf; - pref.get("plastic_scheme",p,1); plast->value(p); - pref.get("auto_exec",a,1); aexec->value(a); - pref.get("internal_font",a,0); ifont->value(a); - get_doc_dir(buf); path->value(buf); free(buf); - pref.get("font_dir",buf,""); fpath->value(buf); free(buf); - pref.get("font_name",buf,""); font->value(buf); free(buf); - pref.get("locale",buf,"ru_RU.cp1251"); locale->value(buf); free(buf); -} -//----------------------------------------------------------------------------- -void PropDlg::finish() -{ - int a, p; - p = plast->value(); - if(p!=plastic_scheme) - { - plastic_scheme = p; - pref.set("plastic_scheme",p); - Fl::scheme(p?"plastic":"none"); - } - a = aexec->value(); - if(a!=auto_exec) - { - auto_exec = a; - pref.set("auto_exec",a); - } - a = ifont->value(); - if(a!=internal_font) - { - internal_font = a; - pref.set("internal_font",a); - } - if(path->value()[0]) pref.set("help_dir",path->value()); - if(locale->value()[0]) - { - pref.set("locale", locale->value()); - setlocale(LC_CTYPE, locale->value()); - } - pref.set("font_dir",fpath->value()); - pref.set("font_name",font->value()); - if(graph) mgl_load_font(graph->FMGL->get_graph(), font->value(), fpath->value()); -} -//----------------------------------------------------------------------------- -void prop_dlg_cb(Fl_Widget *, void *v) -{ prop_dlg.finish(); ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void PropDlg::create_dlg() -{ - wnd = new Fl_Double_Window(320, 300, gettext("UDAV settings")); - path = new Fl_Input(10, 25, 305, 25, gettext("Path for help files")); path->align(FL_ALIGN_TOP_LEFT); - - font = new Fl_Input(10, 75, 305, 25, gettext("Font typeface")); font->align(FL_ALIGN_TOP_LEFT); - fpath = new Fl_Input(10, 125, 305, 25, gettext("Path for font files")); fpath->align(FL_ALIGN_TOP_LEFT); - locale = new Fl_Input(10, 175, 305, 25, gettext("Select locale")); locale->align(FL_ALIGN_TOP_LEFT); - - plast = new Fl_Check_Button(10, 210, 210, 25, gettext("Use plastic scheme")); - aexec = new Fl_Check_Button(10, 240, 210, 25, gettext("Execute after script loading")); - ifont = new Fl_Check_Button(10, 270, 210, 25, gettext("Use only internal font")); - - Fl_Button *o; - o = new Fl_Button(240, 210, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o = new Fl_Return_Button(240, 240, 75, 25, gettext("OK")); o->callback(prop_dlg_cb,wnd); - wnd->end(); -} -//----------------------------------------------------------------------------- -void settings_cb(Fl_Widget *, void *v) -{ - PropDlg *s = &prop_dlg; - s->graph = ((ScriptWindow *)v)->graph; - s->init(); - s->wnd->set_modal(); - s->wnd->show(); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/table.cpp b/mgllab/table.cpp deleted file mode 100644 index 36b90ee..0000000 --- a/mgllab/table.cpp +++ /dev/null @@ -1,875 +0,0 @@ -/* table.cpp is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -void addto_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *s = fl_input(gettext("Enter number for addition to data values"),0); - if(s) { mgl_data_add_num(e->var, atof(s)); e->refresh(); } -} -//----------------------------------------------------------------------------- -void subto_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *s = fl_input(gettext("Enter number for subtraction from data values"),0); - if(s) { mgl_data_sub_num(e->var, atof(s)); e->refresh(); } -} -//----------------------------------------------------------------------------- -void multo_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *s = fl_input(gettext("Enter number for multiplication of data values"),0); - if(s) { mgl_data_mul_num(e->var, atof(s)); e->refresh(); } -} -//----------------------------------------------------------------------------- -void divto_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *s = fl_input(gettext("Enter number for division of data values"),0); - if(s) { mgl_data_div_num(e->var, atof(s)); e->refresh(); } -} -//----------------------------------------------------------------------------- -struct XYZDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Box *box; - Fl_Check_Button *ch; - Fl_Spinner *mx, *my, *mz; - XYZDlg() { memset(this,0,sizeof(XYZDlg)); create_dlg(); }; - ~XYZDlg() { delete wnd; }; - void create_dlg(); -} xyz_dlg; -//----------------------------------------------------------------------------- -void xyz_dlg_cb(Fl_Widget *, void *v) -{ xyz_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void XYZDlg::create_dlg() -{ - wnd = new Fl_Double_Window(325, 125, gettext("Change data sizes")); - box = new Fl_Box(10, 10, 305, 40); - box->box(UDAV_THIN_UP_BOX); - box->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - - mx = new Fl_Spinner(30, 55, 75, 25, "mx"); - mx->tooltip(gettext("New size of data on 1st dimension (x-direction)")); - my = new Fl_Spinner(135, 55, 75, 25, "my"); - my->tooltip(gettext("New size of data on 2nd dimension (y-direction)")); - mz = new Fl_Spinner(240, 55, 75, 25, "mz"); - mz->tooltip(gettext("New size of data on 3d dimension (z-direction)")); - ch = new Fl_Check_Button(15, 90, 95, 25); - - Fl_Button *o; - o = new Fl_Button(125, 90, 85, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Do nothing and close this window")); - o = new Fl_Return_Button(230, 90, 85, 25, gettext("Change"));o->callback(xyz_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Change (resize) data")); - wnd->end(); -} -//----------------------------------------------------------------------------- -void new_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - xyz_dlg.box->label(gettext("Specify new data size\nData will be zero filled")); - xyz_dlg.ch->label(gettext("not used")); xyz_dlg.OK = false; - xyz_dlg.wnd->set_modal(); xyz_dlg.wnd->show(); - while(xyz_dlg.wnd->shown()) Fl::wait(); - if(xyz_dlg.OK) - { - e->var->Create(int(xyz_dlg.mx->value()), - int(xyz_dlg.my->value()), int(xyz_dlg.mz->value())); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -void resize_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - xyz_dlg.box->label(gettext("Specify new data size\nData will be interpolated")); - xyz_dlg.ch->label(gettext("not used")); xyz_dlg.OK = false; - xyz_dlg.wnd->set_modal(); xyz_dlg.wnd->show(); - while(xyz_dlg.wnd->shown()) Fl::wait(); - if(xyz_dlg.OK) - { - mglData d = e->var->Resize(int(xyz_dlg.mx->value()), int(xyz_dlg.my->value()), int(xyz_dlg.mz->value())); - mgl_data_set(e->var, &d); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -void squeeze_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - xyz_dlg.box->label(gettext("Specify the skiping step\nEach m-th point will be skiped")); - xyz_dlg.ch->label(gettext("smoothed")); xyz_dlg.OK = false; - xyz_dlg.wnd->set_modal(); xyz_dlg.wnd->show(); - while(xyz_dlg.wnd->shown()) Fl::wait(); - if(xyz_dlg.OK) - { - e->var->Squeeze(int(xyz_dlg.mx->value()), int(xyz_dlg.my->value()), - int(xyz_dlg.mz->value()), xyz_dlg.ch->value()); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -struct ChngDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Check_Button *dx, *dy, *dz; - Fl_Choice *kind, *type; - ChngDlg() { memset(this,0,sizeof(ChngDlg)); create_dlg(); }; - ~ChngDlg() { delete wnd; }; - void create_dlg(); - void execute(mglData *d); -} chng_dlg; -//----------------------------------------------------------------------------- -void chng_dlg_cb(Fl_Widget *, void *v) -{ chng_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void ChngDlg::execute(mglData *d) -{ - char r[8]="3"; - if(dx->value()) strcat(r,"x"); - if(dy->value()) strcat(r,"y"); - if(dz->value()) strcat(r,"z"); - if(!r[0]) return; - if(type->value()==1) r[0] = '5'; - if(type->value()==2) r[0] = ' '; - switch(kind->value()) - { - case 0: d->Smooth(r); break; - case 1: d->CumSum(r); break; - case 2: d->Integral(r); break; - case 3: d->Diff(r); break; - case 4: d->Diff2(r); break; - case 5: d->Swap(r); break; - } -} -//----------------------------------------------------------------------------- -void ChngDlg::create_dlg() -{ - Fl_Menu_Item k[]={{gettext("Smooth")}, {gettext("CumSum")}, { gettext("Integrate")}, - { gettext("Difference")}, { gettext("Double diff.")}, { gettext("Swap parts")}, {0}}; - Fl_Menu_Item t[]={{gettext("Linear *3")}, {gettext("Linear *5")}, {gettext("Parabolic *5")},{0}}; - wnd = new Fl_Double_Window(165, 215, gettext("Change data")); - kind = new Fl_Choice(10, 25, 145, 25, gettext("Type of operation")); - kind->align(FL_ALIGN_TOP_LEFT); kind->copy(k); - dx = new Fl_Check_Button(10, 55, 140, 25, gettext("apply in x direction")); - dy = new Fl_Check_Button(10, 80, 140, 25, gettext("apply in y direction")); - dz = new Fl_Check_Button(10, 105, 140, 25, gettext("apply in z direction")); - type = new Fl_Choice(10, 145, 145, 25, gettext("Type of smoothing")); - type->align(FL_ALIGN_TOP_LEFT); type->copy(t); - - Fl_Button *o; - o = new Fl_Button(10, 180, 65, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(90, 180, 65, 25, gettext("Do"));o->callback(chng_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void smooth_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(0); - chng_dlg.type->activate(); chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void cumsum_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(1); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void integr_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(2); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void diff_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(3); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void diff2_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(4); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void swap_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(5); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -struct NwdtDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Check_Button *dx, *dy, *dz; - Fl_Choice *kind; - Fl_Input *name; - NwdtDlg() { memset(this,0,sizeof(NwdtDlg)); create_dlg(); }; - ~NwdtDlg() { delete wnd; }; - void create_dlg(); -} nwdt_dlg; -//----------------------------------------------------------------------------- -void nwdt_dlg_cb(Fl_Widget *, void *v) -{ nwdt_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void NwdtDlg::create_dlg() -{ - Fl_Menu_Item k[]={{gettext("Summation of")}, {gettext("Maximum of")}, { gettext("Minimum of")}, {0}}; - wnd = new Fl_Double_Window(165, 215, gettext("Extract data")); - kind = new Fl_Choice(10, 25, 145, 25, gettext("Type of operation")); - kind->align(FL_ALIGN_TOP_LEFT); kind->copy(k); - dx = new Fl_Check_Button(10, 55, 140, 25, gettext("apply in x direction")); - dy = new Fl_Check_Button(10, 80, 140, 25, gettext("apply in y direction")); - dz = new Fl_Check_Button(10, 105, 140, 25, gettext("apply in z direction")); - name = new Fl_Input(10, 145, 145, 25, gettext("Name for output")); - name->align(FL_ALIGN_TOP_LEFT); - - Fl_Button *o; - o = new Fl_Button(10, 180, 65, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(90, 180, 65, 25, gettext("Do"));o->callback(chng_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void asum_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nwdt_dlg.kind->value(0); nwdt_dlg.OK = false; - nwdt_dlg.wnd->set_modal(); nwdt_dlg.wnd->show(); - while(nwdt_dlg.wnd->shown()) Fl::wait(); - if(nwdt_dlg.OK) - { - char r[8]=""; - if(nwdt_dlg.dx->value()) strcat(r,"x"); - if(nwdt_dlg.dy->value()) strcat(r,"y"); - if(nwdt_dlg.dz->value()) strcat(r,"z"); - if(!r[0]) return; - if(!nwdt_dlg.name->value()[0] || !strcmp(nwdt_dlg.name->value(),e->label())) - fl_alert(gettext("Name for output variable should be differ from this name")); - else - { - mglData d = e->var->Sum(r); - mgl_data_set(Parse->AddVar(nwdt_dlg.name->value()), &d); - } - } -} -//----------------------------------------------------------------------------- -void amax_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nwdt_dlg.kind->value(0); nwdt_dlg.OK = false; - nwdt_dlg.wnd->set_modal(); nwdt_dlg.wnd->show(); - while(nwdt_dlg.wnd->shown()) Fl::wait(); - if(nwdt_dlg.OK) - { - char r[8]=""; - if(nwdt_dlg.dx->value()) strcat(r,"x"); - if(nwdt_dlg.dy->value()) strcat(r,"y"); - if(nwdt_dlg.dz->value()) strcat(r,"z"); - if(!r[0]) return; - if(!nwdt_dlg.name->value()[0] || !strcmp(nwdt_dlg.name->value(),e->label())) - fl_alert(gettext("Name for output variable should be differ from this name")); - else - { - mglData d = e->var->Max(r); - mgl_data_set(Parse->AddVar(nwdt_dlg.name->value()), &d); - } - } -} -//----------------------------------------------------------------------------- -void amin_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nwdt_dlg.kind->value(0); nwdt_dlg.OK = false; - nwdt_dlg.wnd->set_modal(); nwdt_dlg.wnd->show(); - while(nwdt_dlg.wnd->shown()) Fl::wait(); - if(nwdt_dlg.OK) - { - char r[8]=""; - if(nwdt_dlg.dx->value()) strcat(r,"x"); - if(nwdt_dlg.dy->value()) strcat(r,"y"); - if(nwdt_dlg.dz->value()) strcat(r,"z"); - if(!r[0]) return; - if(!nwdt_dlg.name->value()[0] || !strcmp(nwdt_dlg.name->value(), e->label())) - fl_alert(gettext("Name for output variable should be differ from this name")); - else - { - mglData d = e->var->Min(r); - mgl_data_set(Parse->AddVar(nwdt_dlg.name->value()), &d); - } - } -} -//----------------------------------------------------------------------------- -void load_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - char *newfile = fl_file_chooser(gettext("Load Data?"), - gettext("DAT Files (*.{dat,csv})\tAll Files (*)"), 0); - if(newfile != NULL) - { e->var->Read(newfile); e->refresh(); } -} -//----------------------------------------------------------------------------- -void save_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - char *newfile = fl_file_chooser(gettext("Save Data?"), - gettext("DAT Files (*.{dat,csv})\tAll Files (*)"), 0); - if(newfile != NULL) e->var->Save(newfile); -} -//----------------------------------------------------------------------------- -void exp_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *scheme, *newfile = fl_file_chooser(gettext("Export Data?"), - gettext("PNG Files (*.png)\tAll Files (*)"), 0); - if(newfile != NULL) - { - scheme = fl_input(gettext("Enter color scheme"),"BbcyrR"); - if(scheme) e->var->Export(newfile,scheme); - } -} -//----------------------------------------------------------------------------- -void imp_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *scheme, *newfile = fl_file_chooser(gettext("Import Data?"), - gettext("PNG Files (*.png)\tAll Files (*)"), 0); - if (newfile != NULL) - { - scheme = fl_input(gettext("Enter color scheme"),"BbcyrR"); - if(scheme) - { e->var->Import(newfile,scheme); e->refresh(); } - } -} -//----------------------------------------------------------------------------- -void list_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - mglData *d = e->var; - if(d->nx*d->ny+d->ny>1020) - { fl_message(gettext("Too many numbers (>1000) on slice")); return; } - if(d->nz>1) fl_message(gettext("Only current slice will be inserted")); - char *list = new char[16384]; - strcpy(list,"list\t"); - register long i,j; - char s[32]; - for(j=0;jny;j++) - { - for(i=0;inx;i++) - { - sprintf(s,"%g\t",d->a[i+d->nx*(j+e->get_slice()*d->ny)]); - strcat(list,s); - } - if(jny-1) strcat(list,"|\t"); - } - textbuf->insert(0,list); - delete []list; -} -//----------------------------------------------------------------------------- -void modify_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *eq=fl_input(gettext("Enter formula for data modification\nHere x, y, z in range [0,1], u is data value"),0); - if (eq != NULL) { e->var->Modify(eq); e->refresh(); } -} -//----------------------------------------------------------------------------- -void plot_dat_cb(Fl_Widget *, void *v); -//----------------------------------------------------------------------------- -struct NrmDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Value_Input *min, *max; - Fl_Choice *dir; - Fl_Check_Button *sym; - NrmDlg() { memset(this,0,sizeof(NrmDlg)); create_dlg(); }; - ~NrmDlg() { delete wnd; }; - void create_dlg(); -} nrm_dlg; -//----------------------------------------------------------------------------- -void nrm_dlg_cb(Fl_Widget *, void *v) -{ nrm_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void NrmDlg::create_dlg() -{ - Fl_Menu_Item k[]={{"x"}, {"y"}, { "z"}, {0}}; - wnd = new Fl_Double_Window(135, 215); - min = new Fl_Value_Input(10, 25, 115, 25, gettext("Minimal value (v1)")); - min->align(FL_ALIGN_TOP_LEFT); - min->tooltip(gettext("Minimal value for resulting data values")); - max = new Fl_Value_Input(10, 70, 115, 25, gettext("Maximal value (v2)")); - max->align(FL_ALIGN_TOP_LEFT); - max->tooltip(gettext("Maximal value for resulting data values")); - dir = new Fl_Choice(10, 115, 115, 25, gettext("Direction")); - dir->align(FL_ALIGN_TOP_LEFT); dir->copy(k); - dir->tooltip(gettext("Direction along which data will be filled")); - sym = new Fl_Check_Button(10, 115, 115, 25, gettext("Symetrical range")); - sym->tooltip(gettext("Normalize in symmetrical range: -max(|v1|,|v2|) ... max(|v1|,|v2|)")); - - Fl_Button *o; - o = new Fl_Button(25, 150, 85, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Do nothing and close this window")); - o = new Fl_Return_Button(25, 180, 85, 25, gettext("Change"));o->callback(nrm_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Change data values and close this window")); - wnd->end(); -} -//----------------------------------------------------------------------------- -void fill_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nrm_dlg.OK = false; nrm_dlg.wnd->label(gettext("Fill in range")); - nrm_dlg.dir->show(); nrm_dlg.sym->hide(); - nrm_dlg.wnd->set_modal(); nrm_dlg.wnd->show(); - while(nrm_dlg.wnd->shown()) Fl::wait(); - if(nrm_dlg.OK) - { - char r='x'; - if(nrm_dlg.dir->value()==1) r='y'; - if(nrm_dlg.dir->value()==2) r='z'; - e->var->Fill(nrm_dlg.min->value(),nrm_dlg.max->value(),r); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -void normal_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nrm_dlg.OK = false; nrm_dlg.wnd->label(gettext("Normalize data")); - nrm_dlg.dir->hide(); nrm_dlg.sym->show(); - nrm_dlg.wnd->set_modal(); nrm_dlg.wnd->show(); - while(nrm_dlg.wnd->shown()) Fl::wait(); - if(nrm_dlg.OK) - { - e->var->Norm(nrm_dlg.min->value(), nrm_dlg.max->value(), nrm_dlg.sym->value()); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -struct CropDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Input *x1,*x2, *y1,*y2, *z1,*z2; - CropDlg() { memset(this,0,sizeof(CropDlg)); create_dlg(); }; - ~CropDlg() { delete wnd; }; - void create_dlg(); -} crop_dlg; -//----------------------------------------------------------------------------- -void crop_dlg_cb(Fl_Widget *, void *v) -{ crop_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void CropDlg::create_dlg() -{ - wnd = new Fl_Double_Window(230, 155, gettext("Crop data")); - x1 = new Fl_Input(45, 25, 80, 25, gettext("Lower bound")); x1->align(FL_ALIGN_TOP); - x2 = new Fl_Input(140, 25, 80, 25, gettext("Upper bound")); x2->align(FL_ALIGN_TOP); - y1 = new Fl_Input(45, 55, 80, 25); - y2 = new Fl_Input(140, 55, 80, 25); - z1 = new Fl_Input(45, 85, 80, 25); - z2 = new Fl_Input(140, 85, 80, 25); - - new Fl_Box(15, 25, 25, 25, "X"); - new Fl_Box(15, 55, 25, 25, "Y"); - new Fl_Box(15, 85, 25, 25, "Z"); - Fl_Button *o; - o = new Fl_Button(45, 120, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Do nothing and close this window")); - o = new Fl_Return_Button(145, 120, 75, 25, gettext("Crop")); o->callback(crop_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Change data values and close this window")); - wnd->end(); -} -//----------------------------------------------------------------------------- -void crop_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - crop_dlg.OK = false; - crop_dlg.wnd->set_modal(); crop_dlg.wnd->show(); - while(crop_dlg.wnd->shown()) Fl::wait(); - if(crop_dlg.OK) - { - int n1,n2; - n1 = 0; n2 = e->var->nx; - if(crop_dlg.x1->value()[0]) n1 = atoi(crop_dlg.x1->value()); - if(crop_dlg.x2->value()[0]) n2 = atoi(crop_dlg.x2->value()); - e->var->Crop(n1, n2, 'x'); - n1 = 0; n2 = e->var->ny; - if(crop_dlg.y1->value()[0]) n1 = atoi(crop_dlg.y1->value()); - if(crop_dlg.y2->value()[0]) n2 = atoi(crop_dlg.y2->value()); - e->var->Crop(n1, n2, 'y'); - n1 = 0; n2 = e->var->nz; - if(crop_dlg.z1->value()[0]) n1 = atoi(crop_dlg.z1->value()); - if(crop_dlg.z2->value()[0]) n2 = atoi(crop_dlg.z2->value()); - e->var->Crop(n1, n2, 'z'); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -struct TrspDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Round_Button *xyz, *xzy, *yxz, *yzx, *zxy, *zyx; - TrspDlg() { memset(this,0,sizeof(TrspDlg)); create_dlg(); }; - ~TrspDlg() { delete wnd; }; - void create_dlg(); -} trsp_dlg; -//----------------------------------------------------------------------------- -void trsp_dlg_cb(Fl_Widget *, void *v) -{ trsp_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void trsp_rad_cb(Fl_Widget *w, void *v) -{ - TrspDlg* e = (TrspDlg*)v; - e->xyz->value(0); e->xzy->value(0); - e->yxz->value(0); e->yzx->value(0); - e->zxy->value(0); e->zyx->value(0); - ((Fl_Round_Button *)w)->setonly(); -} -//----------------------------------------------------------------------------- -void TrspDlg::create_dlg() -{ - wnd = new Fl_Double_Window(220, 170, gettext("Transpose data")); - Fl_Group *g = new Fl_Group(10, 30, 200, 90, gettext("Select new order of dimensions")); - g->box(FL_DOWN_BOX); - yxz = new Fl_Round_Button(20, 40, 75, 25, "y - x - z"); yxz->callback(trsp_rad_cb,this); - zyx = new Fl_Round_Button(20, 65, 75, 25, "z - y - x"); zyx->callback(trsp_rad_cb,this); - zxy = new Fl_Round_Button(20, 90, 75, 25, "z - x - y"); zxy->callback(trsp_rad_cb,this); - yzx = new Fl_Round_Button(100, 40, 75, 25, "y - z - x");yzx->callback(trsp_rad_cb,this); - xzy = new Fl_Round_Button(100, 65, 75, 25, "x - z - y");xzy->callback(trsp_rad_cb,this); - xyz = new Fl_Round_Button(100, 90, 75, 25, "x - y - z");xyz->callback(trsp_rad_cb,this); - g->end(); - - Fl_Button *o; - o = new Fl_Button(25, 130, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Do nothing and close this window")); - o = new Fl_Return_Button(125, 130, 75, 25, gettext("Do")); o->callback(trsp_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Change data values and close this window")); - wnd->end(); -} -//----------------------------------------------------------------------------- -void transp_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - trsp_dlg.OK = false; - trsp_dlg.wnd->set_modal(); trsp_dlg.wnd->show(); - while(trsp_dlg.wnd->shown()) Fl::wait(); - if(trsp_dlg.OK) - { - if(trsp_dlg.xyz->value()) e->var->Transpose("xyz"); - if(trsp_dlg.xzy->value()) e->var->Transpose("xzy"); - if(trsp_dlg.yxz->value()) e->var->Transpose("yxz"); - if(trsp_dlg.yzx->value()) e->var->Transpose("yzx"); - if(trsp_dlg.zxy->value()) e->var->Transpose("zxy"); - if(trsp_dlg.zyx->value()) e->var->Transpose("zyx"); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -void first_sl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - e->slice->value(0); - e->set_slice(0); - e->go_home(); -} -//----------------------------------------------------------------------------- -void last_sl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - e->slice->value(e->num_slice()-1); - e->set_slice(e->num_slice()-1); - e->go_home(); -} -//----------------------------------------------------------------------------- -void prev_sl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - int p = int(e->slice->value())-1; - if(p<0) p = 0; - e->slice->value(p); e->set_slice(p); - e->go_home(); -} -//----------------------------------------------------------------------------- -void next_sl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - int p = int(e->slice->value())+1; - if(p>=e->num_slice()) p = e->num_slice()-1; - e->slice->value(p); e->set_slice(p); - e->go_home(); -} -//----------------------------------------------------------------------------- -void first_cl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - e->go_home(); -} -//----------------------------------------------------------------------------- -void change_sl_cb(Fl_Widget*w, void*v) -{ - TableWindow* e = (TableWindow*)v; - e->set_slice(long(e->slice->value())); - e->go_home(); -} -//----------------------------------------------------------------------------- -Fl_Menu_Item tablemenu[60] = { - { gettext("General"), 0, 0, 0, FL_SUBMENU }, - { gettext("Load from file"), 0, load_dat_cb }, - { gettext("Import from PNG"),0, imp_dat_cb }, - { gettext("Save to file"), 0, save_dat_cb }, - { gettext("Export to PNG"), 0, exp_dat_cb, 0, FL_MENU_DIVIDER }, - { gettext("Insert as list"), 0, list_dat_cb }, - { gettext("Plot data"), 0, plot_dat_cb }, -// { gettext("Info for data"), 0, info_dat_cb }, - { 0 }, - { gettext("Sizes"), 0, 0, 0, FL_SUBMENU }, - { gettext("Create new"), 0, new_dat_cb }, - { gettext("Resize"), 0, resize_cb }, - { gettext("Squeeze"), 0, squeeze_cb }, - { gettext("Crop"), 0, crop_cb }, - { gettext("Transpose"), 0, transp_cb }, -// { gettext("Extend"), 0, extend_cb }, - { 0 }, - { gettext("Fill"), 0, 0, 0, FL_SUBMENU }, - { gettext("By formula"), 0, modify_cb }, - { gettext("In range"), 0, fill_cb }, - { gettext("Normalize"), 0, normal_cb }, - { 0 }, - { gettext("Change"), 0, 0, 0, FL_SUBMENU }, - { gettext("Smooth"), 0, smooth_cb }, - { gettext("CumSum"), 0, cumsum_cb }, - { gettext("Integrate"), 0, integr_cb }, - { gettext("Difference"), 0, diff_cb }, - { gettext("Double diff."), 0, diff2_cb }, - { gettext("Swap parts"), 0, swap_cb }, - { 0 }, - { gettext("Another"), 0, 0, 0, FL_SUBMENU }, -// { gettext("Histogram of"), 0, hist_cb }, - { gettext("Summation of"), 0, asum_cb }, - { gettext("Maximum of"), 0, amax_cb }, - { gettext("Minimum of"), 0, amin_cb }, - { 0 }, - { gettext("Operations"), 0, 0, 0, FL_SUBMENU }, - { gettext("Add to"), 0, addto_cb }, - { gettext("Subtract to"),0, subto_cb }, - { gettext("Multiply by"),0, multo_cb }, - { gettext("Divide by"), 0, divto_cb }, - { 0 }, - { gettext("Navigation"), 0, 0, 0, FL_SUBMENU }, - { gettext("First slice"), FL_CTRL + FL_F + 1, first_sl_cb }, - { gettext("Prev slice"), FL_CTRL + FL_F + 2, prev_sl_cb }, - { gettext("Next slice"), FL_CTRL + FL_F + 3, next_sl_cb }, - { gettext("Last slice"), FL_CTRL + FL_F + 4, last_sl_cb, 0, FL_MENU_DIVIDER }, - { gettext("First cell"), FL_ALT + FL_F + 1, first_cl_cb }, -// { gettext("Last cell"), FL_ALT + FL_F + 2, last_cl_cb }, -// { gettext("Center grid"), FL_ALT + FL_F + 3, center_cl_cb }, - { 0 }, - { 0 } -}; -//----------------------------------------------------------------------------- -#include "xpm/document-new.xpm" -#include "xpm/plot.xpm" -#include "xpm/document-open.xpm" -#include "xpm/document-save.xpm" -#include "xpm/document-import.xpm" -#include "xpm/document-export.xpm" -#include "xpm/format-indent-more.xpm" -#include "xpm/diff.xpm" -#include "xpm/func.xpm" -#include "xpm/size.xpm" -#include "xpm/tran.xpm" -#include "xpm/crop.xpm" -#include "xpm/go-first.xpm" -#include "xpm/go-last.xpm" -TableWindow::TableWindow(int x, int y, int w, int h, const char* t) : Fl_Window(x, y, w, h, t) -{ - var = 0; -// menu = new Fl_Menu_Bar(0, 0, w, 30); -// menu->copy(tablemenu, this); - Fl_Button *o; - Fl_Group *g; - - - g = new Fl_Group(0,0,30,350); - o = new Fl_Button(0, 0, 25, 25); o->image(new Fl_Pixmap(document_new_xpm)); - o->callback(new_dat_cb,this); o->tooltip(gettext("Create new data with zero filling")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 25, 25, 25); o->image(new Fl_Pixmap(document_open_xpm)); - o->callback(load_dat_cb,this); o->tooltip(gettext("Load data from file")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 50, 25, 25); o->image(new Fl_Pixmap(document_import_xpm)); - o->callback(imp_dat_cb,this); o->tooltip(gettext("Import data from PNG file")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 75, 25, 25); o->image(new Fl_Pixmap(document_save_xpm)); - o->callback(save_dat_cb,this); o->tooltip(gettext("Save data to file")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 100, 25, 25); o->image(new Fl_Pixmap(document_export_xpm)); - o->callback(exp_dat_cb,this); o->tooltip(gettext("Export data to PNG file")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - o = new Fl_Button(0, 130, 25, 25); o->image(new Fl_Pixmap(format_indent_more_xpm)); - o->callback(list_dat_cb,this); o->tooltip(gettext("Insert to script as 'list' command")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 155, 25, 25); o->image(new Fl_Pixmap(plot_xpm)); - o->callback(plot_dat_cb,this); o->tooltip(gettext("Plot data")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - o = new Fl_Button(0, 185, 25, 25); o->image(new Fl_Pixmap(diff_xpm)); - o->callback(smooth_cb,this); o->tooltip(gettext("Apply operator (smoothing, integration, difference ...) to data")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 210, 25, 25); o->image(new Fl_Pixmap(func_xpm)); - o->callback(modify_cb,this); o->tooltip(gettext("Fill data by formula")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 235, 25, 25); o->image(new Fl_Pixmap(size_xpm)); - o->callback(resize_cb,this); o->tooltip(gettext("Resize data with smoothing")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 260, 25, 25); o->image(new Fl_Pixmap(crop_xpm)); - o->callback(crop_cb,this); o->tooltip(gettext("Crop (cut off edges) data")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 285, 25, 25); o->image(new Fl_Pixmap(tran_xpm)); - o->callback(transp_cb,this); o->tooltip(gettext("Transpose data dimensions")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - g->end(); g->resizable(0); - - - g = new Fl_Group(30,0,200,30); - o = new Fl_Button(30, 0, 25, 25); o->image(new Fl_Pixmap(go_first_xpm)); - o->callback(first_sl_cb,this); o->tooltip(gettext("Go to first slice (Ctrl-F1)")); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - slice = new Fl_Counter(55, 0, 90, 25, 0); slice->callback(change_sl_cb,this); - slice->lstep(10); slice->step(1); slice->tooltip(gettext("Id of slice on third (z-) dimension")); - slice->box(FL_PLASTIC_UP_BOX);// slice->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(147, 0, 25, 25); o->image(new Fl_Pixmap(go_last_xpm)); - o->callback(last_sl_cb,this); o->tooltip(gettext("Go to last slice (Ctrl-F4)")); - g->end(); g->resizable(0); - - data = new Fl_Data_Table(30,30,w-30,h-30); - data->row_header(1); data->row_header_width(70); - data->row_resize(1); data->rows(1); - data->row_height_all(25); - data->col_header(1); data->col_header_height(25); - data->col_resize(1); data->cols(1); - data->col_width_all(70); - - end(); resizable(data); -// callback(close_table_cb, this); -} -//----------------------------------------------------------------------------- -TableWindow::~TableWindow() -{ parent()->deactivate(); - (parent()->parent())->remove(parent()); - parent()->remove(this); delete parent(); } -//----------------------------------------------------------------------------- -void delete_cb(void *v) { if(v) delete (TableWindow *)v; } -//----------------------------------------------------------------------------- -void TableWindow::update(mglVar *v) -{ - if(v==0) return; - char ss[1024]; - wcstombs(ss,v->s.c_str(),1024); - label(ss); v->func = delete_cb; -// if(var) var->o = 0; - var = &(v->d); v->o = this; - refresh(); -} -//----------------------------------------------------------------------------- -void TableWindow::refresh() -{ - if(var==0) return; - deactivate(); nz = var->nz; - sl = 0; slice->range(0,nz-1); - - data->rows(var->ny); data->cols(var->nx); - data->ny = var->ny; data->nx = var->nx; - data->data = var->a; - activate(); -// show(); -} -//----------------------------------------------------------------------------- -void TableWindow::set_slice(long s) -{ - if(s>=0 && sdata = var->a + var->nx * var->ny * sl; - refresh(); - } -} -//----------------------------------------------------------------------------- -void TableWindow::go_home() -{ -} -//----------------------------------------------------------------------------- diff --git a/mgllab/udav.h b/mgllab/udav.h deleted file mode 100644 index 2a0fe67..0000000 --- a/mgllab/udav.h +++ /dev/null @@ -1,291 +0,0 @@ -/* udav.h is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -//----------------------------------------------------------------------------- -#ifndef _UDAV_H_ -#define _UDAV_H_ -//----------------------------------------------------------------------------- -#ifdef __MWERKS__ -# define FL_DLL -#endif -#ifdef USE_GETTEXT - #include -#else - #define gettext(x) (x) -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//----------------------------------------------------------------------------- -#ifdef USE_PLASTIC - #define UDAV_UP_BOX FL_PLASTIC_UP_BOX - #define UDAV_DOWN_BOX FL_PLASTIC_DOWN_BOX - #define UDAV_EDIT_BOX FL_PLASTIC_THIN_DOWN_BOX - #define UDAV_THIN_UP_BOX FL_PLASTIC_THIN_UP_BOX -#else - #define UDAV_UP_BOX FL_GTK_UP_BOX - #define UDAV_DOWN_BOX FL_GTK_DOWN_BOX - #define UDAV_EDIT_BOX FL_GTK_DOWN_BOX - #define UDAV_THIN_UP_BOX FL_GTK_THIN_UP_BOX -#endif -//----------------------------------------------------------------------------- -#include "mgl2/parser.h" -#include "mgl2/fltk.h" -//----------------------------------------------------------------------------- -extern mglParse *Parse; -extern Fl_Menu_Item colors[]; -extern Fl_Preferences pref; -class Fl_MGL; -//----------------------------------------------------------------------------- -class Fl_Data_Table : public Fl_Table -{ -private: - int row, col; - Fl_Input* input; -protected: - void draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H); - static void event_callback(Fl_Widget*, void*v) - { ((Fl_Data_Table*)v)->cell_click(); }; - void cell_click(); - -public: - mreal *data; - int nx, ny; - - Fl_Data_Table(int x, int y, int w, int h, const char *l=0); - ~Fl_Data_Table() { } - - void set_value(); - void rows(int val) { if (input->visible()) input->do_callback(); Fl_Table::rows(val); } - void cols(int val) { if (input->visible()) input->do_callback(); Fl_Table::cols(val); } - inline int rows() { return Fl_Table::rows(); } - inline int cols() { return Fl_Table::cols(); } -}; -//----------------------------------------------------------------------------- -struct AnimateDlg -{ - friend void animate_dlg_cb(Fl_Widget *, void *v); - friend void animate_rad_cb(Fl_Widget *, void *v); - friend void fill_animate(const char *text); - friend void animate_put_cb(Fl_Widget *, void *); -public: - Fl_Window* wnd; - int OK; - AnimateDlg() { memset(this,0,sizeof(AnimateDlg)); create_dlg(); }; - ~AnimateDlg() { delete wnd; }; - void FillResult(Fl_MGL* e); -protected: - bool swap; - Fl_Round_Button *rt, *rv; - Fl_Multiline_Input *txt; - Fl_Float_Input *x0, *x1, *dx, *dt; - Fl_Check_Button *save; - void create_dlg(); -}; -//----------------------------------------------------------------------------- -class Fl_MGL : public Fl_MGLView, public mglDraw -{ -friend class AnimateDlg; -public: - Fl_Widget *status; ///< StatusBar for mouse coordinates - const char *AnimBuf; ///< buffer for animation - const char **AnimS0; - int AnimNum; - mreal AnimDelay; - - Fl_MGL(int x, int y, int w, int h, char *label=0); - ~Fl_MGL(); - - /// Drawing itself - int Draw(mglGraph *); - /// Update (redraw) plot - void update(); - /// Set main \a scr and optional \a pre scripts for execution - void scripts(char *scr, char *pre); - /// Clear scripts internally saved - void clear_scripts(); - /// Show next frame - void next_frame(); - /// Show prev frame - void prev_frame(); - -protected: - char *Args[1000], *ArgBuf; - int NArgs, ArgCur; - - char *script; ///< main script - char *script_pre; ///< script with settings -}; -//----------------------------------------------------------------------------- -struct TableWindow : public Fl_Window -{ -public: - TableWindow(int x, int y, int w, int h, const char* t=0); - ~TableWindow(); - void update(mglVar *v); - void refresh(); - void set_slice(long s); - inline long get_slice() { return sl; }; - inline long num_slice() { return nz; }; - void go_home(); - - Fl_Data_Table *data; - Fl_Menu_Bar *menu; -// Fl_Output *main; - Fl_Counter *slice; - mglData *var; -protected: -// long nx,ny,nz; - long nz; - long sl; // current slice - char sl_id[64]; // slice id -}; -//----------------------------------------------------------------------------- -class SetupDlg -{ -public: - Fl_Window *wnd; - bool OK; - Fl_Input *templ; - - SetupDlg() { memset(this,0,sizeof(SetupDlg)); }; - ~SetupDlg() { delete wnd; }; - void CreateDlg(); - char *ToScript(); -private: - Fl_Input *xmin, *ymin, *zmin, *cmin; - Fl_Input *xmax, *ymax, *zmax, *cmax; - Fl_Input *xorg, *yorg, *zorg; - Fl_Input *xlab, *ylab, *zlab, *font; - Fl_Choice *xpos, *ypos, *zpos, *axial, *cid[10]; - Fl_Input *xtik, *ytik, *ztik; - Fl_Input *xsub, *ysub, *zsub; - Fl_Input *alphad, *ambient, *basew, *mesh, *size; - Fl_Check_Button *alpha, *light, *rotate, *lid[10]; - Fl_Input *xid[10], *yid[10], *zid[10], *bid[10]; - Fl_Help_View *code; - - void CreateGen(); - void CreateLid(); -}; -//----------------------------------------------------------------------------- -class ScriptWindow : public Fl_Double_Window -{ -public: - ScriptWindow(int w, int h, const char* t); - ~ScriptWindow(); - - Fl_Window *replace_dlg; - Fl_Input *replace_find; - Fl_Input *replace_with; - Fl_Button *replace_all; - Fl_Return_Button *replace_next; - Fl_Button *replace_cancel; - Fl_Text_Editor *editor; - Fl_Menu_Bar *menu; - Fl_Tabs *ltab, *rtab; - Fl_Help_View *hd; - Fl_Input *link_cmd; - Fl_Group *ghelp; - Fl_Browser *var; - Fl_Box *status; - - void mem_init(); - void mem_pressed(int n); - SetupDlg *setup_dlg; - char search[256]; - Fl_MGL *graph; -}; -//----------------------------------------------------------------------------- -// Editor window functions -void find2_cb(Fl_Widget *, void *); -void replall_cb(Fl_Widget *, void *); -void replace2_cb(Fl_Widget *, void *); -void replcan_cb(Fl_Widget *, void *); -void insert_cb(Fl_Widget *, void *); -void paste_cb(Fl_Widget *, void *); -void replace_cb(Fl_Widget *, void *); -void copy_cb(Fl_Widget *, void *); -void cut_cb(Fl_Widget *, void *); -void find_cb(Fl_Widget *, void *); -void delete_cb(Fl_Widget *, void *); -void changed_cb(int, int nInserted, int nDeleted,int, const char*, void* v); -//----------------------------------------------------------------------------- -// General callback functions -void new_cb(Fl_Widget *, void *); -void open_cb(Fl_Widget *, void *); -void save_cb(Fl_Widget*, void*); -void saveas_cb(Fl_Widget*, void*); -void help_cb(Fl_Widget*, void*); -//----------------------------------------------------------------------------- -// Graphical callback functions -void setup_cb(Fl_Widget *, void *); -void style_cb(Fl_Widget *, void *); -void option_cb(Fl_Widget *, void *); -void argument_cb(Fl_Widget *, void *); -void variables_cb(Fl_Widget *, void *); -void settings_cb(Fl_Widget *, void *); -void command_cb(Fl_Widget *, void *); -//----------------------------------------------------------------------------- -// Dialogs callback functions -void close_dlg_cb(Fl_Widget *w, void *); -void font_cb(Fl_Widget *, void *v); -void line_cb(Fl_Widget *, void *v); -void face_cb(Fl_Widget *, void *v); -void data_cb(Fl_Widget *, void *v); -//----------------------------------------------------------------------------- -void style_init(void); -int check_save(void); -void load_file(char *newfile, int ipos); -void save_file(char *newfile); -Fl_Widget *add_editor(ScriptWindow *w); -Fl_Widget *add_mem(ScriptWindow *w); -void set_title(Fl_Window* w); -//----------------------------------------------------------------------------- -// Animation -void animate_cb(Fl_Widget *, void *v); -void fill_animate(const char *text); -//----------------------------------------------------------------------------- -Fl_Widget *add_help(ScriptWindow *w); -void help_cb(Fl_Widget*, void*v); -void example_cb(Fl_Widget*, void*v); -void about_cb(Fl_Widget*, void*); -//----------------------------------------------------------------------------- -void newcmd_cb(Fl_Widget*,void*); -//----------------------------------------------------------------------------- -extern Fl_Text_Buffer *textbuf; -extern char filename[256]; -extern int changed; -//----------------------------------------------------------------------------- -#endif -//----------------------------------------------------------------------------- diff --git a/mgllab/udav.rc b/mgllab/udav.rc deleted file mode 100644 index e557119..0000000 --- a/mgllab/udav.rc +++ /dev/null @@ -1,24 +0,0 @@ -/* udav.rc is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -//----------------------------------------------------------------------------- -#include - -#define APPICON 1001 -#define APPICON48 1002 - -APPICON ICON "udav.ico" -APPICON48 ICON "udav48.ico" diff --git a/mgllab/udav48.ico b/mgllab/udav48.ico deleted file mode 100644 index a286d6d4104711b4ab323d0192e5103e6bf85dc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9662 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 diff --git a/mgllab/write.cpp b/mgllab/write.cpp deleted file mode 100644 index 949f4be..0000000 --- a/mgllab/write.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/* write.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -//----------------------------------------------------------------------------- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2e844cd..a9e5e7c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,10 +1,11 @@ set(mgl_src addon.cpp axis.cpp base_cf.cpp base.cpp canvas_cf.cpp canvas.cpp cont.cpp crust.cpp + complex.cpp complex_io.cpp data.cpp data_io.cpp data_new.cpp data_png.cpp def_font.cpp export_2d.cpp export_3d.cpp eval.cpp evalp.cpp exec.cpp export.cpp - fit.cpp font.cpp other.cpp parser.cpp pde.cpp pixel.cpp + fit.cpp font.cpp obj.cpp other.cpp parser.cpp pde.cpp pixel.cpp plot.cpp prim.cpp surf.cpp tex_table.cpp vect.cpp volume.cpp evalc.cpp - s_hull/s_hull_pro.cpp + s_hull/s_hull_pro.cpp window.cpp ) set(mgl_hdr @@ -16,7 +17,7 @@ set(mgl_hdr ../include/mgl2/data.h ../include/mgl2/volume.h ../include/mgl2/data_cf.h ../include/mgl2/define.h ../include/mgl2/other.h ../include/mgl2/eval.h ../include/mgl2/parser.h ../include/mgl2/addon.h ../include/mgl2/evalc.h - s_hull/s_hull_pro.h + s_hull/s_hull_pro.h ../include/mgl2/wnd.h ../include/mgl2/canvas_wnd.h ) add_definitions(-DMGL_SRC) @@ -74,9 +75,6 @@ endif(MGL_HAVE_GIF) if(MGL_HAVE_HDF5) target_link_libraries(mgl ${HDF5_LIBRARIES}) -# if(NOT use_hdf5_18) -# add_definitions(-DH5_USE_16_API) -# endif(NOT use_hdf5_18) include_directories(${HDF5_INCLUDE_DIR}) endif(MGL_HAVE_HDF5) @@ -112,10 +110,8 @@ if(MGL_HAVE_MPI) endif(MGL_HAVE_MPI) target_link_libraries(mgl ${M_LIB}) -file(TO_NATIVE_PATH $(MGL_FONT_PATH) MGL_FONT_PATH_SYS) -#add_definitions(-DMGL_FONT_PATH="${MGL_FONT_PATH_SYS}") -set_target_properties(mgl PROPERTIES SOVERSION 6.0.0) +set_target_properties(mgl PROPERTIES SOVERSION 7.0.0) install( TARGETS mgl mgl-static RUNTIME DESTINATION bin diff --git a/src/addon.cpp b/src/addon.cpp index 140c24a..fd35472 100644 --- a/src/addon.cpp +++ b/src/addon.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * addon.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -27,10 +27,10 @@ #include #include "mgl2/addon.h" #include "mgl2/data.h" -//--------------------------------------------------------------------------- +//----------------------------------------------------------------------------- void mgl_strcls(char *str) { - unsigned len = strlen(str),i,n; + size_t len = strlen(str),i,n; char *tmp = new char[len]; for(i=0;i0;k--) // 3 iterations { for(i=1;i0;k--) // kk iterations @@ -190,7 +190,7 @@ bool mgl_difr_axial(dual *a, int n, dual q, int Border,dual *b, dual *d, int kk, dd = 1./(sqrt(dd*dd+1.)+dd); // corrections for "axiality" gg = 1+dd*dd; d[i] = a[i] + adt*( b[i-1]*((gg-dd)/k) - - b[i]*(gg*2./k) + b[i+1]*((gg+dd)/k) ); + b[i]*(2*gg/k) + b[i+1]*((gg+dd)/k) ); } memcpy(b,d,n*sizeof(dual)); switch(Border) @@ -200,10 +200,10 @@ bool mgl_difr_axial(dual *a, int n, dual q, int Border,dual *b, dual *d, int kk, case 1: // constant at border b[n-1] = b[n-2]; break; case 2: // linear at border - b[n-1] = -b[n-3] + 2.*b[n-2]; + b[n-1] = -b[n-3] + mreal(2)*b[n-2]; break; case 3: // square at border - b[n-1] = b[n-4] + 3.*(b[n-2]-b[n-3]); + b[n-1] = b[n-4] + mreal(3)*(b[n-2]-b[n-3]); break; case -1: // exponent at border b[n-1] = norm(b[n-3])0) freq[nn-i] = -(double)(i); } } -//---------------------------------------------------------------------------- +//----------------------------------------------------------------------------- diff --git a/src/axis.cpp b/src/axis.cpp index cccb187..95035e2 100644 --- a/src/axis.cpp +++ b/src/axis.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * axis.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -38,23 +38,13 @@ long mgl_have_color(const char *stl) return j; } //----------------------------------------------------------------------------- -wchar_t *mgl_wcsdup(const wchar_t *s) -{ - wchar_t *r = (wchar_t *)malloc((wcslen(s)+1)*sizeof(wchar_t)); - memcpy(r,s,(wcslen(s)+1)*sizeof(wchar_t)); - return r; -} -//----------------------------------------------------------------------------- void mgl_wcstrim(wchar_t *str) { - wchar_t *c = mgl_wcsdup(str); - unsigned long n=wcslen(str); - long k; + size_t n=wcslen(str), k, i; for(k=0;k' ') break; - wcscpy(c,str+k); n = wcslen(c); - for(k=n-1;k>=0;k--) if(c[k]>' ') break; - c[k+1] = 0; - wcscpy(str,c); free(c); + for(i=n;i>0;i--) if(str[i-1]>' ') break; + memmove(str, str+k, (i-k)*sizeof(wchar_t)); + str[i-k]=0; } //----------------------------------------------------------------------------- // Ticks setup @@ -162,7 +152,7 @@ void mglCanvas::SetTicksVal(char dir, HCDT v, const char **lbl, bool add) if(add) { UpdateAxis(); AdjustTicks(aa,ff); } if(!v || !lbl) { aa.f = 0; return; } aa.f = 2; aa.ns=0; aa.ds=0; - register unsigned long i,n=v->GetNx(),l=0; + register size_t i,n=v->GetNx(),l=0; for(i=0;il) l=strlen(lbl[i]); wchar_t *str=new wchar_t[l+1]; for(i=0;iz0)) u /= v; if((kind&1) && z>z0) { - int n1,n2; + size_t n1,n2; mglprintf(str, 64, L"@{(+%.2g)}",u); // mglprintf(str, 64, fabs(u)<1 ? L"@{(+%.2g)}" : L"@{(+%.3g)}",u); n1=wcslen(str); mglprintf(str, 64, L"@{(+%g)}",u); n2=wcslen(str); @@ -367,7 +357,7 @@ void mgl_tick_text(mreal z, mreal z0, mreal d, mreal v, int kind, wchar_t str[64 } else { - int n1,n2; + size_t n1,n2; mglprintf(str, 64, fabs(u)<1 ? L"%.2g" : L"%.3g",u); n1=wcslen(str); mglprintf(str, 64, L"%g",u); n2=wcslen(str); if(n10) for(i=0;i=aa.v1 && v<=aa.v2) tick_draw(o+d*v, da, db, 0, stl); -// else tick_draw(o+d*v, da, db, 0, " "); - if(aa.dv==0 && fabs(u-exp(M_LN10*floor(0.1+log10(u))))<0.01*u) + if((v-aa.v2)*(v-aa.v1)<=0) tick_draw(o+d*v, da, db, 0, stl); + if(aa.dv==0 && aa.v2>aa.v1 && fabs(u-exp(M_LN10*floor(0.1+log10(u))))<0.01*u) for(j=2;j<10 && v*j0 && !get(MGL_NOSUBTICKS)) { if(aa.v2>aa.v1) v0 = v0 - aa.ds*floor((v0-aa.v1)/aa.ds+1e-3); else v0 = v0 - aa.ds*floor((v0-aa.v2)/aa.ds+1e-3); if(v0+aa.ds!=v0 && aa.v2+aa.ds!=aa.v2) - for(v=v0;v0))) pos[0]='T'; if(aa.ch=='c') pos[0]=(aa.ns==0 || aa.ns==3)?'t':'T'; if(aa.ch=='T') pos[0]='T'; - mreal *w=new mreal[n], h = TextHeight(FontDef,-1)/3, c=NAN, l=NAN, tet=0, v, vv; // find sizes + mreal *w=new mreal[n], h = TextHeight(FontDef,-1), c=NAN, l=NAN, tet=0, v, vv; // find sizes long *kk=new long[n]; for(i=0;iaa.v1 && c0) ? 'T':'t'; - if(aa.ch=='T' && pos[0]=='T') pos[0]='t'; - if(aa.ch=='T' && pos[0]=='t') pos[0]='T'; + int ts = 1; + if(!get(MGL_DISABLE_SCALE)) ts = sign(qq.v*nn.x-qq.u*nn.y)*sign(aa.v2-aa.v1); + if(aa.ch=='c') ts=(aa.ns==0 || aa.ns==3)?1:-1; + if(aa.ch=='T') ts *= -1; + if(aa.pos=='T') ts *= -1; + pos[0] = ts>0 ? 't':'T'; text_plot(kk[i], aa.txt[i].text.c_str(), pos, -1, aa.sh+0.07,CDef,tet?false:true); } delete []w; delete []kk; } //----------------------------------------------------------------------------- +char mglCanvas::GetLabelPos(mreal c, long kk, mglAxis &aa) +{ + if(strchr("xyz",aa.ch)) + aa.org = mglPoint(GetOrgX(aa.ch), GetOrgY(aa.ch), GetOrgZ(aa.ch)); + mglPoint d = aa.dir, o = aa.org; // "transverse" org + if(strchr("xyz",aa.ch)) o -= d*(o*d); + mglPoint p,q, s=(Min+Max)/2, nn; + s = s - d*(s*d); + + int ts = 1; + if(aa.ch=='c') ts=(aa.ns==0 || aa.ns==3)?1:-1; + if(aa.ch=='T') ts=-1; + + p = o+d*c; nn = (s-o)/(Max-Min); ScalePoint(p,nn); + mglPnt &qq = Pnt[kk]; + + if(aa.ch=='c') qq.u = qq.v = NAN; + if(!get(MGL_DISABLE_SCALE)) ts = sign(qq.v*nn.x-qq.u*nn.y)*sign(aa.v2-aa.v1); + if(aa.ch=='T') ts *= -1; + if(aa.pos=='T') ts *= -1; + return ts>0 ? 't':'T'; +} +//----------------------------------------------------------------------------- void mglCanvas::tick_draw(mglPoint o, mglPoint d1, mglPoint d2, int f, const char *stl) { if(TickLen==0) return; @@ -602,9 +626,10 @@ void mglCanvas::tick_draw(mglPoint o, mglPoint d1, mglPoint d2, int f, const cha line_plot(k1,k2); line_plot(k2,k3); } //----------------------------------------------------------------------------- -void mglCanvas::Grid(const char *dir, const char *pen) +void mglCanvas::Grid(const char *dir, const char *pen, const char *opt) { - if(!dir || !dir[0]) return; + SaveState(opt); + if(!dir || !dir[0]) dir="xyz"; AdjustTicks(dir,false); SetPenPal(pen); // TODO: Ternary axis labeling ... @@ -617,11 +642,23 @@ void mglCanvas::Grid(const char *dir, const char *pen) //----------------------------------------------------------------------------- void mglCanvas::DrawGrid(mglAxis &aa) { - aa.org = mglPoint(GetOrgX(aa.ch), GetOrgY(aa.ch), GetOrgZ(aa.ch)); + mglPoint pp[8]={Min,Min,Min,Min,Max,Max,Max,Max},nan=mglPoint(NAN), oo[8], org=Min; + pp[1].x=Max.x; pp[2].y=Max.y; pp[3].z=Max.z; + pp[4].x=Min.x; pp[5].y=Min.y; pp[6].z=Min.z; + mreal zm=1e5; + memcpy(oo,pp,8*sizeof(mglPoint)); + for(int i=0;i<8;i++) // find deepest point + { + ScalePoint(pp[i],nan,false); + if(pp[i].z0.2) ff[1]='R'; strcpy(font,FontDef); strcat(font,ff); - strcat(font,nn.y>1e-5 || nn.x<0 ? "T":"t"); - text_plot(AddPnt(p,-1,q,0,7),text,font,-1.4,0.35+shift); + long kk = AddPnt(p,-1,q,0,7); ff[1]=0; + ff[0] = GetLabelPos(t, kk, *aa); strcat(font,ff); + text_plot(kk,text,font,-1.4,0.35+shift); + LoadState(); } //----------------------------------------------------------------------------- void mglCanvas::Box(const char *col, bool ticks) @@ -716,6 +766,7 @@ void mglCanvas::Box(const char *col, bool ticks) mreal tl=TickLen; if(!ticks) TickLen=0; set(MGL_NOSUBTICKS); Org = Min; + static int cgid=1; StartGroup("Box",cgid++); Axis("xyz_",col); if(TernAxis&1) { @@ -771,29 +822,30 @@ void mglCanvas::Box(const char *col, bool ticks) mgl_facez(this, Min.x, Min.y, oo[im].z, Max.x-Min.x, Max.y-Min.y, color,0,0); } } + EndGroup(); clr(MGL_NOSUBTICKS); Org=o; TickLen=tl; } //----------------------------------------------------------------------------- void mglCanvas::Colorbar(const char *sch) { - bool in = sch && strchr(sch,'I'); + bool in = mglchr(sch,'I'); mreal s=1/B.pf, x=1, y=0; - if(sch && strchr(sch,'>')) { x=in?(1+s)/2:1; y=0; } - if(sch && strchr(sch,'<')) { x=in?(1-s)/2:0; y=0; } - if(sch && strchr(sch,'^')) { x=0; y=in?(1+s)/2:1; } - if(sch && strchr(sch,'_')) { x=0; y=in?(1-s)/2:0; } + if(mglchr(sch,'>')) { x=in?(1+s)/2:1; y=0; } + if(mglchr(sch,'<')) { x=in?(1-s)/2:0; y=0; } + if(mglchr(sch,'^')) { x=0; y=in?(1+s)/2:1; } + if(mglchr(sch,'_')) { x=0; y=in?(1-s)/2:0; } Colorbar(sch, x, y, 1, 1); } //----------------------------------------------------------------------------- void mglCanvas::Colorbar(const char *sch, mreal x, mreal y, mreal w, mreal h) { - bool in = sch && strchr(sch,'I'); + bool in = mglchr(sch,'I'); int where = 0; // ‘0’ - right, ‘1’ - left, ‘2’ - above, ‘3’ - under - if(sch && strchr(sch,'>')) where = in?1:0; - if(sch && strchr(sch,'<')) where = in?0:1; - if(sch && strchr(sch,'^')) where = in?3:2; - if(sch && strchr(sch,'_')) where = in?2:3; - if(sch && strchr(sch,'A')) { Push(); Identity(); } + if(mglchr(sch,'>')) where = in?1:0; + if(mglchr(sch,'<')) where = in?0:1; + if(mglchr(sch,'^')) where = in?3:2; + if(mglchr(sch,'_')) where = in?2:3; + if(mglchr(sch,'A')) { Push(); Identity(); } long n=256, s = AddTexture(sch); mglData v(n); @@ -806,29 +858,29 @@ void mglCanvas::Colorbar(const char *sch, mreal x, mreal y, mreal w, mreal h) for(long i=0;i')) { x=in?(1+s)/2:1; y=0; } - if(sch && strchr(sch,'<')) { x=in?(1-s)/2:0; y=0; } - if(sch && strchr(sch,'^')) { x=0; y=in?(1+s)/2:1; } - if(sch && strchr(sch,'_')) { x=0; y=in?(1-s)/2:0; } + if(mglchr(sch,'>')) { x=in?(1+s)/2:1; y=0; } + if(mglchr(sch,'<')) { x=in?(1-s)/2:0; y=0; } + if(mglchr(sch,'^')) { x=0; y=in?(1+s)/2:1; } + if(mglchr(sch,'_')) { x=0; y=in?(1-s)/2:0; } Colorbar(v, sch, x, y, 1, 1); } //----------------------------------------------------------------------------- void mglCanvas::Colorbar(HCDT v, const char *sch, mreal x, mreal y, mreal w, mreal h) { - bool in = sch && strchr(sch,'I'); + bool in = mglchr(sch,'I'); int where = 0; - if(sch && strchr(sch,'>')) where = in?1:0; - if(sch && strchr(sch,'<')) where = in?0:1; - if(sch && strchr(sch,'^')) where = in?3:2; - if(sch && strchr(sch,'_')) where = in?2:3; - if(sch && strchr(sch,'A')) { Push(); Identity(); } + if(mglchr(sch,'>')) where = in?1:0; + if(mglchr(sch,'<')) where = in?0:1; + if(mglchr(sch,'^')) where = in?3:2; + if(mglchr(sch,'_')) where = in?2:3; + if(mglchr(sch,'A')) { Push(); Identity(); } mreal *c=new mreal[v->GetNx()]; if(!mgl_have_color(sch)) sch = MGL_DEF_PAL; @@ -838,13 +890,13 @@ void mglCanvas::Colorbar(HCDT v, const char *sch, mreal x, mreal y, mreal w, mre for(long i=0;iGetNx();i++) c[i] = s+i*dc; colorbar(v, c, where, x, y, w, h); delete []c; - if(sch && strchr(sch,'A')) Pop(); + if(mglchr(sch,'A')) Pop(); } //----------------------------------------------------------------------------- void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, mreal w, mreal h) { static int cgid=1; StartGroup("Colorbar",cgid++); - register unsigned long i,n=vv->GetNx(); + register size_t i,n=vv->GetNx(); long n1,n2,n3,n4; mreal d,s3=B.pf,ss=1/s3; // NOTE: colorbar was wider ss=0.9; mglPoint p1,p2; @@ -887,7 +939,7 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m } else { UpdateAxis(); AdjustTicks(ac,fa); } // hint for using standard label drawing function - mreal cc=AddTexture('k'); + SetPenPal(*TickStl ? TickStl:"k-1"); for(i=0;i * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -17,6 +17,7 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include "mgl2/font.h" #include "mgl2/base.h" #include "mgl2/define.h" //----------------------------------------------------------------------------- @@ -27,10 +28,52 @@ char *mgl_strdup(const char *s) return r; } //----------------------------------------------------------------------------- +void mgl_create_cpp_font(HMGL gr, const wchar_t *how) +{ + unsigned long l=wcslen(how), i, n=0, m; + wchar_t ch=*how; + const mglFont *f = gr->GetFont(); + std::vector s; s.push_back(ch); + for(i=1;iInternal(s[i]); + l += 2*f->GetNl(0,ch); + n += 6*f->GetNt(0,ch); + } + printf("unsigned mgl_numg=%lu, mgl_cur=%lu;\n",(unsigned long)s.size(),l+n); + printf("float mgl_fact=%g;\n",f->GetFact(0)/mgl_fgen); + printf("long mgl_gen_fnt[%lu][6] = {\n", (unsigned long)s.size()); + for(i=m=0;iInternal(s[i]); + int m1 = f->GetNl(0,ch), m2 = f->GetNt(0,ch); + printf("\t{0x%x,%d,%d,%lu,%d,%lu},\n",s[i],f->GetWidth(0,ch),m1,m,m2,m+2*m1); + m += 2*m1+6*m2; + } + if(m!=l+n) printf("#error \"%lu !=%lu + %lu\"",m,l,n); + printf("};\nshort mgl_buf_fnt[%lu] = {\n",m); + for(i=0;iInternal(s[i]); + unsigned m1 = f->GetNl(0,ch), m2 = f->GetNt(0,ch); + const short *ln = f->GetLn(0,ch), *tr = f->GetTr(0,ch); + for(l=0;l<2*m1;l++) printf("%d,",ln[l]); + printf("\n"); + for(l=0;l<6*m2;l++) printf("%d,",tr[l]); + printf("\n"); + } + printf("};\n"); +} +//----------------------------------------------------------------------------- void mgl_strtrim(char *str) { char *c = mgl_strdup(str); - unsigned long n=strlen(str); + size_t n=strlen(str); long k; for(k=0;k' ') break; @@ -55,21 +98,55 @@ mglBase::mglBase() #if MGL_HAVE_PTHREAD pthread_mutex_init(&mutexPnt,0); pthread_mutex_init(&mutexTxt,0); + pthread_mutex_init(&mutexSub,0); + pthread_mutex_init(&mutexLeg,0); + pthread_mutex_init(&mutexPrm,0); + pthread_mutex_init(&mutexPtx,0); + pthread_mutex_init(&mutexStk,0); + pthread_mutex_init(&mutexGrp,0); + pthread_mutex_init(&mutexGlf,0); + pthread_mutex_init(&mutexAct,0); + pthread_mutex_init(&mutexDrw,0); #endif - fnt=0; *FontDef=0; - fx=fy=fz=fa=fc=0; + fnt=0; *FontDef=0; fx=fy=fz=fa=fc=0; + AMin = mglPoint(0,0,0,0); AMax = mglPoint(1,1,1,1); - InUse = 1; SetQuality(); + InUse = 1; SetQuality(); FaceNum = 0; // Always create default palette txt[0] and default scheme txt[1] Txt.reserve(3); - Txt.push_back(mglTexture(MGL_DEF_PAL,-1)); - Txt.push_back(mglTexture("BbcyrR",1)); + MGL_PUSH(Txt,mglTexture(MGL_DEF_PAL,-1),mutexTxt); + MGL_PUSH(Txt,mglTexture("BbcyrR",1),mutexTxt); memcpy(last_style,"{k5}-1\0",8); MinS=mglPoint(-1,-1,-1); MaxS=mglPoint(1,1,1); + fnt = new mglFont; fnt->gr = this; PrevState=NAN; +} +mglBase::~mglBase() { ClearEq(); delete fnt; } +//----------------------------------------------------------------------------- +void mglBase::RestoreFont() { fnt->Restore(); } +void mglBase::LoadFont(const char *name, const char *path) +{ if(name && *name) fnt->Load(name,path); else fnt->Restore(); } +void mglBase::CopyFont(mglBase *gr) { fnt->Copy(gr->GetFont()); } +//----------------------------------------------------------------------------- +mreal mglBase::TextWidth(const char *text, const char *font, mreal size) const +{ return (size<0?-size*FontSize:size)*font_factor*fnt->Width(text,(font&&*font)?font:FontDef)/20.16; } +mreal mglBase::TextWidth(const wchar_t *text, const char *font, mreal size) const +{ return (size<0?-size*FontSize:size)*font_factor*fnt->Width(text,(font&&*font)?font:FontDef)/20.16; } +mreal mglBase::TextHeight(const char *font, mreal size) const +{ return (size<0?-size*FontSize:size)*font_factor*fnt->Height(font?font:FontDef)/20.16; } +void mglBase::AddActive(long k,int n) +{ + if(k<0 || (size_t)k>=Pnt.size()) return; + mglActivePos p; + const mglPnt &q=Pnt[k]; + int h=GetHeight(); + p.x = int(q.x); p.y = h>1?h-1-int(q.y):int(q.y); + p.id = ObjId; p.n = n; + MGL_PUSH(Act,p,mutexAct); } -mglBase::~mglBase() { ClearEq(); } //----------------------------------------------------------------------------- mreal mglBase::GetRatio() const { return 1; } +int mglBase::GetWidth() const { return 1; } +int mglBase::GetHeight() const { return 1; } //----------------------------------------------------------------------------- void mglBase::StartGroup(const char *name, int id) { @@ -111,6 +188,40 @@ void mglBase::SetWarn(int code, const char *who) LoadState(); } //----------------------------------------------------------------------------- +// Add glyph to the buffer +//----------------------------------------------------------------------------- +void mglGlyph::Create(long Nt, long Nl) +{ + if(Nt<0 || Nl<0) return; + nt=Nt; nl=Nl; + if(trig) delete []trig; + trig = nt>0?new short[6*nt]:0; + if(line) delete []line; + line = nl>0?new short[2*nl]:0; +} +//----------------------------------------------------------------------------- +bool mglGlyph::operator==(const mglGlyph &g) +{ + if(nl!=g.nl || nt!=g.nt) return false; + if(trig && memcmp(trig,g.trig,6*nt*sizeof(short))) return false; + if(line && memcmp(line,g.line,2*nl*sizeof(short))) return false; + return true; +} +//----------------------------------------------------------------------------- +long mglBase::AddGlyph(int s, long j) +{ + // first create glyph for current typeface + s = s&3; + mglGlyph g(fnt->GetNt(s,j), fnt->GetNl(s,j)); + memcpy(g.trig, fnt->GetTr(s,j), 6*g.nt*sizeof(short)); + memcpy(g.line, fnt->GetLn(s,j), 2*g.nl*sizeof(short)); + // now let find the similar glyph + register size_t i; + for(i=0;i=Txt.size()) ci=0; // NOTE never should be here!!! + if(ci<0 || ci>=(long)Txt.size()) ci=0; // NOTE never should be here!!! const mglTexture &txt=Txt[ci]; txt.GetC(c,a,q); // RGBA color // add gap for texture coordinates for compatibility with OpenGL - const mreal gap = 1./512; + const mreal gap = 0./512; q.c = ci+(q.c-ci)*(1-2*gap)+gap; q.t = q.t*(1-2*gap)+gap; q.ta = q.t; + if(scl&8 && scl>0) q.a=a; // bypass palette for enabling alpha in Error() if(!get(MGL_ENABLE_ALPHA)) { q.a=1; if(txt.Smooth!=2) q.ta=1-gap; } // if(q.ta<0.005) q.ta = 0.005; // bypass OpenGL/OBJ/PRC bug - if(scl&8 && scl>0) q.a=a; // bypass palette for enabling alpha in Error() if(!get(MGL_ENABLE_LIGHT) && !(scl&4)) q.u=q.v=NAN; MGL_PUSH(Pnt,q,mutexPnt); return Pnt.size()-1; } @@ -164,7 +275,7 @@ long mglBase::CopyProj(long from, mglPoint p, mglPoint n) if(from<0) return -1; mglPnt q=Pnt[from]; q.x=q.xx=p.x; q.y=q.yy=p.y; q.z=q.zz=p.z; - q.u=n.x; q.v=n.y; q.w=n.z; + q.u = n.x; q.v = n.y; q.w = n.z; MGL_PUSH(Pnt,q,mutexPnt); return Pnt.size()-1; } //----------------------------------------------------------------------------- @@ -259,13 +370,13 @@ bool mglBase::ScalePoint(mglPoint &p, mglPoint &n, bool use_nan) const mreal &x=p.x, &y=p.y, &z=p.z; if(mgl_isnan(x) || mgl_isnan(y) || mgl_isnan(z)) { x=NAN; return false; } mreal x1,y1,z1,x2,y2,z2; - x1 = x>0?x*MGL_EPSILON:x/MGL_EPSILON; x2 = x<0?x*MGL_EPSILON:x/MGL_EPSILON; - y1 = y>0?y*MGL_EPSILON:y/MGL_EPSILON; y2 = y<0?y*MGL_EPSILON:y/MGL_EPSILON; - z1 = z>0?z*MGL_EPSILON:z/MGL_EPSILON; z2 = z<0?z*MGL_EPSILON:z/MGL_EPSILON; + x1 = x>0?x*MGL_FEPSILON:x/MGL_FEPSILON; x2 = x<0?x*MGL_FEPSILON:x/MGL_FEPSILON; + y1 = y>0?y*MGL_FEPSILON:y/MGL_FEPSILON; y2 = y<0?y*MGL_FEPSILON:y/MGL_FEPSILON; + z1 = z>0?z*MGL_FEPSILON:z/MGL_FEPSILON; z2 = z<0?z*MGL_FEPSILON:z/MGL_FEPSILON; bool res = true; if(x2>CutMin.x && x1CutMin.y && y1CutMin.z && z1Calc(x,y,z)) res = false; + if(fc && fc->Calc(x,y,z)!=0) res = false; if(get(MGL_ENABLE_CUT) || !use_nan) { @@ -314,7 +425,7 @@ bool mglBase::ScalePoint(mglPoint &p, mglPoint &n, bool use_nan) const x += 1+(y+z)/2; y += (z+1)/3; n.x += (n.y+n.z)/2; n.y += n.z/3; } - if(fabs(x)>MGL_EPSILON || fabs(y)>MGL_EPSILON || fabs(z)>MGL_EPSILON) res = false; + if(fabs(x)>MGL_FEPSILON || fabs(y)>MGL_FEPSILON || fabs(z)>MGL_FEPSILON) res = false; if(!res && use_nan) x = NAN; // extra sign that point shouldn't be plotted return res; @@ -322,6 +433,35 @@ bool mglBase::ScalePoint(mglPoint &p, mglPoint &n, bool use_nan) const //----------------------------------------------------------------------------- // Ranges //----------------------------------------------------------------------------- +void mglScaleAxis(mreal &v1, mreal &v2, mreal &v0, mreal x1, mreal x2) +{ + if(x1==x2 || v1==v2) return; + mreal dv,d0; x2-=1; + if(v1*v2>0 && (v2/v1>=100 || v2/v1<=0.01)) // log scale + { + dv=log(v2/v1); d0 = log(v0/v1)/log(v2/v1); + v1*=exp(dv*x1); v2*=exp(dv*x2); v0=v1*exp(d0*log(v2/v1)); + } + else + { + dv=v2-v1; d0=(v0-v1)/(v2-v1); + v1+=dv*x1; v2+=dv*x2; v0=v1+d0*(v2-v1); + } +} +//----------------------------------------------------------------------------- +void mglBase::SetOrigin(mreal x0, mreal y0, mreal z0, mreal c0) +{ + Org=mglPoint(x0,y0,z0,c0); + if((TernAxis&3)==0) + { + Min = OMin; Max = OMax; + mglScaleAxis(Min.x, Max.x, Org.x, AMin.x, AMax.x); + mglScaleAxis(Min.y, Max.y, Org.y, AMin.y, AMax.y); + mglScaleAxis(Min.z, Max.z, Org.z, AMin.z, AMax.z); + mglScaleAxis(Min.c, Max.c, Org.c, AMin.c, AMax.c); + } +} +//----------------------------------------------------------------------------- void mglBase::SetRanges(mglPoint m1, mglPoint m2) { if(m1.x!=m2.x) { Min.x=m1.x; Max.x=m2.x; } @@ -329,15 +469,23 @@ void mglBase::SetRanges(mglPoint m1, mglPoint m2) if(m1.z!=m2.z) { Min.z=m1.z; Max.z=m2.z; } if(m1.c!=m2.c) { Min.c=m1.c; Max.c=m2.c; } else { Min.c=Min.z;Max.c=Max.z;} -// if(AutoOrg) + + if(Org.xMax.x && !mgl_isnan(Org.x)) Org.x = Max.x; + if(Org.yMax.y && !mgl_isnan(Org.y)) Org.y = Max.y; + if(Org.zMax.z && !mgl_isnan(Org.z)) Org.z = Max.z; + + if((TernAxis&3)==0) { - if(Org.xMax.x && !mgl_isnan(Org.x)) Org.x = Max.x; - if(Org.yMax.y && !mgl_isnan(Org.y)) Org.y = Max.y; - if(Org.zMax.z && !mgl_isnan(Org.z)) Org.z = Max.z; - } + OMax = Max; OMin = Min; + mglScaleAxis(Min.x, Max.x, Org.x, AMin.x, AMax.x); + mglScaleAxis(Min.y, Max.y, Org.y, AMin.y, AMax.y); + mglScaleAxis(Min.z, Max.z, Org.z, AMin.z, AMax.z); + mglScaleAxis(Min.c, Max.c, Org.c, AMin.c, AMax.c); + } + CutMin = mglPoint(0,0,0); CutMax = mglPoint(0,0,0); RecalcBorder(); } @@ -361,6 +509,11 @@ void mglBase::CRange(HCDT a,bool add, mreal fact) } if(Org.cMax.c && !mgl_isnan(Org.c)) Org.c = Max.c; + if((TernAxis&3)==0) + { + OMax.c = Max.c; OMin.c = Min.c; + mglScaleAxis(Min.c, Max.c, Org.c, AMin.c, AMax.c); + } RecalcCRange(); } //----------------------------------------------------------------------------- @@ -383,6 +536,11 @@ void mglBase::XRange(HCDT a,bool add,mreal fact) } if(Org.xMax.x && !mgl_isnan(Org.x)) Org.x = Max.x; + if((TernAxis&3)==0) + { + OMax.x = Max.x; OMin.x = Min.x; + mglScaleAxis(Min.x, Max.x, Org.x, AMin.x, AMax.x); + } RecalcBorder(); } //----------------------------------------------------------------------------- @@ -405,6 +563,12 @@ void mglBase::YRange(HCDT a,bool add,mreal fact) } if(Org.yMax.y && !mgl_isnan(Org.y)) Org.y = Max.y; + if((TernAxis&3)==0) + { + OMax.y = Max.y; OMin.y = Min.y; + mglScaleAxis(Min.y, Max.y, Org.y, AMin.y, AMax.y); + + } RecalcBorder(); } //----------------------------------------------------------------------------- @@ -427,6 +591,11 @@ void mglBase::ZRange(HCDT a,bool add,mreal fact) } if(Org.zMax.z && !mgl_isnan(Org.z)) Org.z = Max.z; + if((TernAxis&3)==0) + { + OMax.z = Max.z; OMin.z = Min.z; + mglScaleAxis(Min.z, Max.z, Org.z, AMin.z, AMax.z); + } RecalcBorder(); } //----------------------------------------------------------------------------- @@ -450,7 +619,7 @@ void mglBase::Ternary(int t) SetRanges(mglPoint(0,0),mglPoint(1,1,t==1?0:1)); Org=mglPoint(0,0,0); c = false; } - else { SetRanges(x1,x2); Org=o; c=true; } + else if(!c) { SetRanges(x1,x2); Org=o; c=true; } } //----------------------------------------------------------------------------- // Transformation functions @@ -567,40 +736,60 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha) strncpy(Sch,s,259); Smooth=smooth; Alpha=alpha; register long i,j=0,m=0,l=strlen(s); - const char *cols = MGL_COLORS; + const char *dig = "0123456789abcdefABCDEF"; + bool map = smooth==2 || mglchr(s,'%'), sm = smooth>=0 && !strchr(s,'|'); // Use mapping, smoothed colors for(i=0;i=0 && s[i]==':' && j<1) break; if(s[i]=='[') j++; if(s[i]==']') j--; - if(strchr(cols,s[i]) && j<1) n++; + if(strchr(MGL_COLORS,s[i]) && j<1) n++; + if(s[i]=='x' && i>0 && s[i-1]=='{' && j<1) n++; // if(smooth && s[i]==':') break; // NOTE: should use [] } if(!n) { - // it seems to be the only case where new color scheme should be - if((strchr(s,'|') || strchr(s,'!')) && !smooth) - { n=l=6; s="BbcyrR"; smooth = -1; } + if((strchr(s,'|') || strchr(s,'!')) && !smooth) // sharp colors + { n=l=6; s="BbcyrR"; sm = false; } + else if(smooth==0) // none colors but color scheme + { n=l=6; s="BbcyrR"; } else return; } - if(strchr(s,'|') && !smooth) smooth = -1; + bool man=sm; mglColor *c = new mglColor[2*n]; // Colors itself - bool map = (smooth==2), sm = smooth>=0; // Use mapping, smoothed colors + mreal *val = new mreal[n]; for(i=j=n=0;i=0 && s[i]==':' && j<1) break; if(s[i]=='[') j++; if(s[i]==']') j--; if(s[i]=='{') m++; if(s[i]=='}') m--; - if(strchr(cols,s[i]) && j<1) // this is color + if(strchr(MGL_COLORS,s[i]) && j<1 && (m==0 || s[i-1]=='{')) // {CN,val} format, where val in [0,1] { if(m>0 && s[i+1]>'0' && s[i+1]<='9')// ext color { c[2*n] = mglColor(s[i],(s[i+1]-'0')/5.f); i++; } else c[2*n] = mglColor(s[i]); // usual color - n++; + val[n]=-1; n++; } + if(s[i]=='x' && i>0 && s[i-1]=='{' && j<1) // {xRRGGBB,val} format, where val in [0,1] + { + if(strchr(dig,s[i+1]) && strchr(dig,s[i+2]) && strchr(dig,s[i+3]) && strchr(dig,s[i+4]) && strchr(dig,s[i+5]) && strchr(dig,s[i+6])) + { + char ss[3]="00"; c[2*n].a = 1; + ss[0] = s[i+1]; ss[1] = s[i+2]; c[2*n].r = strtol(ss,0,16)/255.; + ss[0] = s[i+3]; ss[1] = s[i+4]; c[2*n].g = strtol(ss,0,16)/255.; + ss[0] = s[i+5]; ss[1] = s[i+6]; c[2*n].b = strtol(ss,0,16)/255.; + if(strchr(dig,s[i+7]) && strchr(dig,s[i+8])) + { ss[0] = s[i+7]; ss[1] = s[i+8]; c[2*n].a = strtol(ss,0,16)/255.; i+=2; } + val[n]=-1; i+=6; n++; + } + } + if(s[i]==',' && m>0 && j<1 && n>0) + val[n-1] = atof(s+i+1); // NOTE: User can change alpha if it placed like {AN} if(s[i]=='A' && j<1 && m>0 && s[i+1]>'0' && s[i+1]<='9') - { alpha = 0.1*(s[i+1]-'0'); i++; } + { man=false; alpha = 0.1*(s[i+1]-'0'); i++; } } for(i=0;i def; + val[0]=0; val[n-1]=1; // boundary have to be [0,1] + for(i=0;i0 && val[i]<1) def.push_back(i); + def.push_back(n-1); + long i1=0,i2; + for(size_t j=0;j0?def[j-1]:0; i2 = def[j]; + v1 = val[i1]; v2 = val[i2]; + v2 = i2-i1>1?(v2-v1)/(i2-i1):0; + val[i]=v1+v2*(i-i1); } + // fill texture itself register mreal u,v=sm?(n-1)/255.:n/256.; - for(i=0;i<256;i++) + for(i=0,i1=0;i<256;i++) { u = v*i; j = long(u); u-=j; if(!sm || j==n-1) @@ -620,12 +828,29 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha) { col[2*i] = c[2*n-2];col[2*i+1] = c[2*n-1]; /*printf("AddTexture -- out of bounds");*/ } else { + // advanced scheme using val + for(;i1=255*val[i1];i1++); + v2 = i10) continue; - if(strchr(stl,p[i])) + if(mglchr(stl,p[i])) { switch(p[i]) { @@ -725,17 +965,17 @@ char mglBase::SetPenPal(const char *p, long *Id) } last_style[4]=p[i]; } - else if(strchr(mrk,p[i])) mk = p[i]; - else if(strchr(wdh,p[i])) + else if(mglchr(mrk,p[i])) mk = p[i]; + else if(mglchr(wdh,p[i])) { last_style[5] = p[i]; PenWidth = p[i]-'0'; } - else if(strchr(arr,p[i])) + else if(mglchr(arr,p[i])) { if(!Arrow2) Arrow2 = p[i]; else Arrow1 = p[i]; } } if(Arrow1=='_') Arrow1=0; if(Arrow2=='_') Arrow2=0; - if(strchr(p,'#')) + if(mglchr(p,'#')) { if(mk=='.') mk = 'C'; if(mk=='+') mk = 'P'; @@ -762,7 +1002,7 @@ mreal mglBase::GetA(mreal a) const { if(fa) a = fa->Calc(0,0,0,a); a = (a-FMin.c)/(FMax.c-FMin.c); - a = (a<1?(a>0?a:0):1)/MGL_EPSILON; // for texture a must be <1 always!!! + a = (a<1?(a>0?a:0):1)/MGL_FEPSILON; // for texture a must be <1 always!!! return a; } //----------------------------------------------------------------------------- @@ -830,7 +1070,8 @@ void mglBase::SetAmbient(mreal bright) { AmbBr = bright; } //----------------------------------------------------------------------------- mreal mglBase::SaveState(const char *opt) { - if(!opt || !opt[0] || saved) return NAN; + if(saved) return PrevState; + if(!opt || !opt[0]) return NAN; MSS=MarkSize; ASS=ArrowSize; FSS=FontSize; ADS=AlphaDef; MNS=MeshNum; CSS=Flag; LSS=AmbBr; @@ -841,6 +1082,7 @@ mreal mglBase::SaveState(const char *opt) mgl_strtrim(q); // NOTE: not consider '#' inside legend entry !!! s=strchr(q,'#'); if(s) *s=0; + mreal res=NAN; while(q && *q) { s=q; q=strchr(s,';'); @@ -871,11 +1113,11 @@ mreal mglBase::SaveState(const char *opt) else if(!strcmp(a,"diffuse")) SetDifLight(ff); else if(!strcmp(a,"size")) { SetMarkSize(ff); SetFontSize(ff); SetArrowSize(ff); } - else if(!strcmp(a,"num") || !strcmp(a,"number") || !strcmp(a,"value")) return ff; + else if(!strcmp(a,"num") || !strcmp(a,"number") || !strcmp(a,"value")) res=ff; else if(!strcmp(a,"legend")) { if(*b=='\'') { b++; b[strlen(b)-1]=0; } leg_str = b; } } - free(qi); return NAN; + free(qi); PrevState=res; return res; } //----------------------------------------------------------------------------- void mglBase::LoadState() @@ -893,7 +1135,7 @@ void mglBase::AddLegend(const wchar_t *text,const char *style) void mglBase::AddLegend(const char *str,const char *style) { if(!str) return; - unsigned s = strlen(str)+1; + size_t s = strlen(str)+1; wchar_t *wcs = new wchar_t[s]; mbstowcs(wcs,str,s); AddLegend(wcs, style); @@ -902,6 +1144,7 @@ void mglBase::AddLegend(const char *str,const char *style) //----------------------------------------------------------------------------- bool mgl_check_dim2(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, bool less) { +// if(!gr || !x || !y || !z) return true; // if data is absent then should be segfault!!! register long n=z->GetNx(),m=z->GetNy(); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,name); return true; } if(a && n*m*z->GetNz()!=a->GetNx()*a->GetNy()*a->GetNz()) @@ -911,20 +1154,40 @@ bool mgl_check_dim2(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, b if(x->GetNx()SetWarn(mglWarnDim,name); return true; } if(y->GetNx()GetNy()GetNx()GetNy()SetWarn(mglWarnDim,name); return true; }; + { gr->SetWarn(mglWarnDim,name); return true; } } else { if(x->GetNx()!=n) { gr->SetWarn(mglWarnDim,name); return true; } if(y->GetNx()!=m && (x->GetNy()!=m || y->GetNx()!=n || y->GetNy()!=m)) - { gr->SetWarn(mglWarnDim,name); return true; }; + { gr->SetWarn(mglWarnDim,name); return true; } + } + return false; +} +//----------------------------------------------------------------------------- +bool mgl_check_dim0(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *name, bool less) +{ +// if(!gr || !x || !y) return true; // if data is absent then should be segfault!!! + register long n=y->GetNx(); + if(less) + { + if(x->GetNx()SetWarn(mglWarnDim,name); return true; } + if(z && z->GetNx()SetWarn(mglWarnDim,name); return true; } + if(r && r->GetNx()SetWarn(mglWarnDim,name); return true; } + } + else + { + if(x->GetNx()!=n) { gr->SetWarn(mglWarnDim,name); return true; } + if(z && z->GetNx()!=n) { gr->SetWarn(mglWarnDim,name); return true; } + if(r && r->GetNx()!=n) { gr->SetWarn(mglWarnDim,name); return true; } } return false; } //----------------------------------------------------------------------------- bool mgl_check_dim1(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *name, bool less) { +// if(!gr || !x || !y) return true; // if data is absent then should be segfault!!! register long n=y->GetNx(); if(n<2) { gr->SetWarn(mglWarnLow,name); return true; } if(less) @@ -944,6 +1207,7 @@ bool mgl_check_dim1(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *name, b //----------------------------------------------------------------------------- bool mgl_check_dim3(HMGL gr, bool both, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *name) { +// if(!gr || !x || !y || !z || !a) return true; // if data is absent then should be segfault!!! register long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(n<2 || m<2 || l<2) { gr->SetWarn(mglWarnLow,name); return true; } @@ -956,6 +1220,7 @@ bool mgl_check_dim3(HMGL gr, bool both, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, //----------------------------------------------------------------------------- bool mgl_check_trig(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, int d) { +// if(!gr || !x || !y || !z || !a || !nums) return true; // if data is absent then should be segfault!!! long n = x->GetNx(), m = nums->GetNy(); if(nums->GetNx()SetWarn(mglWarnLow,name); return true; } if(y->GetNx()!=n || z->GetNx()!=n) { gr->SetWarn(mglWarnDim,name); return true; } @@ -971,6 +1236,7 @@ bool mgl_isboth(HCDT x, HCDT y, HCDT z, HCDT a) //----------------------------------------------------------------------------- bool mgl_check_vec3(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *name) { +// if(!gr || !x || !y || !z || !ax || !ay || !az) return true; // if data is absent then should be segfault!!! register long n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(); if(n*m*l!=ay->GetNx()*ay->GetNy()*ay->GetNz() || n*m*l!=az->GetNx()*az->GetNy()*az->GetNz()) { gr->SetWarn(mglWarnDim,name); return true; } @@ -981,3 +1247,47 @@ bool mgl_check_vec3(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, return false; } //----------------------------------------------------------------------------- +void mglBase::SetFontDef(const char *font) { strncpy(FontDef, font, 31); } +//----------------------------------------------------------------------------- +void mglBase::ClearUnused() +{ +#if MGL_HAVE_PTHREAD + pthread_mutex_lock(&mutexPnt); pthread_mutex_lock(&mutexPrm); +#endif + register size_t i, l=Prm.size(); + // find points which are actually used + long *used = new long[Pnt.size()]; memset(used,0,Pnt.size()*sizeof(long)); + for(i=0;i=0) used[p.n2] = 1; break; + case 2: if(p.n2>=0 && p.n3>=0) + used[p.n2] = used[p.n3] = 1; break; + case 3: if(p.n2>=0 && p.n3>=0 && p.n4>=0) + used[p.n2] = used[p.n3] = used[p.n4] = 1; break; + } + } + // now add proper indexes + l=Pnt.size(); + std::vector pnt; + for(i=0;i * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -17,6 +17,7 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include "mgl2/font.h" #include "mgl2/base_cf.h" //----------------------------------------------------------------------------- // @@ -26,7 +27,7 @@ int mgl_get_flag(HMGL gr, long flag) { return gr->get(flag); } void mgl_set_flag(HMGL gr, int val, long flag) { gr->set(val,flag); } //----------------------------------------------------------------------------- -void mgl_set_color(char id, mreal r, mreal g, mreal b) +void mgl_set_color(char id, double r, double g, double b) { register size_t i; for(i=0;mglColorIds[i].id;i++) if(mglColorIds[i].id==id) mglColorIds[i].col = mglColor(r,g,b); @@ -36,29 +37,31 @@ void mgl_set_color_(char *id, mreal *r, mreal *g, mreal *b, int) { mgl_set_color void mgl_set_def_sch(HMGL gr, const char *sch) { gr->SetDefScheme(sch); } void mgl_set_def_sch_(uintptr_t *gr, const char *sch,int l) { char *s=new char[l+1]; memcpy(s,sch,l); s[l]=0; - _GR_->SetDefScheme(s); delete []s; } + mgl_set_def_sch(_GR_, s); delete []s; } //----------------------------------------------------------------------------- const char *mgl_get_mess(HMGL gr) { return gr->Mess.c_str(); } int mgl_get_warn(HMGL gr) { return gr->GetWarn(); } void mgl_set_warn(HMGL gr, int code, const char *txt) { gr->SetWarn(code,txt); } -void mgl_set_origin(HMGL gr, mreal x0, mreal y0, mreal z0) +void mgl_set_origin(HMGL gr, double x0, double y0, double z0) { gr->SetOrigin(x0,y0,z0); } void mgl_set_palette(HMGL gr, const char *colors) { gr->SetPalette(colors); } void mgl_set_meshnum(HMGL gr, int num) { gr->SetMeshNum(num); } -void mgl_set_alpha_default(HMGL gr, mreal alpha) { gr->SetAlphaDef(alpha); } +void mgl_set_facenum(HMGL gr, int num) { gr->FaceNum=num; } +void mgl_set_alpha_default(HMGL gr, double alpha) { gr->SetAlphaDef(alpha); } void mgl_set_light_dif(HMGL gr, int enable) { gr->SetDifLight(enable); } +void mgl_clear_unused(HMGL gr) { gr->ClearUnused(); } //----------------------------------------------------------------------------- void mgl_set_rdc_acc(HMGL gr, int reduce) { gr->SetReduceAcc(reduce); } void mgl_highlight(HMGL gr, int id) { gr->Highlight(id); } void mgl_set_cut(HMGL gr, int cut) { gr->SetCut(cut); } -void mgl_set_cut_box(HMGL gr, mreal x1,mreal y1,mreal z1,mreal x2,mreal y2,mreal z2) +void mgl_set_cut_box(HMGL gr, double x1,double y1,double z1,double x2,double y2,double z2) { gr->SetCutBox(x1,y1,z1,x2,y2,z2); } void mgl_set_cutoff(HMGL gr, const char *EqC) { gr->CutOff(EqC); } //----------------------------------------------------------------------------- void mgl_set_ternary(HMGL gr, int enable) { gr->Ternary(enable); } -void mgl_set_range_val(HMGL gr, char dir, mreal v1,mreal v2) +void mgl_set_range_val(HMGL gr, char dir, double v1,double v2) { if(dir=='c') gr->CRange(v1,v2); else if(dir=='x') gr->XRange(v1,v2); @@ -70,17 +73,13 @@ void mgl_set_range_dat(HMGL gr, char dir, HCDT a, int add) else if(dir=='x') gr->XRange(a,add); else if(dir=='y') gr->YRange(a,add); else if(dir=='z') gr->ZRange(a,add); } -void mgl_set_ranges(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2) +void mgl_set_ranges(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2) { gr->SetRanges(x1,y1,z1,x2,y2,z2); } void mgl_set_func(HMGL gr, const char *EqX,const char *EqY,const char *EqZ,const char *EqA) { gr->SetFunc(EqX,EqY,EqZ,EqA); } void mgl_set_coor(HMGL gr, int how) { gr->SetCoor(how); } //----------------------------------------------------------------------------- -long mgl_data_get_nx(HCDT d) { return d->GetNx(); } -long mgl_data_get_ny(HCDT d) { return d->GetNy(); } -long mgl_data_get_nz(HCDT d) { return d->GetNz(); } -//----------------------------------------------------------------------------- -void mgl_set_bar_width(HMGL gr, mreal width) { gr->SetBarWidth(width); } +void mgl_set_bar_width(HMGL gr, double width) { gr->SetBarWidth(width); } //----------------------------------------------------------------------------- // // Fortran interfaces @@ -99,10 +98,12 @@ void mgl_set_palette_(uintptr_t *gr, const char *colors, int l) { char *s=new char[l+1]; memcpy(s,colors,l); s[l]=0; _GR_->SetPalette(s); delete []s; } void mgl_set_meshnum_(uintptr_t *gr, int *num) { _GR_->SetMeshNum(*num); } +void mgl_set_facenum_(uintptr_t *gr, int *num) { _GR_->FaceNum=*num; } void mgl_set_alpha_default_(uintptr_t *gr, mreal *alpha) { _GR_->SetAlphaDef(*alpha); } void mgl_set_light_dif_(uintptr_t *gr, int *enable) { _GR_->SetDifLight(*enable); } +void mgl_clear_unused_(uintptr_t *gr) { _GR_->ClearUnused(); } //----------------------------------------------------------------------------- -void mgl_set_cut_box_(uintptr_t *gr, mreal *x1,mreal *y1,mreal *z1,mreal *x2,mreal *y2,mreal *z2) +void mgl_set_cut_box_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2) { _GR_->SetCutBox(*x1,*y1,*z1,*x2,*y2,*z2); } void mgl_set_cut_(uintptr_t *gr, int *cut) { _GR_->SetCut(*cut); } void mgl_set_cutoff_(uintptr_t *gr, const char *EqC, int l) @@ -110,7 +111,7 @@ void mgl_set_cutoff_(uintptr_t *gr, const char *EqC, int l) _GR_->CutOff(s); delete []s; } //----------------------------------------------------------------------------- void mgl_set_ternary_(uintptr_t *gr, int *enable) { _GR_->Ternary(*enable); } -void mgl_set_range_val_(uintptr_t *gr, const char *dir, mreal *v1,mreal *v2,int) +void mgl_set_range_val_(uintptr_t *gr, const char *dir, mreal *v1, mreal *v2,int) { mgl_set_range_val(_GR_,*dir,*v1,*v2); } void mgl_set_range_dat_(uintptr_t *gr, const char *dir, uintptr_t *a, int *add,int) { mgl_set_range_dat(_GR_,*dir,_DA_(a),*add); } @@ -128,24 +129,20 @@ void mgl_set_func_(uintptr_t *gr, const char *EqX,const char *EqY,const char *Eq void mgl_set_coor_(uintptr_t *gr, int *how) { _GR_->SetCoor(*how); } //----------------------------------------------------------------------------- -long mgl_data_get_nx_(uintptr_t *d) { return _DA_(d)->GetNx(); } -long mgl_data_get_ny_(uintptr_t *d) { return _DA_(d)->GetNy(); } -long mgl_data_get_nz_(uintptr_t *d) { return _DA_(d)->GetNz(); } -//----------------------------------------------------------------------------- void mgl_set_tick_rotate(HMGL gr, int enable){ gr->SetTickRotate(enable); } void mgl_set_tick_skip(HMGL gr, int enable) { gr->SetTickSkip(enable); } void mgl_set_tick_rotate_(uintptr_t *gr,int *enable){ _GR_->SetTickRotate(*enable); } void mgl_set_tick_skip_(uintptr_t *gr, int *enable) { _GR_->SetTickSkip(*enable); } //----------------------------------------------------------------------------- void mgl_set_rotated_text(HMGL gr, int enable) { gr->SetRotatedText(enable); } -void mgl_set_mark_size(HMGL gr, mreal size) { gr->SetMarkSize(size); } -void mgl_set_arrow_size(HMGL gr, mreal size) { gr->SetArrowSize(size); } -void mgl_set_font_size(HMGL gr, mreal size) { gr->SetFontSize(size); } +void mgl_set_mark_size(HMGL gr, double size) { gr->SetMarkSize(size); } +void mgl_set_arrow_size(HMGL gr, double size) { gr->SetArrowSize(size); } +void mgl_set_font_size(HMGL gr, double size) { gr->SetFontSize(size); } void mgl_set_font_def(HMGL gr, const char *fnt) { gr->SetFontDef(fnt); } void mgl_load_font(HMGL gr, const char *name, const char *path) -{ if(name && *name) gr->GetFont()->Load(name,path); else gr->GetFont()->Restore(); } -void mgl_copy_font(HMGL gr, HMGL gr_from) { gr->GetFont()->Copy(gr_from->GetFont()); } -void mgl_restore_font(HMGL gr) { gr->GetFont()->Restore(); } +{ gr->LoadFont(name,path); } +void mgl_copy_font(HMGL gr, HMGL gr_from) { gr->CopyFont(gr_from); } +void mgl_restore_font(HMGL gr) { gr->RestoreFont(); } //----------------------------------------------------------------------------- void mgl_set_bar_width_(uintptr_t *gr, mreal *width) { _GR_->SetBarWidth(*width); } void mgl_set_rotated_text_(uintptr_t *gr, int *rotated) { _GR_->SetRotatedText(*rotated); } @@ -158,10 +155,18 @@ void mgl_set_font_def_(uintptr_t *gr, char *name, int l) void mgl_load_font_(uintptr_t *gr, char *name, char *path, int l,int n) { char *s=new char[l+1]; memcpy(s,name,l); s[l]=0; char *d=new char[n+1]; memcpy(d,path,n); d[n]=0; - _GR_->GetFont()->Load(s,d); delete []s; delete []d; } + _GR_->LoadFont(s,d); delete []s; delete []d; } void mgl_copy_font_(uintptr_t *gr, uintptr_t *gr_from) -{ _GR_->GetFont()->Copy(((mglBase *)(*gr_from))->GetFont()); } -void mgl_restore_font_(uintptr_t *gr) { _GR_->GetFont()->Restore(); } +{ _GR_->CopyFont((mglBase *)(*gr_from)); } +void mgl_restore_font_(uintptr_t *gr) { _GR_->RestoreFont(); } +//----------------------------------------------------------------------------- +extern mglFont mglDefFont; +void mgl_def_font(const char *name, const char *path) +{ mglDefFont.Load(name,path); } +void mgl_def_font_(const char *name, const char *path,int l,int n) +{ char *s=new char[l+1]; memcpy(s,name,l); s[l]=0; + char *d=new char[n+1]; memcpy(d,path,n); d[n]=0; + mglDefFont.Load(name,path); delete []s; delete []d; } //----------------------------------------------------------------------------- void mgl_start_group(HMGL gr, const char *s) { gr->StartAutoGroup(s); } void mgl_end_group(HMGL gr) { gr->EndGroup(); } @@ -192,6 +197,11 @@ long mgl_use_graph(HMGL gr, int inc) long mgl_use_graph_(uintptr_t *gr, int *inc) { return mgl_use_graph(_GR_,*inc); } //--------------------------------------------------------------------------- -void mgl_set_ambbr(HMGL gr, mreal i) { gr->SetAmbient(i); } +void mgl_set_ambbr(HMGL gr, double i) { gr->SetAmbient(i); } void mgl_set_ambbr_(uintptr_t *gr, mreal *i){ _GR_->SetAmbient(*i); } //--------------------------------------------------------------------------- +void mgl_zoom_axis(HMGL gr, double x1,double y1,double z1,double c1,double x2,double y2,double z2,double c2) +{ gr->ZoomAxis(mglPoint(x1,y1,z1,c1), mglPoint(x2,y2,z2,c2)); } +void mgl_zoom_axis_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *c1, mreal *x2, mreal *y2, mreal *z2, mreal *c2) +{ _GR_->ZoomAxis(mglPoint(*x1,*y1,*z1,*c1), mglPoint(*x2,*y2,*z2,*c2)); } +//--------------------------------------------------------------------------- diff --git a/src/canvas.cpp b/src/canvas.cpp index c37928d..6494512 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * canvas.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -18,49 +18,130 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include +#include "mgl2/font.h" #include "mgl2/canvas.h" //----------------------------------------------------------------------------- +std::string mglGlobalMess; ///< Buffer for receiving global messages +//----------------------------------------------------------------------------- mglCanvas::mglCanvas(int w, int h) : mglBase() { clr(MGL_DISABLE_SCALE); + set(MGL_VECT_FRAME); // NOTE: require a lot of memory! Z=0; C=G=G4=0; OI=0; gif=0; CurFrameId=0; Delay=0.5; Width=Height=Depth=0; ObjId=-1; - fscl=ftet=0; + fscl=ftet=0; PlotId = "frame"; dr_nx1=dr_nx2=dr_ny1=dr_ny2=0; // Allowed drawing region - fnt = new mglFont; fnt->gr = this; ac.ch='c'; + ac.ch='c'; ax.dir = mglPoint(1,0,0); ax.a = mglPoint(0,1,0); ax.b = mglPoint(0,0,1); ax.ch='x'; ay.dir = mglPoint(0,1,0); ay.a = mglPoint(1,0,0); ay.b = mglPoint(0,0,1); ay.ch='y'; az.dir = mglPoint(0,0,1); az.a = mglPoint(0,1,0); az.b = mglPoint(1,0,0); az.ch='z'; -#if MGL_HAVE_PTHREAD - pthread_mutex_init(&mutexSub,0); pthread_mutex_init(&mutexLeg,0); - pthread_mutex_init(&mutexPrm,0); pthread_mutex_init(&mutexPtx,0); - pthread_mutex_init(&mutexStk,0); pthread_mutex_init(&mutexGrp,0); -#endif + SetSize(w,h); SetQuality(MGL_DRAW_NORM); DefaultPlotParam(); } //----------------------------------------------------------------------------- mglCanvas::~mglCanvas() { - delete fnt; if(G) { delete []G; delete []C; delete []Z; delete []G4;delete []OI; } } //----------------------------------------------------------------------------- long mglCanvas::PushDrwDat() { mglDrawDat d; - d.Grp=Grp; d.Leg=Leg; d.Pnt=Pnt; d.Prm=Prm; - d.Ptx=Ptx; d.Sub=Sub; d.Txt=Txt; - DrwDat.push_back(d); + d.Pnt=Pnt; d.Prm=Prm; d.Glf=Glf; d.Ptx=Ptx; d.Txt=Txt; + MGL_PUSH(DrwDat,d,mutexDrw); return DrwDat.size(); } //----------------------------------------------------------------------------- -void mglCanvas::GetDrwDat(long i) +void mglCanvas::ResetFrames() { CurFrameId=0; DrwDat.clear(); } +//----------------------------------------------------------------------------- +void mglCanvas::SetFrame(long i) { - mglDrawDat &d=DrwDat[i]; - Grp=d.Grp; Leg=d.Leg; Pnt=d.Pnt; Prm=d.Prm; - Ptx=d.Ptx; Sub=d.Sub; Txt=d.Txt; + if(get(MGL_VECT_FRAME) && i>=0 && i=DrwDat.size()) return; + Clf(); + const mglDrawDat &d=DrwDat[k]; +#if MGL_HAVE_PTHREAD + pthread_mutex_lock(&mutexPnt); + pthread_mutex_lock(&mutexPrm); + pthread_mutex_lock(&mutexGlf); + pthread_mutex_lock(&mutexPtx); + pthread_mutex_lock(&mutexTxt); +#endif + Pnt=d.Pnt; Prm=d.Prm; Glf=d.Glf; Ptx=d.Ptx; Txt=d.Txt; +#if MGL_HAVE_PTHREAD + pthread_mutex_unlock(&mutexTxt); + pthread_mutex_unlock(&mutexPtx); + pthread_mutex_unlock(&mutexGlf); + pthread_mutex_unlock(&mutexPrm); + pthread_mutex_unlock(&mutexPnt); +#endif +} +//----------------------------------------------------------------------------- +void mglCanvas::ShowFrame(long k) +{ + if(k<0 || (size_t)k>=DrwDat.size()) return; + ClfZB(); + size_t npnt=Pnt.size(), nglf=Glf.size(), nptx=Ptx.size(), ntxt=Txt.size(); +#if MGL_HAVE_PTHREAD + pthread_mutex_lock(&mutexPnt); + pthread_mutex_lock(&mutexPrm); + pthread_mutex_lock(&mutexGlf); + pthread_mutex_lock(&mutexPtx); + pthread_mutex_lock(&mutexTxt); +#endif + const mglDrawDat &d=DrwDat[k]; + register size_t i; + Glf.reserve(d.Glf.size()); for(i=0;i=0) - { a.z = Pnt[a.n1].z; // this is a bit less accurate but simpler for transformation - a.id = ObjId; MGL_PUSH(Prm,a,mutexPrm); } + { + a.z = Pnt[a.n1].z; // this is a bit less accurate but simpler for transformation + a.id = ObjId; MGL_PUSH(Prm,a,mutexPrm); + clr(MGL_FINISHED); + } } //----------------------------------------------------------------------------- void mglCanvas::DefaultPlotParam() { /* NOTE: following variables and mutex will not be changed by DefaultPlotParam() -std::vector Txt; ///< Pointer to textures -char *Message; ///< Buffer for receiving messages long InUse; ///< Smart pointer (number of users) mglFont *fnt; ///< Class for printing vector text int Quality; ///< Quality of plot (0x0-pure, 0x1-fast; 0x2-fine; 0x4 - low memory) @@ -88,17 +170,18 @@ int Depth; ///< Depth of the image int CurFrameId; ///< Number of automaticle created frames GifFileType *gif;*/ SetTickRotate(true); SetTickSkip(true); - SetWarn(mglWarnNone,""); + SetWarn(mglWarnNone,""); mglGlobalMess = ""; ObjId = -1; HighId = INT_MIN; SetFunc(0,0); Stop=false; CutOff(0); Ternary(0); SetRanges(mglPoint(-1,-1,-1,-1), mglPoint(1,1,1,1)); + SetOrigin(NAN,NAN,NAN,NAN); SetBarWidth(0.7); SetMarkSize(1); SetArrowSize(1); SetAlphaDef(0.5); FontDef[0]=0; SetTranspType(0); SetMeshNum(0); // NOTE: default MeshNum=0 SetRotatedText(true); CurrPal = 0; SetLegendMarks(); SetFontSize(4); SetTuneTicks(-1); SetAmbient(); - PlotId = "frame"; clr(MGL_DISABLE_SCALE); + clr(MGL_DISABLE_SCALE); clr(MGL_USE_GMTIME); clr(MGL_NOSUBTICKS); SetDifLight(false); SetReduceAcc(false); SetDefScheme("BbcyrR"); SetPalette(MGL_DEF_PAL); @@ -110,7 +193,7 @@ GifFileType *gif;*/ AdjustTicks("xyzc",true); Clf(); for(int i=0;i<10;i++) { AddLight(i, mglPoint(0,0,1)); Light(i,false); } - Light(0,true); Light(false); SetDifLight(true); + Light(0,true); Light(false); SetDifLight(true); } //----------------------------------------------------------------------------- // Optimal axis position @@ -218,15 +301,20 @@ mreal mglCanvas::GetOrgZ(char dir) const //----------------------------------------------------------------------------- // Put primitives //----------------------------------------------------------------------------- -#define MGL_MARK_PLOT if(Quality&4) mark_draw(p,type,size?size:MarkSize,&d);else \ - { mglPrim a; a.w = fabs(PenWidth); a.s = size?size:MarkSize; \ +#define MGL_MARK_PLOT if(Quality&4) mark_draw(p,type,size,&d);else \ + { mglPrim a; a.w = pw; a.s = size; \ a.n1 = p; a.n4 = type; add_prim(a); } void mglCanvas::mark_plot(long p, char type, mreal size) { if(p<0 || mgl_isnan(Pnt[p].x)) return; long pp=p; + mreal pw = fabs(PenWidth)*0.15/sqrt(font_factor); mglDrawReg d; d.set(this,1,1,0); + d.PDef = PDef; d.pPos = pPos; + d.ObjId = ObjId; d.PenWidth=pw; if(size>=0) size *= MarkSize; + if(size==0) size = MarkSize; + size *= 0.35*font_factor; if(TernAxis&4) for(int i=0;i<4;i++) { p = ProjScale(i, pp); MGL_MARK_PLOT } else { MGL_MARK_PLOT } @@ -239,10 +327,14 @@ void mglCanvas::line_plot(long p1, long p2) { if(PDef==0) return; if(p1<0 || p2<0 || mgl_isnan(Pnt[p1].x) || mgl_isnan(Pnt[p2].x)) return; - mglDrawReg dd; dd.set(this,1,1,0); long pp1=p1,pp2=p2; - mreal pw = fabs(PenWidth),d; + mreal pw = fabs(PenWidth)*sqrt(font_factor/400), d; d = hypot(Pnt[p1].x-Pnt[p2].x, Pnt[p1].y-Pnt[p2].y); + + mglDrawReg dd; dd.set(this,1,1,0); + dd.PDef = PDef; dd.pPos = pPos; + dd.ObjId = ObjId; dd.PenWidth=pw; + if(TernAxis&4) for(int i=0;i<4;i++) { p1 = ProjScale(i, pp1); p2 = ProjScale(i, pp2); MGL_LINE_PLOT } @@ -257,7 +349,7 @@ void mglCanvas::trig_plot(long p1, long p2, long p3) { if(p1<0 || p2<0 || p3<0 || mgl_isnan(Pnt[p1].x) || mgl_isnan(Pnt[p2].x) || mgl_isnan(Pnt[p3].x)) return; long pp1=p1,pp2=p2,pp3=p3; - mglDrawReg d; d.set(this,1,1,0); + mglDrawReg d; d.set(this,1,1,0); d.ObjId = ObjId; if(TernAxis&4) for(int i=0;i<4;i++) { p1 = ProjScale(i, pp1); p2 = ProjScale(i, pp2); p3 = ProjScale(i, pp3); MGL_TRIG_PLOT } @@ -274,7 +366,7 @@ void mglCanvas::quad_plot(long p1, long p2, long p3, long p4) if(p3<0 || mgl_isnan(Pnt[p3].x)) { trig_plot(p1,p2,p4); return; } if(p4<0 || mgl_isnan(Pnt[p4].x)) { trig_plot(p1,p2,p3); return; } long pp1=p1,pp2=p2,pp3=p3,pp4=p4; - mglDrawReg d; d.set(this,1,1,0); + mglDrawReg d; d.set(this,1,1,0); d.ObjId = ObjId; if(TernAxis&4) for(int i=0;i<4;i++) { p1 = ProjScale(i, pp1); p2 = ProjScale(i, pp2); p3 = ProjScale(i, pp3); p4 = ProjScale(i, pp4); @@ -293,7 +385,7 @@ mreal mglCanvas::text_plot(long p,const wchar_t *text,const char *font,mreal siz mreal res; TernAxis = TernAxis&(~4); for(int i=0;i<4;i++) - res = text_plot(ProjScale(i,p),text,font,size/2,sh,col); + res = text_plot(ProjScale(i,p,true),text,font,size/2,sh,col); TernAxis = TernAxis|4; return res; } @@ -303,32 +395,44 @@ mreal mglCanvas::text_plot(long p,const wchar_t *text,const char *font,mreal siz bool inv=false; if(rot && (q.u<0 || (q.u==0 && q.v<0))) { q.u=-q.u; q.v=-q.v; q.w=-q.w; inv=true; } - if(!(Quality&4)) // add text itself - { - mglPrim a(6); a.n1 = p; - mglText txt(text,font); - MGL_PUSH(Ptx,txt,mutexPtx); - a.n3 = Ptx.size()-1; - a.s = size; a.w = sh; a.p=col; - add_prim(a); - } - if(ll==0) return 0; - mreal fsize=size/6.5*font_factor, h = fnt->Height(font)*fsize, w, shift = -sh*h-2; + mreal fsize=size/6.5*font_factor, h = fnt->Height(font)*fsize, w, shift = -(sh+0.02)*h; // text drawing itself Push(); +#if MGL_HAVE_PTHREAD +pthread_mutex_lock(&mutexPtx); +#endif inv = inv ^ (strchr(font,'T')!=0); - if(inv) shift = 0.17*h-shift; - shift += 1.1; // Correction for glyph rotation around proper point + if(inv) shift = 0.2*h-shift; + shift += 0.015*h; // Correction for glyph rotation around proper point // shift *= h; int align; mglGetStyle(font,0,&align); align = align&3; B.x = q.x; B.y = q.y - shift; B.z = q.z; - if(ll>0) { B.x += shift*q.v/sqrt(ll); B.y += shift*(1-q.u/sqrt(ll)); } - fscl = fsize; + if(ll>0) + { + B.x += shift*q.v/sqrt(ll); B.y += shift*(1-q.u/sqrt(ll)); + if(q.u==0 && !get(MGL_ENABLE_RTEXT)) B.y -= 0.1*h; + } + fscl = fsize; forg = p; if(mgl_isnan(ll) || !get(MGL_ENABLE_RTEXT)) ftet = 0; - else ftet = -180*atan2(q.v,q.u)/M_PI; + else if(ll) ftet = -180*atan2(q.v,q.u)/M_PI; + else ftet = NAN; + + if(!(Quality&4)) // add text itself + { + char ch = mglGetStyle(font,0,0); + mglColor mc(ch); + if(!ch) mc = col<0 ? mglColor(char(0.5-col)):Txt[long(col)].GetC(col); + + mglPrim a(6); a.n1 = p; + a.n2 = int(255*mc.r) + 256*(int(255*mc.g) + 256*int(255*mc.b)); + mglText txt(text,font); + Ptx.push_back(txt); a.n3 = Ptx.size()-1; + a.s = size; a.w = shift; a.p=ftet; + add_prim(a); + } memset(B.b,0,9*sizeof(mreal)); B.b[0] = B.b[4] = B.b[8] = fscl; @@ -351,19 +455,26 @@ mreal mglCanvas::text_plot(long p,const wchar_t *text,const char *font,mreal siz line_plot(k1,k2); line_plot(k1,k3); line_plot(k4,k2); line_plot(k4,k3); } fsize *= fnt->Puts(text,font,col)/2; +#if MGL_HAVE_PTHREAD +pthread_mutex_unlock(&mutexPtx); +#endif Pop(); return fsize; } //----------------------------------------------------------------------------- void mglCanvas::Glyph(mreal x, mreal y, mreal f, int s, long j, mreal col) { mglPrim a(4); // NOTE: no projection since text_plot() did it - a.s = fscl/B.pf; a.w = ftet; a.p = B.pf; + a.s = fscl/B.pf; a.w = ftet; a.p = f/fnt->GetFact(s&3); mreal cc = col<0 ? AddTexture(char(0.5-col)):col; if(cc<0) cc = CDef; - a.n1 = AddPnt(mglPoint(B.x,B.y,B.z), cc, mglPoint(x,y,f/fnt->GetFact(s&3)), -1, -1); - a.n3 = s; a.n4 = j; + a.n1 = AddPnt(mglPoint(B.x,B.y,B.z), cc, mglPoint(x,y,NAN), -1, -1); + a.n2 = forg; a.n3 = s; a.n4 = AddGlyph(s,j); if(a.n1<0) return; + mglDrawReg d; d.set(this,1,1,0); + d.PDef = s; d.pPos = a.s; + d.ObjId=ObjId; d.PenWidth=a.w; + if(Quality&4) glyph_draw(&a,&d); else add_prim(a); } @@ -374,7 +485,8 @@ void mglCanvas::InPlot(mreal x1,mreal x2,mreal y1,mreal y2, const char *st) { if(Width<=0 || Height<=0 || Depth<=0) return; if(!st) { InPlot(x1,x2,y1,y2,false); return; } - inW = Width*(x2-x1); inH = Height*(y2-y1); ZMin=1; + inW = Width*(x2-x1); inH = Height*(y2-y1); + inX=Width*x1; inY=Height*y1; ZMin=1; mglPrim p; p.id = ObjId; p.n1=x1*Width; p.n2=x2*Width; p.n3=y1*Height; p.n4=y2*Height; MGL_PUSH(Sub,p,mutexSub); @@ -386,6 +498,7 @@ void mglCanvas::InPlot(mreal x1,mreal x2,mreal y1,mreal y2, const char *st) bool a = !(strchr(st,'a') || strchr(st,'A') || strchr(st,'^') || strchr(st,'g') || strchr(st,'t')); // let use simplified scheme -- i.e. no differences between axis, colorbar and/or title register mreal xs=(x1+x2)/2, ys=(y1+y2)/2, f1 = 1.3, f2 = 1.1; + if(strchr(st,'#')) f1=f2=1.55; if(r && l) { x2=xs+(x2-xs)*f1; x1=xs+(x1-xs)*f1; } else if(r) { x2=xs+(x2-xs)*f1; x1=xs+(x1-xs)*f2; } else if(l) { x2=xs+(x2-xs)*f2; x1=xs+(x1-xs)*f1; } @@ -425,7 +538,8 @@ void mglCanvas::InPlot(mreal x1,mreal x2,mreal y1,mreal y2, bool rel) B.z = (1.f-B.b[8]/(2*Depth))*Depth; B1=B; } - inW = B.b[0]; inH=B.b[4]; ZMin=1; + inW=B.b[0]; inH=B.b[4]; ZMin=1; + inX=Width*x1; inY=Height*y1; font_factor = B.b[0] < B.b[4] ? B.b[0] : B.b[4]; mglPrim p; p.id = ObjId; p.n1=x1*Width; p.n2=x2*Width; p.n3=y1*Height; p.n4=y2*Height; @@ -533,7 +647,7 @@ void mglCanvas::Zoom(mreal x1, mreal y1, mreal x2, mreal y2) if(x1==x2 || y1==y2) { x1=y1=0; x2=y2=1; } x1=2*x1-1; x2=2*x2-1; y1=2*y1-1; y2=2*y2-1; Bp.b[0]=2/fabs(x2-x1); Bp.b[4]=2/fabs(y2-y1); - Bp.x=(x1+x2)/2/Bp.b[0]; Bp.y=(y1+y2)/2/Bp.b[4]; + Bp.x=(x1+x2)/fabs(x2-x1);Bp.y=(y1+y2)/fabs(y2-y1); } //----------------------------------------------------------------------------- int mglCanvas::GetSplId(long x,long y) const @@ -577,93 +691,24 @@ void mglCanvas::AddLight(int n, mglPoint r, mglPoint d, char col, mreal br, mrea light[n].d = d; light[n].c = mglColor(col); } //----------------------------------------------------------------------------- -void mglCanvas::arrow_plot(long n1, long n2,char st) +void mglCanvas::arrow_plot(long n1, long n2, char st) { - if(n1<0 || n2<0 || !strchr("AVKSDTIO",st)) return; - const mglPnt &p1=Pnt[n1], &p2=Pnt[n2]; - mglPnt q1=p1,q2=p1,q3=p1,q4=p1; - q1.u=q1.v=q2.u=q2.v=q3.u=q3.v=q4.u=q4.v=NAN; - - mreal lx=p1.x-p2.x, ly=p1.y-p2.y, ll, kx,ky; - ll = hypot(lx,ly)/(PenWidth*ArrowSize*0.35*font_factor); - if(ll==0) return; - lx /= ll; ly /= ll; kx = ly; ky = -lx; - mreal lz = (p2.z-p1.z)/ll; - - Reserve(6); - long k1,k2,k3,k4; - - switch(st) - { - case 'I': - q1.xx=q1.x=p1.x+kx; q1.yy=q1.y=p1.y+ky; k1=Pnt.size(); MGL_PUSH(Pnt,q1,mutexPnt); - q2.xx=q2.x=p1.x-kx; q2.yy=q2.y=p1.y-ky; k2=Pnt.size(); MGL_PUSH(Pnt,q2,mutexPnt); - line_plot(k1,k2); break; - case 'D': - q1.xx=q1.x=p1.x+kx; q1.yy=q1.y=p1.y+ky; k1=Pnt.size(); MGL_PUSH(Pnt,q1,mutexPnt); - q2.xx=q2.x=p1.x+lx; q2.yy=q2.y=p1.y+ly; q2.zz=q2.z=p1.z+lz; k2=Pnt.size(); MGL_PUSH(Pnt,q2,mutexPnt); - q3.xx=q3.x=p1.x-kx; q3.yy=q3.y=p1.y-ky; k3=Pnt.size(); MGL_PUSH(Pnt,q3,mutexPnt); - q4.xx=q4.x=p1.x-lx; q4.yy=q4.y=p1.y-ly; q4.zz=q4.z=p1.z-lz; k4=Pnt.size(); MGL_PUSH(Pnt,q4,mutexPnt); - quad_plot(k1,k2,k4,k3); break; - case 'S': - q1.xx=q1.x=p1.x+kx-lx; q1.yy=q1.y=p1.y+ky-ly; q1.zz=q1.z=p1.z-lz; k1=Pnt.size(); MGL_PUSH(Pnt,q1,mutexPnt); - q2.xx=q2.x=p1.x-kx-lx; q2.yy=q2.y=p1.y-ky-ly; q2.zz=q2.z=p1.z-lz; k2=Pnt.size(); MGL_PUSH(Pnt,q2,mutexPnt); - q3.xx=q3.x=p1.x-kx+lx; q3.yy=q3.y=p1.y-ky+ly; q3.zz=q3.z=p1.z+lz; k3=Pnt.size(); MGL_PUSH(Pnt,q3,mutexPnt); - q4.xx=q4.x=p1.x+kx+lx; q4.yy=q4.y=p1.y+ky+ly; q4.zz=q4.z=p1.z+lz; k4=Pnt.size(); MGL_PUSH(Pnt,q4,mutexPnt); - quad_plot(k1,k2,k4,k3); break; - case 'T': - q1.xx=q1.x=p1.x+kx-lx; q1.yy=q1.y=p1.y+ky-ly; q1.zz=q1.z=p1.z-lz; k1=Pnt.size(); MGL_PUSH(Pnt,q1,mutexPnt); - q2.xx=q2.x=p1.x-kx-lx; q2.yy=q2.y=p1.y-ky-ly; q2.zz=q2.z=p1.z-lz; k2=Pnt.size(); MGL_PUSH(Pnt,q2,mutexPnt); - q3.xx=q3.x=p1.x+lx; q3.yy=q3.y=p1.y+ly; q3.zz=q3.z=p1.z+lz; k3=Pnt.size(); MGL_PUSH(Pnt,q3,mutexPnt); - trig_plot(k1,k2,k3); break; - case 'A': -// q1.xx=q1.x=p1.x; q1.yy=q1.y=p1.y; k1=Pnt.size(); MGL_PUSH(Pnt,q1,mutexPnt); - q2.xx=q2.x=p1.x-kx-2*lx; q2.yy=q2.y=p1.y-ky-2*ly; q2.zz=q2.z=p1.z-2*lz; k2=Pnt.size(); MGL_PUSH(Pnt,q2,mutexPnt); - q3.xx=q3.x=p1.x-1.5*lx; q3.yy=q3.y=p1.y-1.5*ly; q3.zz=q3.z=p1.z-1.5*lz; k3=Pnt.size(); MGL_PUSH(Pnt,q3,mutexPnt); - q4.xx=q4.x=p1.x+kx-2*lx; q4.yy=q4.y=p1.y+ky-2*ly; q4.zz=q4.z=p1.z-2*lz; k4=Pnt.size(); MGL_PUSH(Pnt,q4,mutexPnt); - trig_plot(n1,k2,k3); trig_plot(n1,k3,k4); break; - case 'K': -// q1.xx=q1.x=p1.x; q1.yy=q1.y=p1.y; k1=Pnt.size(); MGL_PUSH(Pnt,q1,mutexPnt); - q2.xx=q2.x=p1.x-kx-2*lx; q2.yy=q2.y=p1.y-ky-2*ly; q2.zz=q2.z=p1.z-2*lz; k2=Pnt.size(); MGL_PUSH(Pnt,q2,mutexPnt); - q3.xx=q3.x=p1.x-1.5*lx; q3.yy=q3.y=p1.y-1.5*ly; q3.zz=q3.z=p1.z-1.5*lz; k3=Pnt.size(); MGL_PUSH(Pnt,q3,mutexPnt); - q4.xx=q4.x=p1.x+kx-2*lx; q4.yy=q4.y=p1.y+ky-2*ly; q4.zz=q4.z=p1.z-2*lz; k4=Pnt.size(); MGL_PUSH(Pnt,q4,mutexPnt); - trig_plot(n1,k2,k3); trig_plot(n1,k3,k4); - q1.xx=q1.x=p1.x+kx; q1.yy=q1.y=p1.y+ky; k1=Pnt.size(); MGL_PUSH(Pnt,q1,mutexPnt); - q2.xx=q2.x=p1.x-kx; q2.yy=q2.y=p1.y-ky; k2=Pnt.size(); MGL_PUSH(Pnt,q2,mutexPnt); - line_plot(k1,k2); break; - case 'V': -// q1.xx=q1.x=p1.x; q1.yy=q1.y=p1.y; k1=Pnt.size(); MGL_PUSH(Pnt,q1,mutexPnt); - q2.xx=q2.x=p1.x-kx+2*lx; q2.yy=q2.y=p1.y-ky+2*ly; q2.zz=q2.z=p1.z-2*lz; k2=Pnt.size(); MGL_PUSH(Pnt,q2,mutexPnt); - q3.xx=q3.x=p1.x+1.5*lx; q3.yy=q3.y=p1.y+1.5*ly; q3.zz=q3.z=p1.z-1.5*lz; k3=Pnt.size(); MGL_PUSH(Pnt,q3,mutexPnt); - q4.xx=q4.x=p1.x+kx+2*lx; q4.yy=q4.y=p1.y+ky+2*ly; q4.zz=q4.z=p1.z-2*lz; k4=Pnt.size(); MGL_PUSH(Pnt,q4,mutexPnt); - trig_plot(n1,k2,k3); trig_plot(n1,k3,k4); break; - case 'O': - { - q1.xx=q1.x=p1.x; q1.yy=q1.y=p1.y; k1=Pnt.size(); MGL_PUSH(Pnt,q1,mutexPnt); - double t,c,s; - for(int i=0;i<16;i++) - { - t = M_PI*i/8.; s=sin(t); c=cos(t); - q2.xx=q2.x=p1.x+kx*s+lx*c; q2.yy=q2.y=p1.y+ky*s+ly*c; q2.zz=q2.z=p1.z+c*lz; - k2=Pnt.size(); MGL_PUSH(Pnt,q2,mutexPnt); - t = M_PI*(i+1)/8.; s=sin(t); c=cos(t); - q3.xx=q3.x=p1.x+kx*s+lx*c; q3.yy=q3.y=p1.y+ky*s+ly*c; q3.zz=q2.z=p1.z+c*lz; - k3=Pnt.size(); MGL_PUSH(Pnt,q3,mutexPnt); - trig_plot(k1,k2,k3); - } - break; - } - } + float ll = PenWidth*ArrowSize*0.35*font_factor; + if((Quality&3)==3) + arrow_plot_3d(n1, n2, st, ll); + else + arrow_draw(n1, n2, st, ll); } //----------------------------------------------------------------------------- -void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const char *font, mreal size, mreal ll) +void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const char *font, const char *opt) { long n=leg.size(), iw, ih; if(n<1) { SetWarn(mglWarnLeg,"Legend"); return; } + mreal ll = SaveState(opt); if(mgl_isnan(ll)) ll=0.1; static int cgid=1; StartGroup("Legend",cgid++); if(ll<=0 || mgl_isnan(ll)) ll=0.1; ll *=font_factor; - if(size<0) size = -size*FontSize; + mreal size = 0.8*FontSize; // setup font and parse absolute coordinates if(!font) font="#"; char *pA, *ff = new char[strlen(font)+3]; @@ -672,21 +717,29 @@ void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const { *pA = ' '; InPlot(0,1,0,1,false); iw=B1.b[0]; ih=B1.b[4]; } else { iw=B1.b[0]/B1.pf; ih=B1.b[4]/B1.pf; } // find sizes - mreal h=TextHeight(font,size)/2; - mreal dx = 0.03*iw, dy = 0.03*ih, w=0, t; + mreal h=TextHeight(font,size); + mreal dx = 0.03*iw, dy = 0.03*ih, w=0, t, sp=TextWidth(" ",font,size); register long i,j; for(i=0;it ? w:t; } w += ll+0.01*iw; // add space for lines - x = x*(iw-w-2*dx)+B.x-iw/2+dx; // TODO bypass very long legends - y = y*(ih-h*n-2*dy)+B.y-ih/2+dy; + j = long((ih*0.95)/h); + long ncol = 1+(n-1)/j, nrow = (n+ncol-1)/ncol; + if(strchr(font,'-')) // horizontal legend + { + j = long((iw*0.95)/w); + nrow = 1+(n-1)/j; + ncol = (n+nrow-1)/nrow; + } + x = x*(iw-w*ncol-2*dx)+B.x-iw/2+dx; // TODO bypass very long legends + y = y*(ih-h*nrow-2*dy)+B.y-ih/2+dy; // draw it long k1=0,k2=0,k3=0,k4=0; - mglPoint p,q=mglPoint(NAN); + mglPoint p,q=mglPoint(NAN,NAN); for(i=0;ff[i] && ff[i]!=':';i++) if(strchr(MGL_COLORS,ff[i])) { @@ -698,14 +751,15 @@ void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const if(k4==2) k2=0; if(k4==1) k1=k2=0; mreal c1=AddTexture(char(k1?k1:'w')), c2=AddTexture(char(k2?k2:'k')); - if((Flag&3)==2) { mreal cc=c1; c2=c1; c2=cc; }; + if((Flag&3)==2) { mreal cc=c1; c2=c1; c2=cc; } if(strchr(ff,'#')) // draw bounding box { - k1=AddPnt(mglPoint(x,y,Depth),c1,q,-1,0); - k2=AddPnt(mglPoint(x+w,y,Depth),c1,q,-1,0); - k3=AddPnt(mglPoint(x,y+h*n,Depth),c1,q,-1,0); - k4=AddPnt(mglPoint(x+w,y+h*n,Depth),c1,q,-1,0); + SetPenPal("k-"); + k1=AddPnt(mglPoint(x,y,Depth/MGL_FEPSILON),c1,q,-1,0); + k2=AddPnt(mglPoint(x+w*ncol,y,Depth/MGL_FEPSILON),c1,q,-1,0); + k3=AddPnt(mglPoint(x,y+h*nrow,Depth/MGL_FEPSILON),c1,q,-1,0); + k4=AddPnt(mglPoint(x+w*ncol,y+h*nrow,Depth/MGL_FEPSILON),c1,q,-1,0); quad_plot(k1,k2,k3,k4); k1=CopyNtoC(k1,c2); k2=CopyNtoC(k2,c2); k3=CopyNtoC(k3,c2); k4=CopyNtoC(k4,c2); @@ -714,52 +768,139 @@ void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const } for(i=0;i=1) { SetWarn(mglWarnSpc,"Table"); return; } + long i,j,m=val->GetNy(),n=val->GetNx(); +// mreal pos=SaveState(opt); + mreal vw = SaveState(opt); + static int cgid=1; StartGroup("Table",cgid++); + bool grid = mglchr(frm,'#'), eqd = mglchr(frm,'='), lim = mglchr(frm,'|'); + if(mgl_isnan(vw)) vw=1; else lim = true; + if(!text) text=L""; + if(x<0) x=0; if(y<0) y=0; if(y>1) y=1; +// if(vw>1-x) vw=1-x; + + wchar_t *buf = new wchar_t[m*32], sng[32]; + std::vector str; + for(i=0;iv(i,j)); + wcscat(buf,sng); + } + mglprintf(sng,32,L"%.3g",val->v(i,m-1)); + wcscat(buf,sng); str.push_back(buf); + } + delete []buf; + + mreal sp=2*TextWidth(" ",frm,-1), w=*text ? sp+TextWidth(text,frm,-1):0, w1=0, ww, h; + for(i=0;ivw*inW) + { h=vw*inW/w; SetFontSize(-h); w*=h; w1*=h; sp*=h; } + h = TextHeight(frm,-1); // now we can determine text height + + x = x*(inW-w)+B.x-inW/2; + y = y*(inH-h*m)+B.y-inH/2; + + mglPoint p,q=mglPoint(NAN,NAN); + long k1,k2; + mreal xx,yy; + if(grid) // draw bounding box + { + SetPenPal("k-"); + k1=AddPnt(mglPoint(x,y,Depth),-1,q,-1,0); + k2=AddPnt(mglPoint(x,y+m*h,Depth),-1,q,-1,0); + line_plot(k1,k2); + ww = *text ? TextWidth(text,frm,-1)+sp:0; + k1=AddPnt(mglPoint(x+ww,y,Depth),-1,q,-1,0); + k2=AddPnt(mglPoint(x+ww,y+m*h,Depth),-1,q,-1,0); + line_plot(k1,k2); + for(i=0,xx=x+ww,yy=y;i0 ? size/FontSize:-size, h=TextHeight(stl,size)*s/4; + mreal s = size>0 ? size/FontSize:-size, h=TextHeight(stl,size)*s/2; if(h>=inH) { SetWarn(mglWarnSpc,"Title"); return; } - bool box=(stl && strchr(stl,'#')); + bool box=mglchr(stl,'#'); int align; mglGetStyle(stl,0,&align); align = align&3; - mreal x=B1.x-inW/2, y=B1.y+inH/2-h; - mglPoint p(B1.x + inW/2.1*(align-1),y,Depth),q(NAN); + mreal y=inY+inH-h; + mglPoint p(inX + inW*align/2.,y,Depth),q(NAN); if(title) text_plot(AddPnt(p,-1,q,-1,0),title,stl,size); if(box) // draw boungind box { mreal c1=AddTexture('w'), c2=AddTexture('k'); - if((Flag&3)==2) { mreal cc=c1; c2=c1; c2=cc; }; + if((Flag&3)==2) { mreal cc=c1; c2=c1; c2=cc; } long k1,k2,k3,k4; - k1=AddPnt(mglPoint(x,y,Depth),c1,q,-1,0); - k2=AddPnt(mglPoint(x+inW,y,Depth),c1,q,-1,0); - k3=AddPnt(mglPoint(x,y+h,Depth),c1,q,-1,0); - k4=AddPnt(mglPoint(x+inW,y+h,Depth),c1,q,-1,0); + k1=AddPnt(mglPoint(inX,y,Depth),c1,q,-1,0); + k2=AddPnt(mglPoint(inX+inW,y,Depth),c1,q,-1,0); + k3=AddPnt(mglPoint(inX,y+h,Depth),c1,q,-1,0); + k4=AddPnt(mglPoint(inX+inW,y+h,Depth),c1,q,-1,0); quad_plot(k1,k2,k3,k4); k1=CopyNtoC(k1,c2); k2=CopyNtoC(k2,c2); k3=CopyNtoC(k3,c2); k4=CopyNtoC(k4,c2); @@ -773,7 +914,9 @@ void mglCanvas::Title(const wchar_t *title,const char *stl,mreal size) void mglCanvas::StartAutoGroup (const char *lbl) { static int id=1; - if(lbl==NULL) { id=1; return; } + if(lbl==NULL) { id=1; grp_counter=0; return; } + grp_counter++; + if(grp_counter>1) return; // do nothing in "subgroups" if(ObjId<0) { ObjId = -id; id++; } register size_t len = Grp.size(); if(ObjId>=0 && len>0 && ObjId!=Grp[len-1].Id) @@ -782,5 +925,26 @@ void mglCanvas::StartAutoGroup (const char *lbl) { MGL_PUSH(Grp,mglGroup(lbl,ObjId),mutexGrp); } } //----------------------------------------------------------------------------- -void mglCanvas::EndGroup() { LoadState(); } +void mglCanvas::EndGroup() +{ + LoadState(); + if(Quality&4) + { + Pnt.clear(); Prm.clear(); Ptx.clear(); + Glf.clear(); Act.clear(); Grp.clear(); + } + if(grp_counter>0) grp_counter--; +} +//----------------------------------------------------------------------------- +int mglCanvas::IsActive(int xs, int ys,int &n) +{ + long i, h = (Width>Height ? Height:Width)/100; + for(i=0;i<(long)Act.size();i++) + { + const mglActivePos &p=Act[i]; + if(abs(xs-p.x)<=h && abs(ys-p.y)<=h) + { n=p.n; return p.id; } + } + n=-1; return GetObjId(xs,ys); +} //----------------------------------------------------------------------------- diff --git a/src/canvas_cf.cpp b/src/canvas_cf.cpp index 73b547c..6cb5d6a 100644 --- a/src/canvas_cf.cpp +++ b/src/canvas_cf.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * canvas_cf.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -30,37 +30,54 @@ int mgl_get_width(HMGL gr) { return _Gr_->GetWidth(); } int mgl_get_height(HMGL gr) { return _Gr_->GetHeight(); } void mgl_calc_xyz(HMGL gr, int xs, int ys, mreal *x, mreal *y, mreal *z) { mglPoint p = _Gr_->CalcXYZ(xs,ys); *x = p.x; *y = p.y; *z = p.z; } -void mgl_calc_scr(HMGL gr, mreal x, mreal y, mreal z, int *xs, int *ys) +void mgl_calc_scr(HMGL gr, double x, double y, double z, int *xs, int *ys) { _Gr_->CalcScr(mglPoint(x,y,z),xs,ys); } void mgl_set_obj_id(HMGL gr, int id) { _Gr_->SetObjId(id); } -int mgl_get_obj_id(HMGL gr, long x, long y) { return _Gr_->GetObjId(x,y); } -int mgl_get_spl_id(HMGL gr, long x, long y) { return _Gr_->GetSplId(x,y); } +int mgl_get_obj_id(HMGL gr, int x, int y) { return _Gr_->GetObjId(x,y); } +int mgl_get_spl_id(HMGL gr, int x, int y) { return _Gr_->GetSplId(x,y); } +//----------------------------------------------------------------------------- +long mgl_is_active(HMGL gr, int xs, int ys, int d) +{ + if(d<=0) d=1; + for(size_t i=0;iAct.size();i++) + { + const mglActivePos &p = gr->Act[i]; + if(abs(xs-p.x)NewFrame(); } void mgl_end_frame(HMGL gr) { _Gr_->EndFrame(); } int mgl_get_num_frame(HMGL gr) { return _Gr_->GetNumFrame(); } void mgl_reset_frames(HMGL gr) { _Gr_->ResetFrames(); } +void mgl_get_frame(HMGL gr, int i) { _Gr_->GetFrame(i); } +void mgl_set_frame(HMGL gr, int i) { _Gr_->SetFrame(i); } +void mgl_show_frame(HMGL gr, int i) { _Gr_->ShowFrame(i); } +void mgl_del_frame(HMGL gr, int i) { _Gr_->DelFrame(i); } //----------------------------------------------------------------------------- void mgl_set_transp_type(HMGL gr, int type) { _Gr_->SetTranspType(type); } void mgl_set_alpha(HMGL gr, int enable) { _Gr_->Alpha(enable); } -void mgl_set_fog(HMGL gr, mreal d, mreal dz) { _Gr_->Fog(d,dz); } +void mgl_set_fog(HMGL gr, double d, double dz) { _Gr_->Fog(d,dz); } void mgl_set_light(HMGL gr, int enable) { _Gr_->Light(enable); } void mgl_set_light_n(HMGL gr, int n, int enable) { _Gr_->Light(n, enable); } -void mgl_add_light_ext(HMGL gr, int n, mreal x, mreal y, mreal z, char c, mreal br, mreal ap) +void mgl_add_light_ext(HMGL gr, int n, double x, double y, double z, char c, double br, double ap) { _Gr_->AddLight(n,mglPoint(x,y,z),c,br,ap); } -void mgl_add_light_loc(HMGL gr, int n, mreal x, mreal y, mreal z, mreal dx, mreal dy, mreal dz, char c, mreal br, mreal ap) +void mgl_add_light_loc(HMGL gr, int n, double x, double y, double z, double dx, double dy, double dz, char c, double br, double ap) { _Gr_->AddLight(n,mglPoint(x,y,z),mglPoint(dx,dy,dz),c,br,ap); } -void mgl_add_light(HMGL gr, int n, mreal x, mreal y, mreal z) +void mgl_add_light(HMGL gr, int n, double x, double y, double z) { _Gr_->AddLight(n,mglPoint(x,y,z)); } //----------------------------------------------------------------------------- void mgl_mat_push(HMGL gr) { _Gr_->Push(); } void mgl_mat_pop(HMGL gr) { _Gr_->Pop(); } void mgl_clf(HMGL gr) { _Gr_->Clf(); } -void mgl_clf_rgb(HMGL gr, mreal r, mreal g, mreal b){ _Gr_->Clf(mglColor(r,g,b)); } +void mgl_clf_rgb(HMGL gr, double r, double g, double b){ _Gr_->Clf(mglColor(r,g,b)); } //----------------------------------------------------------------------------- -void mgl_subplot_d(HMGL gr, int nx,int ny,int m,const char *style,mreal dx,mreal dy) +void mgl_subplot_d(HMGL gr, int nx,int ny,int m,const char *style,double dx,double dy) { - mreal x1,x2,y1,y2; + double x1,x2,y1,y2; int mx = m%nx, my = m/nx; if(_Gr_->get(MGL_AUTO_FACTOR)) { dx /= 1.55; dy /= 1.55; } else { dx /= 2; dy /= 2; } @@ -74,57 +91,61 @@ void mgl_subplot(HMGL gr, int nx,int ny,int m,const char *style) //----------------------------------------------------------------------------- void mgl_multiplot(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style) { - mreal x1,x2,y1,y2; + double x1,x2,y1,y2; int mx = m%nx, my = m/nx; dx = (dx<1 || dx+mx>nx) ? 1 : dx; dy = (dy<1 || dy+my>ny) ? 1 : dy; - x1 = mreal(mx)/nx; x2 = mreal(mx+dx)/nx; - y2 = 1-mreal(my)/ny; y1 = 1-mreal(my+dy)/ny; + x1 = double(mx)/nx; x2 = double(mx+dx)/nx; + y2 = 1-double(my)/ny; y1 = 1-double(my+dy)/ny; _Gr_->InPlot(x1,x2,y1,y2,style); } //----------------------------------------------------------------------------- -void mgl_inplot(HMGL gr, mreal x1,mreal x2,mreal y1,mreal y2) +void mgl_inplot(HMGL gr, double x1,double x2,double y1,double y2) { _Gr_->InPlot(x1,x2,y1,y2,false); } -void mgl_relplot(HMGL gr, mreal x1,mreal x2,mreal y1,mreal y2) +void mgl_relplot(HMGL gr, double x1,double x2,double y1,double y2) { _Gr_->InPlot(x1,x2,y1,y2,true); } //----------------------------------------------------------------------------- -void mgl_columnplot(HMGL gr, int num, int i, mreal dd) +void mgl_columnplot(HMGL gr, int num, int i, double dd) { - register mreal w = 1./num; + register double w = 1./num; _Gr_->InPlot(0,1,1-w*(i+1-dd),1-i*w,true); } //----------------------------------------------------------------------------- -void mgl_gridplot(HMGL gr, int nx, int ny, int i, mreal dd) +void mgl_gridplot(HMGL gr, int nx, int ny, int i, double dd) { register int ix=i%nx, iy=i/nx; - register mreal wx = 1./nx, wy = 1./ny; + register double wx = 1./nx, wy = 1./ny; _Gr_->InPlot(ix*wx,wx*(ix+1-dd),1-wy*(iy+1-dd),1-iy*wy,true); } //----------------------------------------------------------------------------- -void mgl_stickplot(HMGL gr, int num, int i, mreal tet, mreal phi) +void mgl_stickplot(HMGL gr, int num, int i, double tet, double phi) { _Gr_->StickPlot(num, i, tet, phi); } //----------------------------------------------------------------------------- -void mgl_aspect(HMGL gr, mreal Ax,mreal Ay,mreal Az) +void mgl_aspect(HMGL gr, double Ax,double Ay,double Az) { _Gr_->Aspect(Ax,Ay,Az); } -void mgl_rotate(HMGL gr, mreal TetX,mreal TetZ,mreal TetY) +void mgl_rotate(HMGL gr, double TetX,double TetZ,double TetY) { _Gr_->Rotate(TetX,TetZ,TetY); } -void mgl_view(HMGL gr, mreal TetX,mreal TetZ,mreal TetY) +void mgl_view(HMGL gr, double TetX,double TetZ,double TetY) { _Gr_->View(TetX,TetZ,TetY); } -void mgl_zoom(HMGL gr, mreal x1, mreal y1, mreal x2, mreal y2) +void mgl_zoom(HMGL gr, double x1, double y1, double x2, double y2) { _Gr_->Zoom(x1,y1,x2,y2); } -void mgl_rotate_vector(HMGL gr, mreal Tet,mreal x,mreal y,mreal z) +void mgl_rotate_vector(HMGL gr, double Tet,double x,double y,double z) { _Gr_->RotateN(Tet,x,y,z); } -void mgl_perspective(HMGL gr, mreal val) +void mgl_perspective(HMGL gr, double val) { _Gr_->Perspective(val); } -void mgl_title(HMGL gr, const char *title, const char *stl, mreal size) +void mgl_title(HMGL gr, const char *title, const char *stl, double size) { _Gr_->Title(title,stl,size); } -void mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, mreal size) +void mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, double size) { _Gr_->Title(title,stl,size); } //----------------------------------------------------------------------------- int mgl_new_frame_(uintptr_t *gr) { return _GR_->NewFrame(); } void mgl_end_frame_(uintptr_t *gr) { _GR_->EndFrame(); } int mgl_get_num_frame_(uintptr_t *gr) { return _GR_->GetNumFrame(); } void mgl_reset_frames_(uintptr_t *gr) { _GR_->ResetFrames(); } +void mgl_get_frame_(uintptr_t *gr, int *i) { _GR_->GetFrame(*i); } +void mgl_set_frame_(uintptr_t *gr, int *i) { _GR_->SetFrame(*i); } +void mgl_show_frame_(uintptr_t *gr, int *i) { _GR_->ShowFrame(*i); } +void mgl_del_frame_(uintptr_t *gr, int *i) { _GR_->DelFrame(*i); } //----------------------------------------------------------------------------- void mgl_set_transp_type_(uintptr_t *gr, int *type) { _GR_->SetTranspType(*type); } void mgl_set_alpha_(uintptr_t *gr, int *enable) { _GR_->Alpha(*enable); } @@ -146,7 +167,7 @@ void mgl_clf_(uintptr_t *gr) void mgl_clf_rgb_(uintptr_t *gr, mreal *r, mreal *g, mreal *b) { _GR_->Clf(mglColor(*r,*g,*b)); } //----------------------------------------------------------------------------- -void mgl_subplot_d_(uintptr_t *gr, int *nx,int *ny,int *m,const char *st,mreal *dx,mreal *dy,int l) +void mgl_subplot_d_(uintptr_t *gr, int *nx,int *ny,int *m,const char *st, mreal *dx, mreal *dy,int l) { char *s=new char[l+1]; memcpy(s,st,l); s[l]=0; mgl_subplot_d(_GR_,*nx,*ny,*m,s,*dx,*dy); delete []s; } void mgl_subplot_(uintptr_t *gr, int *nx,int *ny,int *m,const char *st,int l) @@ -155,9 +176,9 @@ void mgl_subplot_(uintptr_t *gr, int *nx,int *ny,int *m,const char *st,int l) void mgl_multiplot_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy,const char *st,int l) { char *s=new char[l+1]; memcpy(s,st,l); s[l]=0; mgl_multiplot(_GR_,*nx,*ny,*m,*dx,*dy,s); delete []s; } -void mgl_inplot_(uintptr_t *gr, mreal *x1,mreal *x2,mreal *y1,mreal *y2) +void mgl_inplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2) { _GR_->InPlot(*x1,*x2,*y1,*y2,false); } -void mgl_relplot_(uintptr_t *gr, mreal *x1,mreal *x2,mreal *y1,mreal *y2) +void mgl_relplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2) { _GR_->InPlot(*x1,*x2,*y1,*y2,true); } void mgl_columnplot_(uintptr_t *gr, int *num, int *i, mreal *d) { mgl_columnplot(_GR_,*num,*i,*d); } @@ -170,17 +191,17 @@ void mgl_title_(uintptr_t *gr, const char *title, const char *stl, mreal *size, { char *t=new char[l+1]; memcpy(t,title,l); t[l]=0; char *s=new char[m+1]; memcpy(s,stl,m); s[m]=0; _GR_->Title(t,s,*size); delete []s; delete []t; } -void mgl_aspect_(uintptr_t *gr, mreal *Ax,mreal *Ay,mreal *Az) +void mgl_aspect_(uintptr_t *gr, mreal *Ax, mreal *Ay, mreal *Az) { _GR_->Aspect(*Ax,*Ay,*Az); } -void mgl_rotate_(uintptr_t *gr, mreal *TetX,mreal *TetZ,mreal *TetY) +void mgl_rotate_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY) { _GR_->Rotate(*TetX,*TetZ,*TetY); } -void mgl_view_(uintptr_t *gr, mreal *TetX,mreal *TetZ,mreal *TetY) +void mgl_view_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY) { _GR_->View(*TetX,*TetZ,*TetY); } void mgl_zoom_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *x2, mreal *y2) { _GR_->Zoom(*x1,*y1,*x2,*y2); } -void mgl_rotate_vector_(uintptr_t *gr, mreal *Tet,mreal *x,mreal *y,mreal *z) +void mgl_rotate_vector_(uintptr_t *gr, mreal *Tet, mreal *x, mreal *y, mreal *z) { _GR_->RotateN(*Tet,*x,*y,*z); } -void mgl_perspective_(uintptr_t *gr, mreal val) +void mgl_perspective_(uintptr_t *gr, double val) { _GR_->Perspective(val); } //----------------------------------------------------------------------------- const unsigned char *mgl_get_rgb_(uintptr_t *gr) { return gr ? _GR_->GetBits():0; } @@ -205,15 +226,15 @@ void mgl_combine_gr(HMGL gr, HMGL in) { const mglCanvas *gg = dynamic_cast(in); if(gg) _Gr_->Combine(gg); } //----------------------------------------------------------------------------- -void mgl_set_tick_len(HMGL gr, mreal len, mreal stt) +void mgl_set_tick_len(HMGL gr, double len, double stt) { _Gr_->SetTickLen(len,stt); } void mgl_set_axis_stl(HMGL gr, const char *stl, const char *tck, const char *sub) { _Gr_->SetAxisStl(stl,tck,sub); } -void mgl_tune_ticks(HMGL gr, int tune, mreal pos) +void mgl_tune_ticks(HMGL gr, int tune, double pos) { _Gr_->SetTuneTicks(tune,pos); } void mgl_adjust_ticks(HMGL gr, const char *dir) { _Gr_->AdjustTicks(dir,true); } -void mgl_set_ticks(HMGL gr, char dir, mreal d, int ns, mreal org) +void mgl_set_ticks(HMGL gr, char dir, double d, int ns, double org) { _Gr_->SetTicks(dir,d,ns,org); } void mgl_set_ticks_str(HMGL gr, char dir, const char *lbl, int add) { _Gr_->SetTicksVal(dir,lbl,add); } @@ -227,30 +248,28 @@ void mgl_set_tick_templ(HMGL gr, char dir, const char *templ) { _Gr_->SetTickTempl(dir,templ); } void mgl_set_tick_templw(HMGL gr, char dir, const wchar_t *templ) { _Gr_->SetTickTempl(dir,templ); } -void mgl_set_ticks_time(HMGL gr, char dir, mreal d, const char *t) +void mgl_set_ticks_time(HMGL gr, char dir, double d, const char *t) { _Gr_->SetTickTime(dir,d,t); } //----------------------------------------------------------------------------- void mgl_box(HMGL gr) { _Gr_->Box(); } void mgl_box_str(HMGL gr, const char *col, int ticks) { _Gr_->Box(col,ticks); } -void mgl_axis(HMGL gr, const char *dir, const char *stl) -{ _Gr_->Axis(dir,stl); } -void mgl_axis_grid(HMGL gr, const char *dir,const char *pen) -{ _Gr_->Grid(dir,pen); } -void mgl_label(HMGL gr, char dir, const char *text) -{ _Gr_->Label(dir,text); } -void mgl_label_ext(HMGL gr, char dir, const char *text, mreal pos, mreal shift) -{ _Gr_->Label(dir,text,pos,shift); } -void mgl_labelw_ext(HMGL gr, char dir, const wchar_t *text, mreal pos, mreal shift) -{ _Gr_->Labelw(dir,text,pos,shift); } +void mgl_axis(HMGL gr, const char *dir, const char *stl, const char *opt) +{ _Gr_->Axis(dir,stl,opt); } +void mgl_axis_grid(HMGL gr, const char *dir,const char *pen, const char *opt) +{ _Gr_->Grid(dir,pen,opt); } +void mgl_label(HMGL gr, char dir, const char *text, double pos, const char *opt) +{ _Gr_->Label(dir,text,pos,opt); } +void mgl_labelw(HMGL gr, char dir, const wchar_t *text, double pos, const char *opt) +{ _Gr_->Labelw(dir,text,pos,opt); } //----------------------------------------------------------------------------- void mgl_colorbar(HMGL gr, const char *sch) { _Gr_->Colorbar(sch); } -void mgl_colorbar_ext(HMGL gr, const char *sch, mreal x, mreal y, mreal w, mreal h) +void mgl_colorbar_ext(HMGL gr, const char *sch, double x, double y, double w, double h) { _Gr_->Colorbar(sch,x,y,w,h); } void mgl_colorbar_val(HMGL gr, HCDT dat, const char *sch) { _Gr_->Colorbar(dat,sch); } -void mgl_colorbar_val_ext(HMGL gr, HCDT dat, const char *sch,mreal x, mreal y, mreal w, mreal h) +void mgl_colorbar_val_ext(HMGL gr, HCDT dat, const char *sch,double x, double y, double w, double h) { _Gr_->Colorbar(dat,sch,x,y,w,h); } //----------------------------------------------------------------------------- void mgl_add_legend(HMGL gr, const char *text,const char *style) @@ -259,10 +278,10 @@ void mgl_add_legendw(HMGL gr, const wchar_t *text,const char *style) { _Gr_->AddLegend(text,style); } void mgl_clear_legend(HMGL gr) { _Gr_->ClearLegend(); } -void mgl_legend_pos(HMGL gr, mreal x, mreal y, const char *font, mreal size, mreal llen) -{ _Gr_->Legend(x,y,font,size,llen); } -void mgl_legend(HMGL gr, int where, const char *font, mreal size, mreal llen) -{ _Gr_->Legend(where,font,size,llen); } +void mgl_legend_pos(HMGL gr, double x, double y, const char *font, const char *opt) +{ _Gr_->Legend(x,y,font,opt); } +void mgl_legend(HMGL gr, int where, const char *font, const char *opt) +{ _Gr_->Legend(where,font,opt); } void mgl_set_legend_marks(HMGL gr, int num) { _Gr_->SetLegendMarks(num); } //----------------------------------------------------------------------------- @@ -306,20 +325,20 @@ void mgl_box_(uintptr_t *gr) { _GR_->Box(); } void mgl_box_str_(uintptr_t *gr, const char *col, int *ticks, int l) { char *s=new char[l+1]; memcpy(s,col,l); s[l]=0; _GR_->Box(s,*ticks); delete []s; } -void mgl_axis_(uintptr_t *gr, const char *dir, const char *stl,int l,int n) +void mgl_axis_(uintptr_t *gr, const char *dir, const char *stl, const char *opt,int l,int n,int m) { char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; char *p=new char[n+1]; memcpy(p,stl,l); p[n]=0; - _GR_->Axis(s,p); delete []s; delete []p; } -void mgl_axis_grid_(uintptr_t *gr, const char *dir,const char *pen,int l,int n) + char *o=new char[m+1]; memcpy(o,opt,m); o[m]=0; + _GR_->Axis(s,p,o); delete []s; delete []p; delete []o; } +void mgl_axis_grid_(uintptr_t *gr, const char *dir,const char *pen, const char *opt,int l,int n,int m) { char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; char *p=new char[n+1]; memcpy(p,pen,n); p[n]=0; - _GR_->Grid(s,p); delete []s; delete []p; } -void mgl_label_(uintptr_t *gr, const char *dir, const char *text,int,int l) + char *o=new char[m+1]; memcpy(o,opt,m); o[m]=0; + _GR_->Grid(s,p,o); delete []s; delete []p; delete []o; } + void mgl_label_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, const char *opt,int,int l,int m) { char *s=new char[l+1]; memcpy(s,text,l); s[l]=0; - _GR_->Label(*dir, s); delete []s; } -void mgl_label_ext_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, mreal *shift,int,int l) -{ char *s=new char[l+1]; memcpy(s,text,l); s[l]=0; - _GR_->Label(*dir, s, *pos, *shift); delete []s; } + char *o=new char[m+1]; memcpy(o,opt,m); o[m]=0; + _GR_->Label(*dir, s, *pos, o); delete []s; delete []o; } //----------------------------------------------------------------------------- void mgl_colorbar_(uintptr_t *gr, const char *sch,int l) { char *s=new char[l+1]; memcpy(s,sch,l); s[l]=0; @@ -339,12 +358,14 @@ void mgl_add_legend_(uintptr_t *gr, const char *text,const char *style,int l,int char *f=new char[n+1]; memcpy(f,style,n); f[n]=0; _GR_->AddLegend(s,f); delete []s; delete []f; } void mgl_clear_legend_(uintptr_t *gr) { if(gr) _GR_->ClearLegend(); } -void mgl_legend_pos_(uintptr_t *gr, mreal *x, mreal *y, const char *font, mreal *size, mreal *llen,int l) +void mgl_legend_pos_(uintptr_t *gr, mreal *x, mreal *y, const char *font, const char *opt,int l,int m) { char *s=new char[l+1]; memcpy(s,font,l); s[l]=0; - _GR_->Legend(*x, *y, s, *size,*llen); delete []s; } -void mgl_legend_(uintptr_t *gr, int *where, const char *font, mreal *size, mreal *llen,int l) + char *o=new char[m+1]; memcpy(o,opt,m); o[m]=0; + _GR_->Legend(*x, *y, s, o); delete []s; delete []o; } +void mgl_legend_(uintptr_t *gr, int *where, const char *font, const char *opt,int l,int m) { char *s=new char[l+1]; memcpy(s,font,l); s[l]=0; - _GR_->Legend(*where, s, *size,*llen); delete []s; } + char *o=new char[m+1]; memcpy(o,opt,m); o[m]=0; + _GR_->Legend(*where, s, o); delete []s; delete []o; } void mgl_set_legend_marks_(uintptr_t *gr, int *num) { _GR_->SetLegendMarks(*num); } //----------------------------------------------------------------------------- @@ -362,17 +383,17 @@ void mgl_mpi_send_(uintptr_t *gr, int *id) { mgl_mpi_send(_GR_, *id); } void mgl_mpi_recv_(uintptr_t *gr, int *id) { mgl_mpi_recv(_GR_, *id); } //----------------------------------------------------------------------------- void mgl_wnd_set_delay_(uintptr_t *gr, mreal *dt) { _GR_->SetDelay(*dt); } -void mgl_wnd_set_delay(HMGL gr, mreal dt) { _Gr_->SetDelay(dt); } +void mgl_wnd_set_delay(HMGL gr, double dt) { _Gr_->SetDelay(dt); } //----------------------------------------------------------------------------- HMEX mgl_create_expr(const char *expr) { return new mglFormula(expr); } void mgl_delete_expr(HMEX ex) { delete ex; } -mreal mgl_expr_eval(HMEX ex, mreal x, mreal y,mreal z) +double mgl_expr_eval(HMEX ex, double x, double y,double z) { return ex->Calc(x,y,z); } -mreal mgl_expr_eval_v(HMEX ex, mreal *var) +double mgl_expr_eval_v(HMEX ex, mreal *var) { return ex->Calc(var); } -mreal mgl_expr_diff(HMEX ex, char dir, mreal x, mreal y,mreal z) +double mgl_expr_diff(HMEX ex, char dir, double x, double y,double z) { return ex->CalcD(dir,x,y,z); } -mreal mgl_expr_diff_v(HMEX ex, char dir, mreal *var) +double mgl_expr_diff_v(HMEX ex, char dir, mreal *var) { return ex->CalcD(var, dir); } //----------------------------------------------------------------------------- uintptr_t mgl_create_expr_(const char *expr, int l) @@ -380,23 +401,28 @@ uintptr_t mgl_create_expr_(const char *expr, int l) uintptr_t res = uintptr_t(mgl_create_expr(s)); delete []s; return res; } void mgl_delete_expr_(uintptr_t *ex) { mgl_delete_expr((HMEX)ex); } -mreal mgl_eval_expr_(uintptr_t *ex, mreal *x, mreal *y,mreal *z) +double mgl_eval_expr_(uintptr_t *ex, mreal *x, mreal *y, mreal *z) { return mgl_expr_eval((HMEX) ex, *x,*y,*z); } -mreal mgl_diff_expr_(uintptr_t *ex, const char *dir, mreal *x, mreal *y,mreal *z, int) +double mgl_diff_expr_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int) { return mgl_expr_diff((HMEX) ex, *dir,*x,*y,*z); } //----------------------------------------------------------------------------- -void mgl_set_plotfactor(HMGL gr, mreal val) +void mgl_set_plotfactor(HMGL gr, double val) { _Gr_->SetPlotFactor(val); } void mgl_set_plotfactor_(uintptr_t *gr, mreal *val) { _GR_->SetPlotFactor(*val); } //----------------------------------------------------------------------------- -void mgl_set_tick_shift(HMGL gr, mreal sx, mreal sy, mreal sz, mreal sc) +void mgl_set_tick_shift(HMGL gr, double sx, double sy, double sz, double sc) { _Gr_->SetTickShift(mglPoint(sx,sy,sz,sc)); } void mgl_set_tick_shift_(uintptr_t *gr, mreal *sx, mreal *sy, mreal *sz, mreal *sc) { _GR_->SetTickShift(mglPoint(*sx,*sy,*sz,*sc)); } //----------------------------------------------------------------------------- #if !MGL_HAVE_PNG -void mgl_write_prc(HMGL gr, const char *fname,const char *descr, int make_pdf){} -void mgl_write_prc_(uintptr_t *graph, const char *fname,const char *descr, int *make_pdf,int lf,int ld){} +void mgl_write_prc(HMGL gr, const char *fname,const char *descr, int make_pdf) +{ mglGlobalMess += "PNG support was disabled. Please, enable it and rebuild MathGL.\n"; } +void mgl_write_prc_(uintptr_t *graph, const char *fname,const char *descr, int *make_pdf,int lf,int ld) +{ mglGlobalMess += "PNG support was disabled. Please, enable it and rebuild MathGL.\n"; } #endif //----------------------------------------------------------------------------- +void mgl_finish(HMGL gr) { _Gr_->Finish(); } +void mgl_finish_(uintptr_t *gr) { _GR_->Finish(); } +//----------------------------------------------------------------------------- diff --git a/src/complex.cpp b/src/complex.cpp new file mode 100644 index 0000000..9f4cee4 --- /dev/null +++ b/src/complex.cpp @@ -0,0 +1,862 @@ +/*************************************************************************** + * data.cpp is part of Math Graphic Library + * Copyright (C) 2007-2012 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "mgl2/datac.h" +#include "mgl2/evalc.h" + +#if MGL_HAVE_GSL +#include +#include +#include +#endif +//----------------------------------------------------------------------------- +void mglStartThreadC(void *(*func)(void *), void (*post)(mglThreadC *,dual *), long n, + dual *a, const dual *b, const dual *c, const long *p, + const void *v, const dual *d, const dual *e, const char *s) +{ + if(!func) return; +#if MGL_HAVE_PTHREAD + if(mglNumThr<1) mgl_set_num_thr(0); + if(mglNumThr>1) + { + pthread_t *tmp=new pthread_t[mglNumThr]; + mglThreadC *par=new mglThreadC[mglNumThr]; + register long i; + for(i=0;i1) + { + pthread_t *tmp=new pthread_t[mglNumThr]; + mglThreadV *par=new mglThreadV[mglNumThr]; + register long i; + for(i=0;ip[0]; + dual *b=t->a, y5,y3,x2y; + const dual *a=t->b; + for(i=t->id;in;i+=mglNumThr) + { + j = i%nx; + d3 = d5 = 0; + if(j==0) { d3 = 1; d5 = 2; } + if(j==1) { d5 = 1; } + if(j==nx-1) { d3 = -1; d5 = -2;} + if(j==nx-2) { d5 = -1;} + y3 = (a[i+d3-1] + a[i+d3] + a[i+d3+1]); + y5 = (a[i+d5-2] + a[i+d5-1] + a[i+d5] + a[i+d5+1] + a[i+d5+2]); + x2y= (a[i+d5+1] + mgl4*a[i+d5+2] + mgl4*a[i+d5-2] + a[i+d5-1]); + j = t->p[2]; + if(d3) b[i] = a[i]; + else if(j==SMOOTH_LINE_3 || d5) b[i] = y3/mgl3; + else if(j==SMOOTH_LINE_5) b[i] = y5/mreal(5); + else if(j==SMOOTH_QUAD_5) b[i] = (mreal(17)*y5-mreal(5)*x2y)/mreal(35); + } + return 0; +} +void *mgl_csmth_y(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + register long i,j,d3,d5, nx=t->p[0],ny=t->p[1]; + dual *b=t->a, y5,y3,x2y; + const dual *a=t->b; + for(i=t->id;in;i+=mglNumThr) + { + j = (i/nx)%ny; + d3 = d5 = 0; + if(j==0) { d3 = 1; d5 = 2; } + if(j==1) { d5 = 1; } + if(j==ny-1) { d3 = -1; d5 = -2;} + if(j==ny-2) { d5 = -1;} + y3 = (a[i+nx*(d3-1)] + a[i+nx*d3] + a[i+nx*(d3+1)]); + y5 = (a[i+nx*(d5-2)] + a[i+nx*(d5-1)] + a[i+nx*d5] + a[i+nx*(d5+1)] + a[i+nx*(d5+2)]); + x2y= (a[i+nx*(d5+1)] + mgl4*a[i+nx*(d5+2)] + mgl4*a[i+nx*(d5-2)] + a[i+nx*(d5-1)]); + j = t->p[2]; + if(d3) b[i] = a[i]; + else if(j==SMOOTH_LINE_3 || d5) b[i] = y3/mgl3; + else if(j==SMOOTH_LINE_5) b[i] = y5/mreal(5); + else if(j==SMOOTH_QUAD_5) b[i] = (mreal(17)*y5-mreal(5)*x2y)/mreal(35); + } + return 0; +} +void *mgl_csmth_z(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + register long i,j,d3,d5, nn=t->p[0]*t->p[1], nz=t->n/nn; + dual *b=t->a, y5,y3,x2y; + const dual *a=t->b; + for(i=t->id;in;i+=mglNumThr) + { + j = i/nn; + d3 = d5 = 0; + if(j==0) { d3 = 1; d5 = 2; } + if(j==1) { d5 = 1; } + if(j==nz-1) { d3 = -1; d5 = -2;} + if(j==nz-2) { d5 = -1;} + y3 = (a[i+nn*(d3-1)] + a[i+nn*d3] + a[i+nn*(d3+1)]); + y5 = (a[i+nn*(d5-2)] + a[i+nn*(d5-1)] + a[i+nn*d5] + a[i+nn*(d5+1)] + a[i+nn*(d5+2)]); + x2y= (a[i+nn*(d5+1)] + mgl4*a[i+nn*(d5+2)] + mgl4*a[i+nn*(d5-2)] + a[i+nn*(d5-1)]); + j = t->p[2]; + if(d3) b[i] = a[i]; + else if(j==SMOOTH_LINE_3 || d5) b[i] = y3/mgl3; + else if(j==SMOOTH_LINE_5) b[i] = y5/mreal(5); + else if(j==SMOOTH_QUAD_5) b[i] = (mreal(17)*y5-mreal(5)*x2y)/mreal(35); + } + return 0; +} +void mgl_datac_smooth(HADT d, const char *dirs, mreal ) +{ + long Type = SMOOTH_QUAD_5; + if(!dirs || *dirs==0) dirs = "xyz"; + if(strchr(dirs,'0') || strchr(dirs,'1')) return; + if(strchr(dirs,'3')) Type = SMOOTH_LINE_3; + if(strchr(dirs,'5')) Type = SMOOTH_LINE_5; + long nx=d->nx,ny=d->ny,nz=d->nz; +// if(Type == SMOOTH_NONE) return; + long p[3]={nx,ny,Type}; + dual *b = new dual[nx*ny*nz]; + // ����������� �� x + memset(b,0,nx*ny*nz*sizeof(dual)); + if(nx>4 && strchr(dirs,'x')) + { + mglStartThreadC(mgl_csmth_x,0,nx*ny*nz,b,d->a,0,p); + memcpy(d->a,b,nx*ny*nz*sizeof(dual)); + memset(b,0,nx*ny*nz*sizeof(dual)); + } + if(ny>4 && strchr(dirs,'y')) + { + mglStartThreadC(mgl_csmth_y,0,nx*ny*nz,b,d->a,0,p); + memcpy(d->a,b,nx*ny*nz*sizeof(dual)); + memset(b,0,nx*ny*nz*sizeof(dual)); + } + if(nz>4 && strchr(dirs,'z')) + { + mglStartThreadC(mgl_csmth_z,0,nx*ny*nz,b,d->a,0,p); + memcpy(d->a,b,nx*ny*nz*sizeof(dual)); + } + delete []b; +} +void mgl_datac_smooth_(uintptr_t *d, const char *dir, mreal *delta,int l) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + mgl_datac_smooth(_DC_,s,*delta); delete []s; } +//----------------------------------------------------------------------------- +void *mgl_ccsum_z(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + register long i,j, nz=t->p[2], nn=t->n; + dual *b=t->a; + const dual *a=t->b; + for(i=t->id;ip[0], ny=t->p[1], nn=t->n; + dual *b=t->a; + const dual *a=t->b; + for(i=t->id;ip[0], nn=t->n; + dual *b=t->a; + const dual *a=t->b; + for(i=t->id;inx,ny=d->ny,nz=d->nz,nn=nx*ny*nz; + long p[3]={nx,ny,nz}; + dual *b = new dual[nn]; + memcpy(b,d->a,nn*sizeof(dual)); + if(strchr(dir,'z') && nz>1) + { + mglStartThreadC(mgl_ccsum_z,0,nx*ny,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + if(strchr(dir,'y') && ny>1) + { + mglStartThreadC(mgl_ccsum_y,0,nx*nz,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + if(strchr(dir,'x') && nx>1) + { + mglStartThreadC(mgl_ccsum_x,0,nz*ny,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + delete []b; +} +void mgl_datac_cumsum_(uintptr_t *d, const char *dir,int l) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + mgl_datac_cumsum(_DC_,s); delete []s; } +//----------------------------------------------------------------------------- +void *mgl_cint_z(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + register long i,j, nz=t->p[2], nn=t->n; + dual *b=t->a, dd=0.5/nz; + const dual *a=t->b; + for(i=t->id;ip[0], ny=t->p[1], nn=t->n; + dual *b=t->a, dd=0.5/ny; + const dual *a=t->b; + for(i=t->id;ip[0], nn=t->n; + dual *b=t->a, dd=0.5/nx; + const dual *a=t->b; + for(i=t->id;inx,ny=d->ny,nz=d->nz,nn=nx*ny*nz; + long p[3]={nx,ny,nz}; + dual *b = new dual[nn]; + memcpy(b,d->a,nn*sizeof(dual)); + if(strchr(dir,'z') && nz>1) + { + mglStartThreadC(mgl_cint_z,0,nx*ny,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + if(strchr(dir,'y') && ny>1) + { + mglStartThreadC(mgl_cint_y,0,nx*nz,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + if(strchr(dir,'x') && nx>1) + { + mglStartThreadC(mgl_cint_x,0,nz*ny,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + delete []b; +} +void mgl_datac_integral_(uintptr_t *d, const char *dir,int l) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + mgl_datac_integral(_DC_,s); delete []s; } +//----------------------------------------------------------------------------- +void *mgl_cdif_z(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + register long i,j, nz=t->p[2], nn=t->n; + dual *b=t->a, dd=0.5*nz; + const dual *a=t->b; + for(i=t->id;ip[0], ny=t->p[1], nn=t->n; + dual *b=t->a, dd=0.5*ny; + const dual *a=t->b; + for(i=t->id;ip[0], nn=t->n; + dual *b=t->a, dd=0.5*nx; + const dual *a=t->b; + for(i=t->id;inx,ny=d->ny,nz=d->nz,nn=nx*ny*nz; + long p[3]={nx,ny,nz}; + dual *b = new dual[nn]; + if(strchr(dir,'z') && nz>1) + { + mglStartThreadC(mgl_cdif_z,0,nx*ny,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + if(strchr(dir,'y') && ny>1) + { + mglStartThreadC(mgl_cdif_y,0,nx*nz,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + if(strchr(dir,'x') && nx>1) + { + mglStartThreadC(mgl_cdif_x,0,nz*ny,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + delete []b; +} +void mgl_datac_diff_(uintptr_t *d, const char *dir,int l) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + mgl_datac_diff(_DC_,s); delete []s; } +//----------------------------------------------------------------------------- +void *mgl_cdif2_z(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + register long i,j, nz=t->p[2], nn=t->n; + dual *b=t->a, dd=0.5*nz*nz; + const dual *a=t->b; + for(i=t->id;ip[0], ny=t->p[1], nn=t->n; + dual *b=t->a, dd=0.5*ny*ny; + const dual *a=t->b; + for(i=t->id;ip[0], nn=t->n; + dual *b=t->a, dd=0.5*nx*nx; + const dual *a=t->b; + for(i=t->id;inx,ny=d->ny,nz=d->nz,nn=nx*ny*nz; + long p[3]={nx,ny,nz}; + dual *b = new dual[nn]; + if(strchr(dir,'z') && nz>1) + { + mglStartThreadC(mgl_cdif2_z,0,nx*ny,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + if(strchr(dir,'y') && ny>1) + { + mglStartThreadC(mgl_cdif2_y,0,nx*nz,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + if(strchr(dir,'x') && nx>1) + { + mglStartThreadC(mgl_cdif2_x,0,nz*ny,b,d->a,0,p); + memcpy(d->a,b,nn*sizeof(dual)); + } + delete []b; +} +void mgl_datac_diff2_(uintptr_t *d, const char *dir,int l) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + mgl_datac_diff2(_DC_,s); delete []s; } +//----------------------------------------------------------------------------- +void mgl_datac_swap(HADT d, const char *dir) +{ + if(!dir || *dir==0) return; + if(strchr(dir,'z') && d->nz>1) mgl_datac_roll(d,'z',d->nz/2); + if(strchr(dir,'y') && d->ny>1) mgl_datac_roll(d,'y',d->ny/2); + if(strchr(dir,'x') && d->nx>1) mgl_datac_roll(d,'x',d->nx/2); +} +void mgl_datac_swap_(uintptr_t *d, const char *dir,int l) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + mgl_datac_swap(_DC_,s); delete []s; } +//----------------------------------------------------------------------------- +void mgl_datac_roll(HADT dd, char dir, long num) +{ + long nx=dd->nx,ny=dd->ny,nz=dd->nz; + register long i,d; + dual *b,*a=dd->a; + if(dir=='z' && nz>1) + { + d = num>0 ? num%nz : (num+nz*(1+num/nz))%nz; + if(d==0) return; // nothing to do + b = new dual[nx*ny*nz]; + memcpy(b,a+nx*ny*d,nx*ny*(nz-d)*sizeof(dual)); + memcpy(b+nx*ny*(nz-d),a,nx*ny*d*sizeof(dual)); + memcpy(a,b,nx*ny*nz*sizeof(dual)); delete []b; + } + if(dir=='y' && ny>1) + { + d = num>0 ? num%ny : (num+ny*(1+num/ny))%ny; + if(d==0) return; // nothing to do + b = new dual[nx*ny*nz]; + memcpy(b,a+nx*d,(nx*ny*nz-nx*d)*sizeof(dual)); + for(i=0;i1) + { + d = num>0 ? num%nx : (num+nx*(1+num/nx))%nx; + if(d==0) return; // nothing to do + b = new dual[nx*ny*nz]; + memcpy(b,a+d,(nx*ny*nz-d)*sizeof(dual)); + for(i=0;inx,ny=d->ny,nz=d->nz; + register long i,j,k,i0,j0; + dual b, *a=d->a; + if(strchr(dir,'z') && nz>1) + { + for(j=0;j1) + { + for(k=0;k1) + { + for(j=0;j(d); + if(dd) + { + long nx=dd->nx, ny=dd->ny, nz=dd->nz, dn=ny>1?nx:0; + kx = kx=0 ? kx:0; + ky = ky=0 ? ky:0; + kz = kz=0 ? kz:0; + x -= kx; if(nx==1) x=0; + y -= ky; if(ny==1) y=0; + z -= kz; if(nz==1) z=0; + + const dual *aa=dd->a+kx+nx*(ky+ny*kz), *bb = aa+(nz>1?nx*ny:0); + b0 = aa[0]*(1-x-y+x*y) + x*(1-y)*aa[1] + y*(1-x)*aa[dn] + x*y*aa[1+dn]; + b1 = bb[0]*(1-x-y+x*y) + x*(1-y)*bb[1] + y*(1-x)*bb[dn] + x*y*bb[1+dn]; + if(dif) + { *dx = aa[1]-aa[0]; *dy = aa[dn]-aa[0]; *dz = bb[0]-aa[0]; } + } + else + { + long n=d->GetNx(), ny=d->GetNy(), nz=d->GetNz(); + kx = (kx>=0 ? (kx=0 ? (ky=0 ? (kzv(kx,ky,kz), a1 = d->v(kx+1,ky,kz), a2 = d->v(kx,ky+1,kz); + if(dif) { *dx = a1-a0; *dy = a2-a0; *dz = -a0; } + b0 = a0*(1-x-y+x*y) + x*(1-y)*a1 + + y*(1-x)*a2 + x*y*d->v(kx+1,ky+1,kz); + kz++; + a0 = d->v(kx,ky,kz); + if(dif) *dz += a0; + b1 = a0*(1-x-y+x*y) + x*(1-y)*d->v(kx+1,ky,kz) + + y*(1-x)*d->v(kx,ky+1,kz) + x*y*d->v(kx+1,ky+1,kz); + } + return b0 + z*(b1-b0); +} +dual mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z) +{ return mgl_datac_linear_ext(d, x,y,z, 0,0,0); } +//----------------------------------------------------------------------------- +dual mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +{ return mgl_datac_linear(_DA_(d),*x,*y,*z); } +dual mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz) +{ return mgl_datac_linear_ext(_DA_(d),*x,*y,*z,dx,dy,dz); } +//----------------------------------------------------------------------------- +void mgl_datac_crop(HADT d, long n1, long n2, char dir) +{ + long nx=d->nx,ny=d->ny,nz=d->nz, nn; + register long i,k; + dual *b; + if(n1<0) n1=0; + switch(dir) + { + case 'x': + n2 = n2>0 ? n2 : nx+n2; + if(n2<0 || n2>=nx || n2a+nx*i+n1,nn*sizeof(dual)); + d->nx = nn; if(!d->link) delete []d->a; + d->a = b; d->link=false; d->NewId(); + break; + case 'y': + n2 = n2>0 ? n2 : ny+n2; + if(n2<0 || n2>=ny || n2a+nx*(n1+k+ny*j),nx*sizeof(dual)); + d->ny = nn; if(!d->link) delete []d->a; + d->a = b; d->link=false; + break; + case 'z': + n2 = n2>0 ? n2 : nz+n2; + if(n2<0 || n2>=nz || n2a+nx*ny*n1,nn*nx*ny*sizeof(dual)); + d->nz = nn; if(!d->link) delete []d->a; + d->a = b; d->link=false; + break; + } +} +void mgl_datac_crop_(uintptr_t *d, int *n1, int *n2, const char *dir,int) +{ mgl_datac_crop(_DC_,*n1,*n2,*dir); } +//----------------------------------------------------------------------------- +void mgl_datac_insert(HADT d, char dir, long at, long num) +{ + if(num<1) return; + at = at<0 ? 0:at; + register long i,k,nn; + long nx=d->nx, ny=d->ny, nz=d->nz; + mglDataC b; + if(dir=='x') + { + if(at>nx) at=nx; + nn=nx+num; b.Create(nn,ny,nz); + for(k=0;k0) memcpy(b.a+nn*k, d->a+nx*k,at*sizeof(dual)); + if(ata+at+nx*k,(nx-at)*sizeof(dual)); + for(i=0;ia[nx*k+at]; // copy values + } + d->Set(b); nx+=num; + } + if(dir=='y') + { + if(at>ny) at=ny; + nn=num+ny; b.Create(nx,nn,nz); + for(k=0;k0) memcpy(b.a+nx*nn*k, d->a+nx*ny*k,at*nx*sizeof(dual)); + if(ata+nx*(at+ny*k),(ny-at)*nx*sizeof(dual)); + for(i=0;ia+nx*(ny*k+at),nx*sizeof(dual)); + } + d->Set(b); ny+=num; + } + if(dir=='z') + { + if(at>nz) at=nz; + b.Create(nx,ny,nz+num); + if(at>0) memcpy(b.a, d->a,at*nx*ny*sizeof(dual)); + if(ata+nx*ny*at,(nz-at)*nx*ny*sizeof(dual)); + for(i=0;ia+nx*ny*at,nx*ny*sizeof(dual)); + d->Set(b); nz+=num; + } +} +//----------------------------------------------------------------------------- +void mgl_datac_delete(HADT d, char dir, long at, long num) +{ + if(num<1 || at<0) return; + mglDataC b; + long nx=d->nx, ny=d->ny, nz=d->nz; + register long k,nn; + if(dir=='x') + { + if(at+num>=nx) return; + nn=nx-num; b.Create(nn,ny,nz); + for(k=0;k0) memcpy(b.a+nn*k, d->a+nx*k,at*sizeof(dual)); + memcpy(b.a+at+nn*k, d->a+at+num+nx*k,(nx-at-num)*sizeof(dual)); + } + d->Set(b); nx-=num; + } + if(dir=='y') + { + if(at+num>=ny) return; + nn=ny-num; b.Create(nx,nn,nz); + for(k=0;k0) memcpy(b.a+nx*nn*k, d->a+nx*ny*k,at*nx*sizeof(dual)); + memcpy(b.a+nx*(at+nn*k), d->a+nx*(at+num+ny*k),(ny-at-num)*nx*sizeof(dual)); + } + d->Set(b); ny-=num; + } + if(dir=='z') + { + if(at+num>=nz) return; + b.Create(nx,ny,nz-num); + if(at>0) memcpy(b.a, d->a,at*nx*ny*sizeof(dual)); + memcpy(b.a+nx*ny*at, d->a+nx*ny*(at+num),(nz-at-num)*nx*ny*sizeof(dual)); + d->Set(b); nz-=num; + } +} +//----------------------------------------------------------------------------- +void mgl_datac_insert_(uintptr_t *d, const char *dir, int *at, int *num, int) +{ mgl_datac_insert(_DC_,*dir,*at,*num); } +void mgl_datac_delete_(uintptr_t *d, const char *dir, int *at, int *num, int) +{ mgl_datac_delete(_DC_,*dir,*at,*num); } +//----------------------------------------------------------------------------- +void mgl_datac_set_value(HADT dat, dual v, long i, long j, long k) +{ + if(i>=0 && inx && j>=0 && jny && k>=0 && knz) + dat->a[i+dat->nx*(j+dat->ny*k)]=v; +} +void mgl_datac_set_value_(uintptr_t *d, dual *v, int *i, int *j, int *k) +{ mgl_datac_set_value(_DC_,*v,*i,*j,*k); } +//----------------------------------------------------------------------------- +dual mgl_datac_get_value(HCDT dat, long i, long j, long k) +{ + if(i<0 || i>=dat->GetNx() || j<0 || j>=dat->GetNy() || k<0 || k>=dat->GetNz()) + return NAN; + const mglDataC *d = dynamic_cast(dat); + return d ? d->a[i+d->nx*(j+d->nz*k)] : dat->v(i,j,k); +} +dual mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k) +{ return mgl_datac_get_value(_DA_(d),*i,*j,*k); } +//----------------------------------------------------------------------------- +dual *mgl_datac_data(HADT dat) { return dat->a; } +//----------------------------------------------------------------------------- +dual *mgl_datac_value(HADT dat, long i,long j,long k) +{ register long ii=i*dat->nx*(j+dat->ny*k); + return ii>=0 && iiGetNN() ? dat->a+ii : 0; } +//----------------------------------------------------------------------------- +void mgl_datac_fft(HADT d, const char *dir) +{ +#if MGL_HAVE_GSL + if(!dir || *dir==0) return; + long nx = d->nx, ny = d->ny, nz = d->nz; + double *a = new double[2*nx*ny*nz]; + register long i,j; + gsl_fft_direction how = strchr(dir,'i')?backward:forward; + for(i=0;ia[i]); a[2*i+1] = imag(d->a[i]); } + if(strchr(dir,'x') && nx>1) + { + gsl_fft_complex_wavetable *wt = gsl_fft_complex_wavetable_alloc(nx); + gsl_fft_complex_workspace *ws = gsl_fft_complex_workspace_alloc(nx); + for(i=0;i1) + { + gsl_fft_complex_wavetable *wt = gsl_fft_complex_wavetable_alloc(ny); + gsl_fft_complex_workspace *ws = gsl_fft_complex_workspace_alloc(ny); + for(j=0;j1) + { + gsl_fft_complex_wavetable *wt = gsl_fft_complex_wavetable_alloc(nz); + gsl_fft_complex_workspace *ws = gsl_fft_complex_workspace_alloc(nz); + for(i=0;ia[i] = dual(a[2*i], a[2*i+1]); + delete []a; +#endif +} +void mgl_datac_fft_(uintptr_t *d, const char *dir, int l) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + mgl_datac_fft(_DC_,s); delete []s; } +//----------------------------------------------------------------------------- +void mgl_datac_hankel(HADT d, const char *dir) +{ + #if MGL_HAVE_GSL + if(!dir || *dir==0) return; + double *ai=0, *af=0, *ag=0; + mreal mm; + gsl_dht *dht=0; + register long i,j,k; + long nx=d->nx, ny=d->ny, nz=d->nz; + dual *a=d->a; + if(strchr(dir,'x') && nx>1) + { + ai = new double[nx]; af = new double[nx]; ag = new double[nx]; + dht = gsl_dht_new(nx,0,1); + mm = gsl_sf_bessel_zero_J0(nx+1); + for(i=0;i1) + { + ai = new double[ny]; af = new double[ny]; ag = new double[ny]; + dht = gsl_dht_new(ny,0,1); + mm = gsl_sf_bessel_zero_J0(ny+1); + for(i=0;i1) + { + ai = new double[nz]; af = new double[nz]; ag = new double[nz]; + dht = gsl_dht_new(nz,0,1); + mm = gsl_sf_bessel_zero_J0(nz+1); + k = nx*ny; for(i=0;i * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include + +#ifndef WIN32 +#include +#endif + +#include "mgl2/datac.h" +#include "mgl2/evalc.h" + +#if MGL_HAVE_HDF5 +#define H5_USE_16_API +#include +#endif + +#define isn(ch) ((ch)=='\n') +char *mgl_read_gz(gzFile fp); +//----------------------------------------------------------------------------- +HADT mgl_create_datac() { return new mglDataC; } +HADT mgl_create_datac_size(long nx, long ny, long nz){ return new mglDataC(nx,ny,nz); } +HADT mgl_create_datac_file(const char *fname) { return new mglDataC(fname); } +void mgl_delete_datac(HADT d) { if(d) delete d; } +//----------------------------------------------------------------------------- +uintptr_t mgl_create_datac_() +{ return uintptr_t(new mglDataC()); } +uintptr_t mgl_create_datac_size_(int *nx, int *ny, int *nz) +{ return uintptr_t(new mglDataC(*nx,*ny,*nz)); } +uintptr_t mgl_create_datac_file_(const char *fname,int l) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + uintptr_t r = uintptr_t(new mglDataC(s)); delete []s; return r; } +void mgl_delete_datac_(uintptr_t *d) +{ if(_DC_) delete _DC_; } +//----------------------------------------------------------------------------- +void mglFromStr(HADT d,char *buf,long NX,long NY,long NZ) // TODO: add multithreading read +{ + if(NX<1 || NY <1 || NZ<1) return; + mgl_datac_create(d, NX,NY,NZ); + long nb = strlen(buf); + register long i=0, j=0; + while(j0 || buf[j+1]!='#') // this is columns id + while(!isn(buf[j]) && j='a' && buf[j]<='z') + d->id.push_back(buf[j]); + j++; + } + } + while(buf[j]<=' ' && j=' ' && buf[j]!=';' && ja[i] = dual(re,im); + i++; if(i>=NX*NY*NZ) break; + } +} +//----------------------------------------------------------------------------- +void mgl_datac_set(HADT d, HCDT a) +{ + if(!a) return; + const mglDataC *dd = dynamic_cast(a); // faster for mglData + mgl_datac_create(d, a->GetNx(), a->GetNy(), a->GetNz()); + if(dd) // this one should be much faster + memcpy(d->a, dd->a, d->nx*d->ny*d->nz*sizeof(dual)); + else // very inefficient!!! + { + register long i,j,k; + for(k=0;knz;k++) for(j=0;jny;j++) for(i=0;inx;i++) + d->a[i+d->nx*(j+d->ny*k)] = a->v(i,j,k); + } +} +void mgl_datac_set_(uintptr_t *d, uintptr_t *a) { mgl_datac_set(_DC_,_DA_(a)); } +//----------------------------------------------------------------------------- +void mgl_datac_set_values(HADT d, const char *v,long NX,long NY,long NZ) +{ + if(NX<1 || NY <1 || NZ<1) return; + register long n=strlen(v)+1; + char *buf = new char[n]; + memcpy(buf,v,n); + mglFromStr(d,buf,NX,NY,NZ); + delete []buf; +} +void mgl_datac_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l) +{ char *s=new char[l+1]; memcpy(s,val,l); s[l]=0; + mgl_datac_set_values(_DC_,s,*nx,*ny,*nz); delete []s; } +//----------------------------------------------------------------------------- +void mgl_datac_set_vector(HADT d, gsl_vector *v) +{ +#if MGL_HAVE_GSL + if(!v || v->size<1) return; + mgl_datac_create(d, v->size,1,1); + for(long i=0;inx;i++) d->a[i] = v->data[i*v->stride]; +#endif +} +//----------------------------------------------------------------------------- +void mgl_datac_set_matrix(HADT d, gsl_matrix *m) +{ +#if MGL_HAVE_GSL + if(!m || m->size1<1 || m->size2<1) return; + mgl_datac_create(d, m->size1,m->size2,1); + register long i,j; + for(j=0;jny;j++) for(i=0;inx;i++) + d->a[i+j*d->nx] = m->data[i * m->tda + j]; +#endif +} +//----------------------------------------------------------------------------- +void mgl_datac_set_float(HADT d, const float *A,long NX,long NY,long NZ) +{ + if(NX<=0 || NY<=0 || NZ<=0) return; + mgl_datac_create(d, NX,NY,NZ); if(!A) return; +#if MGL_USE_DOUBLE + for(long i=0;ia[i] = A[i]; +#else + memcpy(d->a,A,NX*NY*NZ*sizeof(float)); +#endif +} +//----------------------------------------------------------------------------- +void mgl_datac_set_double(HADT d, const double *A,long NX,long NY,long NZ) +{ + if(NX<=0 || NY<=0 || NZ<=0) return; + mgl_datac_create(d, NX,NY,NZ); if(!A) return; +#if MGL_USE_DOUBLE + memcpy(d->a,A,NX*NY*NZ*sizeof(double)); +#else + for(long i=0;ia[i] = A[i]; +#endif +} +//----------------------------------------------------------------------------- +void mgl_datac_set_complex(HADT d, const dual *A,long NX,long NY,long NZ) +{ + if(NX<=0 || NY<=0 || NZ<=0) return; + mgl_datac_create(d, NX,NY,NZ); if(!A) return; + #if MGL_USE_DOUBLE + for(long i=0;ia[i] = A[i]; + #else + memcpy(d->a,A,NX*NY*NZ*sizeof(float)); + #endif +} +//----------------------------------------------------------------------------- +void mgl_datac_set_float_(uintptr_t *d, const float *A,int *NX,int *NY,int *NZ) +{ mgl_datac_set_float(_DC_,A,*NX,*NY,*NZ); } +void mgl_datac_set_double_(uintptr_t *d, const double *A,int *NX,int *NY,int *NZ) +{ mgl_datac_set_double(_DC_,A,*NX,*NY,*NZ); } +void mgl_datac_set_complex_(uintptr_t *d, const dual *A,int *NX,int *NY,int *NZ) +{ mgl_datac_set_complex(_DC_,A,*NX,*NY,*NZ); } +//----------------------------------------------------------------------------- +void mgl_datac_rearrange(HADT d, long mx,long my,long mz) +{ + if(mx<1) return; // wrong mx + if(my<1) { my = d->nx*d->ny*d->nz/mx; mz = 1; } + else if(mz<1) mz = (d->nx*d->ny*d->nz)/(mx*my); + long m = mx*my*mz; + if(m==0 || m>d->nx*d->ny*d->nz) return; // too high desired dimensions + d->nx = mx; d->ny = my; d->nz = mz; d->NewId(); +} +void mgl_datac_rearrange_(uintptr_t *d, int *mx, int *my, int *mz) +{ mgl_datac_rearrange(_DC_,*mx,*my,*mz); } +//----------------------------------------------------------------------------- +void mgl_datac_set_id(HADT d, const char *ids) { d->id = ids; } +void mgl_datac_set_id_(uintptr_t *d, const char *eq,int l) +{ char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; + mgl_datac_set_id(_DC_, s); delete []s; } +//----------------------------------------------------------------------------- +void mgl_datac_save(HCDT d, const char *fname,long ns) +{ + const mglDataC *dd = dynamic_cast(d); + if(!dd) { mgl_data_save(d,fname,ns); return; } + FILE *fp; + fp = fopen(fname,"w"); + register long i,j,k; + long nx=dd->nx, ny=dd->ny, nz=dd->nz; + if(ns<0 || (ns>=nz && nz>1)) for(k=0;ka[j+nx*(i+ny*k)]), imag(dd->a[j+nx*(i+ny*k)])); + fprintf(fp,"%g+i%g\n", real(dd->a[nx-1+nx*(i+ny*k)]), imag(dd->a[nx-1+nx*(i+ny*k)])); + } + fprintf(fp,"\n"); + } + else + { // save selected slice + if(nz>1) for(i=0;ia[j+nx*(i+ny*ns)]), imag(dd->a[j+nx*(i+ny*ns)])); + fprintf(fp,"%g+i%g\n", real(dd->a[nx-1+nx*(i+ny*ns)]), imag(dd->a[nx-1+nx*(i+ny*ns)])); + } + else if(nsa[j+nx*ns]), imag(dd->a[j+nx*ns])); + } + fclose(fp); +} +void mgl_datac_save_(uintptr_t *d, const char *fname,int *ns,int l) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + mgl_datac_save(_DC_,s,*ns); delete []s; } +//----------------------------------------------------------------------------- +int mgl_datac_read(HADT d, const char *fname) +{ + long l=1,m=1,k=1; + long nb,i; + gzFile fp = gzopen(fname,"r"); + if(!fp) + { + if(!d->a) mgl_datac_create(d, 1,1,1); + return false; + } + char *buf = mgl_read_gz(fp); + nb = strlen(buf); gzclose(fp); + + bool first=false; // space is not allowed delimiter for file with complex numbers + register char ch; + for(i=nb-1;i>=0;i--) if(buf[i]>' ') break; + buf[i+1]=0; nb = i; // remove tailing spaces + for(i=0;i' ' && !first) first=true; + if(first && (ch=='\t' || ch==';') && buf[i+1]!='\t') k++; // ',' is not valid delimiter for complex arrays + } + first = false; + for(i=0;inx = mx>0 ? mx:1; d->ny = my>0 ? my:1; d->nz = mz>0 ? mz:1; + if(d->a && !d->link) delete [](d->a); + d->a = new dual[d->nx*d->ny*d->nz]; + d->id.clear(); d->link=false; + memset(d->a,0,d->nx*d->ny*d->nz*sizeof(dual)); +} +void mgl_datac_create_(uintptr_t *d, int *nx,int *ny,int *nz) +{ mgl_datac_create(_DC_,*nx,*ny,*nz); } +//----------------------------------------------------------------------------- +void mgl_datac_link(HADT d, dual *A, long mx,long my,long mz) +{ + if(!A) return; + if(!d->link && d->a) delete [](d->a); + d->nx = mx>0 ? mx:1; d->ny = my>0 ? my:1; d->nz = mz>0 ? mz:1; + d->link=true; d->a=A; d->NewId(); +} +void mgl_datac_link_(uintptr_t *d, dual *A, int *nx,int *ny,int *nz) +{ mgl_datac_link(_DC_,A,*nx,*ny,*nz); } +//----------------------------------------------------------------------------- +int mgl_datac_read_dim(HADT d, const char *fname,long mx,long my,long mz) +{ + if(mx<=0 || my<=0 || mz<=0) return false; + gzFile fp = gzopen(fname,"r"); + if(!fp) return false; + char *buf = mgl_read_gz(fp); + gzclose(fp); + mglFromStr(d,buf,mx,my,mz); + free(buf); return true; +} +int mgl_datac_read_dim_(uintptr_t *d, const char *fname,int *mx,int *my,int *mz,int l) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + int r = mgl_datac_read_dim(_DC_,s,*mx,*my,*mz); delete []s; return r; } +//----------------------------------------------------------------------------- +int mgl_datac_read_mat(HADT d, const char *fname, long dim) +{ + if(dim<=0 || dim>3) return false; + gzFile fp = gzopen(fname,"r"); + if(!fp) return false; + long nx=1, ny=1, nz=1; + char *buf = mgl_read_gz(fp); + long nb = strlen(buf); gzclose(fp); + + register long j=0,i,l; + while(j' ') j++; + } + else if(dim==2) + { + sscanf(buf+j,"%ld%ld",&nx,&ny); + while(buf[j]!='\n' && j' ' && !first) first=true; + if(first && (ch=='\t' || ch==';') && b[i+1]!='\t') nx++; + } + } + } + else if(dim==3) + { + sscanf(buf+j,"%ld%ld%ld",&nx,&ny,&nz); + while(buf[j]!='\n' && jp[0],ny=t->p[1]; + dual *b=t->a, x1=t->b[0], dx=t->b[1]; + register char dir = t->s[0]; + for(i0=t->id;i0n;i0+=mglNumThr) + { + if(dir=='x') b[i0] = x1+dx*mreal(i0%nx); + else if(dir=='y') b[i0] = x1+dx*mreal((i0/nx)%ny); + else if(dir=='z') b[i0] = x1+dx*mreal(i0/(nx*ny)); + } + return 0; +} +void mgl_datac_fill(HADT d, dual x1,dual x2,char dir) +{ + if(mgl_isnan(x2)) x2=x1; + if(dir<'x' || dir>'z') dir='x'; + long par[2]={d->nx,d->ny}; + dual b[2]={x1,x2-x1}; + if(dir=='x') b[1] *= d->nx>1 ? 1./(d->nx-1):0; + if(dir=='y') b[1] *= d->ny>1 ? 1./(d->ny-1):0; + if(dir=='z') b[1] *= d->nz>1 ? 1./(d->nz-1):0; + mglStartThreadC(mgl_cfill_x,0,d->nx*d->ny*d->nz,d->a,b,0,par,0,0,0,&dir); +} +void mgl_datac_fill_(uintptr_t *d, dual *x1,dual *x2,const char *dir,int) +{ mgl_datac_fill(_DC_,*x1,*x2,*dir); } +//----------------------------------------------------------------------------- +void mgl_datac_squeeze(HADT d, long rx,long ry,long rz,long smooth) +{ + long kx,ky,kz,i,j,k; + long nx=d->nx, ny=d->ny, nz=d->nz; + dual *b; + + // simple checking + if(rx>=nx) rx=nx-1; if(rx<1) rx=1; + if(ry>=ny) ry=ny-1; if(ry<1) ry=1; + if(rz>=nz) rz=nz-1; if(rz<1) rz=1; + // new sizes + kx = 1+(nx-1)/rx; ky = 1+(ny-1)/ry; kz = 1+(nz-1)/rz; + b = new dual[kx*ky*kz]; + if(!smooth) for(k=0;ka[i*rx+nx*(j*ry+ny*rz*k)]; + else for(k=0;ka[i1+nx*(j1+ny*k1)]; + b[i+kx*(j+ky*k)] = s/mreal(dx*dy*dz); + } + if(!d->link) delete [](d->a); + d->a=b; d->nx = kx; d->ny = ky; d->nz = kz; d->NewId(); d->link=false; +} +void mgl_datac_squeeze_(uintptr_t *d, int *rx,int *ry,int *rz,int *smooth) +{ mgl_datac_squeeze(_DC_,*rx,*ry,*rz,*smooth); } +//----------------------------------------------------------------------------- +void mgl_datac_extend(HADT d, long n1, long n2) +{ + long nx=d->nx, ny=d->ny, nz=d->nz; + if(nz>2 || n1==0) return; + long mx, my, mz; + dual *b=0; + register long i,j; + if(n1>0) // extend to higher dimension(s) + { + n2 = n2>0 ? n2:1; + mx = nx; my = ny>1?ny:n1; mz = ny>1 ? n1 : n2; + b = new dual[mx*my*mz]; + if(ny>1) for(i=0;ia, nx*ny*sizeof(dual)); + else for(i=0;ia, nx*sizeof(dual)); + } + else + { + mx = -n1; my = n2<0 ? -n2 : nx; mz = n2<0 ? nx : ny; + if(n2>0 && ny==1) mz = n2; + b = new dual[mx*my*mz]; + register dual v; + if(n2<0) for(j=0;ja[j];ia[j];i0 && ny==1) for(i=0;ia, mx*my*sizeof(dual)); + } + if(!d->link) delete [](d->a); + d->a=b; d->nx=mx; d->ny=my; d->nz=mz; + d->NewId(); d->link=false; +} +void mgl_datac_extend_(uintptr_t *d, int *n1, int *n2) +{ mgl_datac_extend(_DC_,*n1,*n2); } +//----------------------------------------------------------------------------- +void mgl_datac_transpose(HADT d, const char *dim) +{ + long nx=d->nx, ny=d->ny, nz=d->nz; + dual *b=new dual[nx*ny*nz], *a=d->a; + register long i,j,k,n; + if(!strcmp(dim,"xyz")) memcpy(b,a,nx*ny*nz*sizeof(dual)); + else if(!strcmp(dim,"xzy") || !strcmp(dim,"zy")) + { + for(j=0;jnx; d->nx=nx; d->ny=ny; d->nz=nz; + if(nx!=n) d->NewId(); +} +void mgl_datac_transpose_(uintptr_t *d, const char *dim,int l) +{ char *s=new char[l+1]; memcpy(s,dim,l); s[l]=0; + mgl_datac_transpose(_DC_,s); delete []s; } +//----------------------------------------------------------------------------- +void *mgl_cmodify(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + const mglFormulaC *f = (const mglFormulaC *)(t->v); + register long i,j,k,i0, nx=t->p[0],ny=t->p[1],nz=t->p[2]; + dual *b=t->a; + mreal dx,dy,dz; + const dual *v=t->b, *w=t->c; + dx=nx>1?1/(nx-1.):0; dy=ny>1?1/(ny-1.):0; dz=nz>1?1/(nz-1.):0; + for(i0=t->id;i0n;i0+=mglNumThr) + { + i=i0%nx; j=((i0/nx)%ny); k=i0/(nx*ny); + b[i0] = f->Calc(i*dx, j*dy, k*dz, b[i0], v?v[i0]:0, w?w[i0]:0); + } + return 0; +} +void mgl_datac_modify(HADT d, const char *eq,long dim) +{ + long nx=d->nx, ny=d->ny, nz=d->nz, par[3]={nx,ny,nz}; + mglFormulaC f(eq); + if(dim<0) dim=0; + if(nz>1) // 3D array + { + par[2] -= dim; if(par[2]<0) par[2]=0; + mglStartThreadC(mgl_cmodify,0,nx*ny*par[2],d->a+nx*ny*dim,0,0,par,&f); + } + else // 2D or 1D array + { + par[1] -= dim; if(par[1]<0) par[1]=0; + mglStartThreadC(mgl_cmodify,0,nx*par[1],d->a+nx*dim,0,0,par,&f); + } +} +void mgl_datac_modify_(uintptr_t *d, const char *eq,int *dim,int l) +{ char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; + mgl_datac_modify(_DC_,s,*dim); delete []s; } +//----------------------------------------------------------------------------- +void *mgl_cmodify_gen(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + const mglFormulaC *f = (const mglFormulaC *)(t->v); + register long i,j,k,i0, nx=t->p[0],ny=t->p[1],nz=t->p[2]; + dual *b=t->a; + mreal dx,dy,dz; + HCDT v=(HCDT)t->b, w=(HCDT)t->c; + dx=nx>1?1/(nx-1.):0; dy=ny>1?1/(ny-1.):0; dz=nz>1?1/(nz-1.):0; + for(i0=t->id;i0n;i0+=mglNumThr) + { + i=i0%nx; j=((i0/nx)%ny); k=i0/(nx*ny); + b[i0] = f->Calc(i*dx, j*dy, k*dz, b[i0], v?v->vthr(i0):0, w?w->vthr(i0):0); + } + return 0; +} +void mgl_datac_modify_vw(HADT d, const char *eq,HCDT vdat,HCDT wdat) +{ + const mglDataC *v = dynamic_cast(vdat); + const mglDataC *w = dynamic_cast(wdat); + long nn = d->nx*d->ny*d->nz, par[3]={d->nx,d->ny,d->nz}; + if(vdat && vdat->GetNN()!=nn) return; + if(wdat && wdat->GetNN()!=nn) return; + mglFormulaC f(eq); + if(v && w) mglStartThreadC(mgl_cmodify,0,nn,d->a,v->a,w->a,par,&f); + else if(vdat && wdat) mglStartThreadV(mgl_cmodify_gen,nn,d->a,vdat,wdat,par,&f); + else if(v) mglStartThreadC(mgl_cmodify,0,nn,d->a,v->a,0,par,&f); + else if(vdat) mglStartThreadV(mgl_cmodify_gen,nn,d->a,vdat,0,par,&f); + else mglStartThreadC(mgl_cmodify,0,nn,d->a,0,0,par,&f); +} +void mgl_datac_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w,int l) +{ char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; + mgl_datac_modify_vw(_DC_,s,_DA_(v),_DA_(w)); delete []s; } +//----------------------------------------------------------------------------- +void *mgl_cfill_f(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + const mglFormulaC *f = (const mglFormulaC *)(t->v); + register long i,j,k,i0, nx=t->p[0],ny=t->p[1]; + dual *b=t->a; + const dual *v=t->b, *w=t->c, *x=t->d; + for(i0=t->id;i0n;i0+=mglNumThr) + { + i=i0%nx; j=((i0/nx)%ny); k=i0/(nx*ny); + b[i0] = f->Calc(x[0]+mreal(i)*x[1], x[2]+mreal(j)*x[3], x[4]+mreal(k)*x[5], + b[i0], v?v[i0]:0, w?w[i0]:0); + } + return 0; +} +void *mgl_cfill_fgen(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + const mglFormulaC *f = (const mglFormulaC *)(t->v); + register long i,j,k,i0, nx=t->p[0],ny=t->p[1]; + dual *b=t->a; + HCDT v=(HCDT)t->b, w=(HCDT)t->c; + const dual *x=t->d; + for(i0=t->id;i0n;i0+=mglNumThr) + { + i=i0%nx; j=((i0/nx)%ny); k=i0/(nx*ny); + b[i0] = f->Calc(x[0]+mreal(i)*x[1], x[2]+mreal(j)*x[3], x[4]+mreal(k)*x[5], + b[i0], v?v->vthr(i0):0, w?w->vthr(i0):0); + } + return 0; +} +void mgl_datac_fill_eq(HMGL gr, HADT d, const char *eq, HCDT vdat, HCDT wdat, const char *opt) +{ + const mglDataC *v = dynamic_cast(vdat); + const mglDataC *w = dynamic_cast(wdat); + long nn = d->nx*d->ny*d->nz, par[3]={d->nx,d->ny,d->nz}; + if(v && v->nx*v->ny*v->nz!=nn) return; + if(w && w->nx*w->ny*w->nz!=nn) return; + gr->SaveState(opt); + mreal xx[6]={gr->Min.x,0, gr->Min.y,0, gr->Min.z,0}; + if(d->nx>1) xx[1] = (gr->Max.x-gr->Min.x)/(d->nx-1.); + if(d->ny>1) xx[3] = (gr->Max.y-gr->Min.y)/(d->ny-1.); + if(d->nz>1) xx[5] = (gr->Max.z-gr->Min.z)/(d->nz-1.); + dual cc[6]={xx[0],xx[1],xx[2],xx[3],xx[4],xx[5]}; + mglFormulaC f(eq); + if(v && w) mglStartThreadC(mgl_cfill_f,0,nn,d->a,v->a,w->a,par,&f,cc); + else if(vdat && wdat) mglStartThreadV(mgl_cfill_fgen,nn,d->a,vdat,wdat,par,&f,xx); + else if(v) mglStartThreadC(mgl_cfill_f,0,nn,d->a,v->a,0,par,&f,cc); + else if(vdat) mglStartThreadV(mgl_cfill_fgen,nn,d->a,vdat,0,par,&f,xx); + else mglStartThreadC(mgl_cfill_f,0,nn,d->a,0,0,par,&f,cc); + gr->LoadState(); +} +void mgl_datac_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w, const char *opt,int l,int lo) +{ char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; + char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; + mgl_datac_fill_eq(_GR_,_DC_,s,_DA_(v),_DA_(w),o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +bool mgl_add_file(long &kx,long &ky, long &kz, dual *&b, mglDataC *d,bool as_slice) +{ + if(as_slice && d->nz==1) + { + if(kx==d->nx && d->ny==1) + { + b = (dual *)realloc(b,kx*(ky+1)*sizeof(dual)); + memcpy(b+kx*ky,d->a,kx*sizeof(dual)); ky++; + } + else if(kx==d->nx && ky==d->ny) + { + b = (dual *)realloc(b,kx*ky*(kz+1)*sizeof(dual)); + memcpy(b+kx*ky*kz,d->a,kx*ky*sizeof(dual)); kz++; + } + else return false; + } + else + { + if(d->ny*d->nz==1 && ky*kz==1) + { + b = (dual *)realloc(b,(kx+d->nx)*sizeof(dual)); + memcpy(b+kx,d->a,d->nx*sizeof(dual)); kx+=d->nx; + } + else if(kx==d->nx && kz==1 && d->nz==1) + { + b = (dual *)realloc(b,kx*(ky+d->ny)*sizeof(dual)); + memcpy(b+kx*ky,d->a,kx*d->ny*sizeof(dual)); ky+=d->ny; + } + else if(kx==d->nx && ky==d->ny) + { + b = (dual *)realloc(b,kx*kx*(kz+d->nz)*sizeof(dual)); + memcpy(b+kx*ky*kz,d->a,kx*ky*d->nz*sizeof(dual)); kz+=d->nz; + } + else return false; + } + return true; +} +//----------------------------------------------------------------------------- +int mgl_datac_read_range(HADT dat, const char *templ, double from, double to, double step, int as_slice) +{ + mglDataC d; + double t = from; + dual *b; + long kx,ky,kz; + char *fname = new char[strlen(templ)+20]; + + //read first file + do{ sprintf(fname,templ,t); t+= step; } while(!mgl_datac_read(&d,fname) && t<=to); + + if(t>to) return false; + kx = d.nx; ky = d.ny; kz = d.nz; + b = (dual *)malloc(kx*ky*kz*sizeof(dual)); + memcpy(b,d.a,kx*ky*kz*sizeof(dual)); + + // read other files + for(;t<=to;t+=step) + { + sprintf(fname,templ,t); + if(mgl_datac_read(&d,fname)) + if(!mgl_add_file(kx,ky,kz,b,&d,as_slice)) + return false; + } + dat->Set(b,kx,ky,kz); + delete []fname; free(b); + return true; +} +int mgl_datac_read_range_(uintptr_t *d, const char *fname, mreal *from, mreal *to, mreal *step, int *as_slice,int l) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + int r = mgl_datac_read_range(_DC_,s,*from,*to,*step,*as_slice); delete []s; return r; } +//----------------------------------------------------------------------------- +int mgl_datac_read_all(HADT dat, const char *templ, int as_slice) +{ +#ifndef WIN32 + mglDataC d; + glob_t res; + size_t i; + dual *b; + long kx,ky,kz; + char *fname = new char[256]; + glob (templ, GLOB_TILDE, NULL, &res); + + //read first file + for(i=0;i=res.gl_pathc) { delete []fname; return false; } + kx = d.nx; ky = d.ny; kz = d.nz; + b = (dual *)malloc(kx*ky*kz*sizeof(dual)); + memcpy(b,d.a,kx*ky*kz*sizeof(dual)); + + for(;iSet(b,kx,ky,kz); + + globfree (&res); + delete []fname; free(b); + return true; +#else + return false; +#endif +} +int mgl_datac_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + int r = mgl_datac_read_all(_DC_,s,*as_slice); delete []s; return r; } +//----------------------------------------------------------------------------- +HMDT mgl_datac_real(HCDT d) +{ + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(); + mglData *r=new mglData(nx,ny,nz); + const mglDataC *dd = dynamic_cast(d); + register long i; + if(dd) for(i=0;ia[i] = real(dd->a[i]); + else r->Set(d); + return r; +} +uintptr_t mgl_datac_real_(uintptr_t *d) +{ return uintptr_t(mgl_datac_real(_DC_)); } +//----------------------------------------------------------------------------- +HMDT mgl_datac_imag(HCDT d) +{ + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(); + mglData *r=new mglData(nx,ny,nz); + const mglDataC *dd = dynamic_cast(d); + register long i; + if(dd) for(i=0;ia[i] = imag(dd->a[i]); + return r; +} +uintptr_t mgl_datac_imag_(uintptr_t *d) +{ return uintptr_t(mgl_datac_imag(_DC_)); } +//----------------------------------------------------------------------------- +HMDT mgl_datac_abs(HCDT d) +{ + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(); + mglData *r=new mglData(nx,ny,nz); + const mglDataC *dd = dynamic_cast(d); + register long i; + if(dd) for(i=0;ia[i] = abs(dd->a[i]); + else for(i=0;ia[i] = fabs(d->vthr(i)); + return r; +} +uintptr_t mgl_datac_abs_(uintptr_t *d) +{ return uintptr_t(mgl_datac_abs(_DC_)); } +//----------------------------------------------------------------------------- +HMDT mgl_datac_arg(HCDT d) +{ + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(); + mglData *r=new mglData(nx,ny,nz); + const mglDataC *dd = dynamic_cast(d); + register long i; + if(dd) for(i=0;ia[i] = arg(dd->a[i]); + return r; +} +uintptr_t mgl_datac_arg_(uintptr_t *d) +{ return uintptr_t(mgl_datac_arg(_DC_)); } +//----------------------------------------------------------------------------- +void mgl_datac_set_ri(HADT d, HCDT re, HCDT im) +{ + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(); + d->Create(nx,ny,nz); + register long i; + for(i=0;ia[i] = dual(re->vthr(i),im->vthr(i)); +} +void mgl_datac_set_ri_(uintptr_t *d, uintptr_t *re, uintptr_t *im) +{ mgl_datac_set_ri(_DC_,_DA_(re),_DA_(im)); } +//----------------------------------------------------------------------------- +void mgl_datac_set_ap(HADT d, HCDT a, HCDT p) +{ + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(); + d->Create(nx,ny,nz); + register long i; + register mreal aa,pp; + for(i=0;ivthr(i); pp=p->vthr(i); + d->a[i] = dual(aa*cos(pp), aa*sin(pp)); + } +} +void mgl_datac_set_ap_(uintptr_t *d, uintptr_t *a, uintptr_t *p) +{ mgl_datac_set_ap(_DC_,_DA_(a),_DA_(p)); } +//----------------------------------------------------------------------------- +#if MGL_HAVE_HDF5 +void mgl_datac_save_hdf(HCDT dat,const char *fname,const char *data,int rewrite) +{ + const mglDataC *d = dynamic_cast(dat); // NOTE: only for mglDataC + if(!d) { mgl_data_save_hdf(dat,fname,data,rewrite); return; } + hid_t hf,hd,hs; + hsize_t dims[4]; + long rank = 3, res; + H5Eset_auto(0,0); + res=H5Fis_hdf5(fname); + if(res>0 && !rewrite) hf = H5Fopen(fname, H5F_ACC_RDWR, H5P_DEFAULT); + else hf = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + if(hf<0) return; + if(d->nz==1 && d->ny == 1) { rank=2; dims[0]=d->nx; dims[1]=2; } + else if(d->nz==1) { rank=3; dims[0]=d->ny; dims[1]=d->nx; dims[2]=2; } + else { rank=4; dims[0]=d->nz; dims[1]=d->ny; dims[2]=d->nx; dims[3]=2; } + hs = H5Screate_simple(rank, dims, 0); +#if MGL_USE_DOUBLE + hid_t mem_type_id = H5T_NATIVE_DOUBLE; +#else + hid_t mem_type_id = H5T_NATIVE_FLOAT; +#endif + hd = H5Dcreate(hf, data, mem_type_id, hs, H5P_DEFAULT); + H5Dwrite(hd, mem_type_id, hs, hs, H5P_DEFAULT, d->a); + H5Dclose(hd); H5Sclose(hs); H5Fclose(hf); +} +//----------------------------------------------------------------------------- +int mgl_datac_read_hdf(HADT d,const char *fname,const char *data) +{ + hid_t hf,hd,hs; + hsize_t dims[4]; + long rank, res = H5Fis_hdf5(fname); + if(res<=0) { return false; } + hf = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT); + if(hf<0) return false; + hd = H5Dopen(hf,data); + if(hd<0) return false; + hs = H5Dget_space(hd); + rank = H5Sget_simple_extent_ndims(hs); + if(rank>0 && rank<=3) + { + H5Sget_simple_extent_dims(hs,dims,0); + if(rank==2) { dims[2]=dims[0]; dims[0]=dims[1]=1; } + else if(rank==3) { dims[2]=dims[1]; dims[1]=dims[0]; dims[0]=1; } +// else if(rank>3) continue; + mgl_datac_create(d,dims[2],dims[1],dims[0]); +#if MGL_USE_DOUBLE + H5Dread(hd, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, d->a); +#else + H5Dread(hd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, d->a); +#endif + } + H5Sclose(hs); H5Dclose(hd); H5Fclose(hf); return true; +} +//----------------------------------------------------------------------------- +#else +void mgl_datac_save_hdf(HCDT ,const char *,const char *,int ) +{ mglGlobalMess += "HDF5 support was disabled. Please, enable it and rebuild MathGL.\n"; } +int mgl_datac_read_hdf(HADT ,const char *,const char *) +{ mglGlobalMess += "HDF5 support was disabled. Please, enable it and rebuild MathGL.\n"; return false;} +#endif +//----------------------------------------------------------------------------- +int mgl_datac_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + char *t=new char[n+1]; memcpy(t,data,n); t[n]=0; + int r = mgl_datac_read_hdf(_DC_,s,t); delete []s; delete []t; return r; } +void mgl_datac_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + char *t=new char[n+1]; memcpy(t,data,n); t[n]=0; + mgl_datac_save_hdf(_DC_,s,t,*rewrite); delete []s; delete []t; } +//----------------------------------------------------------------------------- diff --git a/src/cont.cpp b/src/cont.cpp index 9185dde..08d0c64 100644 --- a/src/cont.cpp +++ b/src/cont.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * cont.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -22,33 +22,20 @@ #include "mgl2/cont.h" #include "mgl2/data.h" #include "mgl2/eval.h" +#include "mgl2/font.h" //----------------------------------------------------------------------------- // // Text printing along a curve // //----------------------------------------------------------------------------- -bool same_chain(long f,long i,long *nn) -{ - long j=f; - while(1) - { - j = nn[j]; - if(j==f || j<0) return false; - if(j==i) return true; - } -} -//----------------------------------------------------------------------------- void mgl_string_curve(mglBase *gr,long f,long ,long *ff,long *nn,const wchar_t *text, const char *font, mreal size) { - if(nn[f]==-1) return; // do nothing since there is no curve + if(f<0 || nn[f]==-1) return; // do nothing since there is no curve if(!font) font=""; - int pos = strchr(font,'t') ? 1:-1, align; + int pos = strchr(font,'T') ? 1:-1, align; char cc=mglGetStyle(font,0,&align); align = align&3; mreal c=cc ? -cc : gr->GetClrC(ff[f]); - long len = wcslen(text); - char *fnt = new char[strlen(font)+3]; strcpy(fnt,font); - mreal *wdt=new mreal[len+1], h=gr->TextHeight(font,size)/4, tet, tt; // TODO optimaze ratio - mglPoint *pt=new mglPoint[len+1]; + mreal h=gr->TextHeight(font,size)/2, tet, tt; wchar_t L[2]=L"a"; register long i,j,k,m; @@ -57,7 +44,7 @@ void mgl_string_curve(mglBase *gr,long f,long ,long *ff,long *nn,const wchar_t * qa.push_back(q+l*h); qb.push_back(q-l*h); for(i=nn[f];i>=0 && i!=f;i=nn[i]) // construct curves { - if(gr->Stop) { delete []wdt; delete []pt; delete []fnt; return; } + if(gr->Stop) return; p=q; q=s; l=t; if(nn[i]>=0 && ff[nn[i]]>=0) { s=gr->GetPntP(ff[nn[i]]); t=!(s-q); } tet = t.x*l.y-t.y*l.x; @@ -69,9 +56,10 @@ void mgl_string_curve(mglBase *gr,long f,long ,long *ff,long *nn,const wchar_t * else { qa.push_back(q+l*h); qb.push_back(q-l*h); } } - if(pos<0) qa=qb; + if(pos>0) qa=qb; // adjust text direction bool rev = align==2; + char *fnt = new char[strlen(font)+3]; strcpy(fnt,font); if(qa[0].x>qa[1].x) { if(align==0){ strcat(fnt,":R"); align=2; } @@ -79,11 +67,18 @@ void mgl_string_curve(mglBase *gr,long f,long ,long *ff,long *nn,const wchar_t * else { strcat(fnt,":L"); align=0; } } if(rev) reverse(qa.begin(),qa.end()); - for(j=0;jTextWidth(L,font,size)/2; } + long len = wcslen(text); + mreal *wdt=new mreal[len+1]; + for(j=0;jTextWidth(L,font,size); } wdt[len]=0; // place glyphs points + mglPoint *pt=new mglPoint[len+1]; pt[0] = qa[0]; m = qa.size(); + + // next string for testing curve position + //for(i=0;imark_plot(gr->AddPnt(qa[i],c,s,-1,-1),'.'); + mreal a,b,d,w,t1,t2; for(i=j=0,tt=0;ja*d should be here! - if(b*b>1e3*a*c) { t1 = d/(b+w); t2 = d/(b-w); } // keep precision + if(b*b>1e3*a*d) { t1 = d/(b+w); t2 = d/(b-w); } // keep precision else { t1 = (b-w)/a; t2 = (b+w)/a; } if(t1<0 || t1text_plot(gr->AddPnt(pt[j]-(pos*h)*l,c,s,-1,-1),L,font,size,0.05,c); } + gr->text_plot(gr->AddPnt(pt[j]+(pos*h)*l,c,s,-1,-1),L,font,size,0.05,c); } delete []wdt; delete []pt; delete []fnt; } //----------------------------------------------------------------------------- @@ -153,7 +148,7 @@ void mgl_textw_y(HMGL gr, HCDT y, const wchar_t *text, const char *font, const c //----------------------------------------------------------------------------- void mgl_text_xyz(HMGL gr, HCDT x, HCDT y, HCDT z,const char *text, const char *font, const char *opt) { - unsigned s = strlen(text)+1; + size_t s = strlen(text)+1; wchar_t *wcs = new wchar_t[s]; mbstowcs(wcs,text,s); mgl_textw_xyz(gr,x,y,z, wcs, font, opt); @@ -384,9 +379,9 @@ void mgl_cont_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z, mreal c, i delete []nn; delete []ff; } //----------------------------------------------------------------------------- -void mgl_cont_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z, const char *sch) +void mgl_cont_gen(HMGL gr, double val, HCDT a, HCDT x, HCDT y, HCDT z, const char *sch) { - bool text=(sch && strchr(sch,'t')); + bool text=(mglchr(sch,'t')); gr->SetPenPal(sch); mgl_cont_gen(gr,val,a,x,y,z,gr->CDef,text,0); } @@ -399,8 +394,8 @@ void mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, c gr->SaveState(opt); static int cgid=1; gr->StartGroup("Cont",cgid++); - bool text=(sch && strchr(sch,'t')); - bool fixed=(sch && strchr(sch,'_')) || (gr->Min.z==gr->Max.z); + bool text=(mglchr(sch,'t')); + bool fixed=(mglchr(sch,'_')) || (gr->Min.z==gr->Max.z); long s=gr->AddTexture(sch); gr->SetPenPal(sch); @@ -593,7 +588,7 @@ void mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT y, HCDT z, delete []kk; } //----------------------------------------------------------------------------- -void mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *c) +void mgl_contf_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *c) { gr->SetPenPal(c); mgl_contf_gen(gr,v1,v2,a,x,y,z,gr->CDef,0); @@ -608,7 +603,7 @@ void mgl_contf_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, static int cgid=1; gr->StartGroup("ContF",cgid++); long s=gr->AddTexture(sch); - bool fixed=(sch && strchr(sch,'_')) || (gr->Min.z==gr->Max.z); + bool fixed=(mglchr(sch,'_')) || (gr->Min.z==gr->Max.z); mglData xx, yy, zz(n, m); if(x->GetNx()*x->GetNy()!=m*n || y->GetNx()*y->GetNy()!=m*n) // make { @@ -709,7 +704,7 @@ void mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, gr->SaveState(opt); static int cgid=1; gr->StartGroup("ContD",cgid++); - bool fixed=(sch && strchr(sch,'_')) || (gr->Min.z==gr->Max.z); + bool fixed=(mglchr(sch,'_')) || (gr->Min.z==gr->Max.z); if(sch) for(i=0;sch[i];i++) if(strchr(MGL_COLORS,sch[i])) j++; if(j==0) sch = MGL_DEF_PAL; long s = gr->AddTexture(sch,1); @@ -727,7 +722,7 @@ void mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, x = &xx; y = &yy; } // x, y -- have the same size z - mreal z0, v0, dc = nc>1 ? 1/(MGL_EPSILON*(nc-1)) : 0; + mreal z0, v0, dc = nc>1 ? 1/(MGL_FEPSILON*(nc-1)) : 0; for(j=0;jGetNz();j++) for(i=0;iGetNx()-1;i++) { if(gr->Stop) return; @@ -828,7 +823,7 @@ void mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, gr->SaveState(opt); static int cgid=1; gr->StartGroup("ContV",cgid++); - bool fixed=(sch && strchr(sch,'_')) || (gr->Min.z==gr->Max.z); + bool fixed=(mglchr(sch,'_')) || (gr->Min.z==gr->Max.z); long s=gr->AddTexture(sch); gr->SetPenPal(sch); @@ -856,7 +851,7 @@ void mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, if(i>0) dv = v->v(i-1)-v->v(i); else if(iGetNx()-1) dv = v->v(i)-v->v(i+1); if(fixed) dv=-dv; - mgl_contv_gen(gr,v0,dv,z,x,y,&zz,gr->GetC(s,v0),j); // TODO: ContV -- change here!!! + mgl_contv_gen(gr,v0,dv,z,x,y,&zz,gr->GetC(s,v0),j); } gr->EndGroup(); } @@ -1076,7 +1071,7 @@ void mgl_get_slice_md(_mgl_slice &s, const mglData *x, const mglData *y, const m } } //----------------------------------------------------------------------------- -void mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt) { bool both = mgl_isboth(x,y,z,a); if(mgl_check_dim3(gr,both,x,y,z,a,0,"Cont3")) return; @@ -1084,10 +1079,10 @@ void mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const ch gr->SaveState(opt); static int cgid=1; gr->StartGroup("Cont3",cgid++); char dir='y'; - if(sch && strchr(sch,'x')) dir='x'; - if(sch && strchr(sch,'z')) dir='z'; + if(mglchr(sch,'x')) dir='x'; + if(mglchr(sch,'z')) dir='z'; - bool text=(sch && strchr(sch,'t')); + bool text=(mglchr(sch,'t')); long ss=gr->AddTexture(sch); gr->SetPenPal(sch); @@ -1106,7 +1101,7 @@ void mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const ch gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_cont3_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_cont3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt) { gr->SaveState(opt); mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); @@ -1117,7 +1112,7 @@ void mgl_cont3_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sVal, const c gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_cont3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_cont3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt) { mreal r = gr->SaveState(opt); long Num = mgl_isnan(r)?7:long(r+0.5); @@ -1128,7 +1123,7 @@ void mgl_cont3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mre gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_cont3(HMGL gr, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_cont3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt) { mreal r = gr->SaveState(opt); long Num = mgl_isnan(r)?7:long(r+0.5); @@ -1165,7 +1160,7 @@ void mgl_cont3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const // Dens3 series // //----------------------------------------------------------------------------- -void mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt) { bool both = mgl_isboth(x,y,z,a); if(mgl_check_dim3(gr,both,x,y,z,a,0,"Dens3")) return; @@ -1173,8 +1168,8 @@ void mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mre gr->SaveState(opt); static int cgid=1; gr->StartGroup("Dens3",cgid++); char dir='y'; - if(sch && strchr(sch,'x')) dir='x'; - if(sch && strchr(sch,'z')) dir='z'; + if(mglchr(sch,'x')) dir='x'; + if(mglchr(sch,'z')) dir='z'; _mgl_slice s; const mglData *mx = dynamic_cast(x); @@ -1184,9 +1179,10 @@ void mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mre if(mx&&my&&mz&&ma) mgl_get_slice_md(s,mx,my,mz,ma,dir,sVal,both); else mgl_get_slice(s,x,y,z,a,dir,sVal,both); mgl_surfc_xy(gr,&s.x,&s.y,&s.z,&s.a,sch,0); + gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_dens3(HMGL gr, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_dens3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt) { gr->SaveState(opt); mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); @@ -1212,7 +1208,7 @@ mgl_dens3(_GR_, _DA_(a), s, *sVal, o); delete []o; delete []s; } // Grid3 series // //----------------------------------------------------------------------------- -void mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt) { bool both = mgl_isboth(x,y,z,a); if(mgl_check_dim3(gr,both,x,y,z,a,0,"Grid3")) return; @@ -1220,8 +1216,8 @@ void mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mre gr->SaveState(opt); static int cgid=1; gr->StartGroup("Grid3",cgid++); char dir='y'; - if(sch && strchr(sch,'x')) dir='x'; - if(sch && strchr(sch,'z')) dir='z'; + if(mglchr(sch,'x')) dir='x'; + if(mglchr(sch,'z')) dir='z'; _mgl_slice s; const mglData *mx = dynamic_cast(x); @@ -1231,9 +1227,10 @@ void mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mre if(mx&&my&&mz&&ma) mgl_get_slice_md(s,mx,my,mz,ma,dir,sVal,both); else mgl_get_slice(s,x,y,z,a,dir,sVal,both); mgl_mesh_xy(gr,&s.x,&s.y,&s.z,sch,0); + gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_grid3(HMGL gr, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_grid3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt) { gr->SaveState(opt); mglData x(a->GetNx()), y(a->GetNy()), z(a->GetNz()); @@ -1259,7 +1256,7 @@ mgl_grid3(_GR_, _DA_(a), s, *sVal, o); delete []o; delete []s; } // ContF3 series // //----------------------------------------------------------------------------- -void mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt) { bool both = mgl_isboth(x,y,z,a); if(mgl_check_dim3(gr,both,x,y,z,a,0,"ContF3")) return; @@ -1267,8 +1264,8 @@ void mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const c gr->SaveState(opt); static int cgid=1; gr->StartGroup("ContF3",cgid++); char dir='y'; - if(sch && strchr(sch,'x')) dir='x'; - if(sch && strchr(sch,'z')) dir='z'; + if(mglchr(sch,'x')) dir='x'; + if(mglchr(sch,'z')) dir='z'; long ss=gr->AddTexture(sch); _mgl_slice s; @@ -1286,7 +1283,7 @@ void mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const c gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_contf3_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_contf3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt) { gr->SaveState(opt); mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); @@ -1297,7 +1294,7 @@ void mgl_contf3_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sVal, const gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_contf3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_contf3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt) { mreal r = gr->SaveState(opt); long Num = mgl_isnan(r)?7:long(r+0.5); @@ -1307,7 +1304,7 @@ void mgl_contf3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, mr gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_contf3(HMGL gr, HCDT a, const char *sch, mreal sVal, const char *opt) +void mgl_contf3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt) { mreal r = gr->SaveState(opt); long Num = mgl_isnan(r)?7:long(r+0.5); @@ -1350,7 +1347,7 @@ long mgl_find_prev(long i, long pc, long *nn) for(long k=0;kReserve(pc*82); else gr->Reserve(pc*82); + gr->Reserve(pc*82); for(i=0;iStop) return; @@ -1373,8 +1370,9 @@ void mgl_axial_plot(mglBase *gr,long pc, mglPoint *ff, long *nn,char dir,mreal c p1 = wire ? gr->AddPnt(p,cc) : gr->AddPnt(p,cc,(a*q1.y + c*q1.x)^b); p = a*ff[nn[i]].y + c*ff[nn[i]].x; p2 = wire ? gr->AddPnt(p,cc) : gr->AddPnt(p,cc,(a*q2.y + c*q2.x)^b); - if(wire) gr->line_plot(p1,p2); - + if(wire==1) gr->line_plot(p1,p2); + else if(wire) { gr->mark_plot(p1,'.'); gr->mark_plot(p2,'.'); } + for(j=1;j<41;j++) { p3 = p1; p4 = p2; @@ -1383,16 +1381,17 @@ void mgl_axial_plot(mglBase *gr,long pc, mglPoint *ff, long *nn,char dir,mreal c p1 = wire ? gr->AddPnt(p,cc) : gr->AddPnt(p,cc,(a*q1.y + b*(si*q1.x) + c*(co*q1.x))^(b*co-c*si)); p = a*ff[nn[i]].y + b*(si*ff[nn[i]].x) + c*(co*ff[nn[i]].x); p2 = wire ? gr->AddPnt(p,cc) : gr->AddPnt(p,cc,(a*q2.y + b*(si*q2.x) + c*(co*q2.x))^(b*co-c*si)); - if(wire) + if(wire==1) { gr->line_plot(p1,p2); gr->line_plot(p1,p3); gr->line_plot(p4,p2); gr->line_plot(p4,p3); } + else if(wire) { gr->mark_plot(p1,'.'); gr->mark_plot(p2,'.'); } else gr->quad_plot(p3,p4,p1,p2); } } } //----------------------------------------------------------------------------- // NOTE! All data MUST have the same size! Only first slice is used! -void mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal c, char dir,long ak,bool wire) +void mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal c, char dir,long ak,int wire) { long n=a->GetNx(), m=a->GetNy(); if(n<2 || m<2 || x->GetNx()*x->GetNy()!=n*m || y->GetNx()*y->GetNy()!=n*m) @@ -1496,8 +1495,8 @@ void mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, long s=gr->AddTexture(sch); char dir='y'; - if(sch && strchr(sch,'x')) dir = 'x'; - if(sch && strchr(sch,'z')) dir = 'z'; + if(mglchr(sch,'x')) dir = 'x'; + if(mglchr(sch,'z')) dir = 'z'; mglData xx, yy; if(x->GetNx()*x->GetNy()!=m*n || y->GetNx()*y->GetNy()!=m*n) // make @@ -1513,7 +1512,8 @@ void mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, } // x, y -- have the same size z mreal v0; - bool wire = sch && strchr(sch,'#'); + int wire = mglchr(sch,'#')?1:0; + if(mglchr(sch,'.')) wire = 2; for(j=0;jGetNz();j++) for(i=0;iGetNx();i++) { if(gr->Stop) return; @@ -1595,12 +1595,14 @@ void mgl_torus(HMGL gr, HCDT r, HCDT z, const char *sch, const char *opt) long *nn = new long[n]; long ss=gr->AddTexture(sch); char dir='y'; - if(sch && strchr(sch,'x')) dir = 'x'; - if(sch && strchr(sch,'z')) dir = 'z'; + if(mglchr(sch,'x')) dir = 'x'; + if(mglchr(sch,'z')) dir = 'z'; mreal c = gr->GetC(ss,gr->Min.c); const mglData *mr = dynamic_cast(r); const mglData *mz = dynamic_cast(z); + int wire = mglchr(sch,'#')?1:0; + if(mglchr(sch,'.')) wire = 2; for(j=0;jGetNy();j++) { if(mr&&mz) for(i=0;iv(i,j), z->v(i,j)); } - mgl_axial_plot(gr,n,pp,nn,dir,c,sch && strchr(sch,'#')); + mgl_axial_plot(gr,n,pp,nn,dir,c,wire); } gr->EndGroup(); delete []nn; delete []pp; diff --git a/src/crust.cpp b/src/crust.cpp index 5903b47..2877c19 100644 --- a/src/crust.cpp +++ b/src/crust.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * crust.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -31,12 +31,12 @@ void mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const if(mgl_check_trig(gr,nums,x,y,z,a,"TriPlot")) return; long ss=gr->AddTexture(sch); - gr->SaveState(opt); + gr->SaveState(opt); gr->SetPenPal("-"); static int cgid=1; gr->StartGroup("TriPlot",cgid++); mglPoint p1,p2,p3,q=mglPoint(NAN,NAN); register long i,k1,k2,k3; - bool wire = sch && strchr(sch,'#'); + bool wire = mglchr(sch,'#'); long nc = a->GetNx(); if(nc!=n && nc>=m) // colors per triangle { @@ -141,13 +141,13 @@ void mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const if(mgl_check_trig(gr,nums,x,y,z,a,"QuadPlot",4)) return; long ss=gr->AddTexture(sch); - gr->SaveState(opt); + gr->SaveState(opt); gr->SetPenPal("-"); static int cgid=1; gr->StartGroup("QuadPlot",cgid++); mglPoint p1,p2,p3,p4,q=mglPoint(NAN,NAN); register long i,k1,k2,k3,k4; long nc = a->GetNx(); - bool wire = sch && strchr(sch,'#'); + bool wire = mglchr(sch,'#'); if(nc!=n && nc>=m) // colors per triangle { gr->Reserve(m*4); @@ -281,7 +281,7 @@ void mgl_tricont_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT mreal val; register long i,k; long k1,k2,k3; - bool zVal = (sch && strchr(sch,'_')); + bool zVal = (mglchr(sch,'_')); for(k=0;kGetNx();k++) for(i=0;iStop) return; @@ -407,6 +407,7 @@ HMDT mgl_triangulation_2d(HCDT x, HCDT y) if(y->GetNx()!=n) return nums; // use s-hull here std::vector pts; + std::vector out; Shx pt; for(i=0;i triads; + if(de_duplicate(pts, out)) + mglGlobalMess += "There are duplicated points for triangulation.\n"; s_hull_pro(pts, triads); m = triads.size(); nums->Create(3,m); @@ -480,9 +483,9 @@ void mgl_data_grid(HMGL gr, HMDT d, HCDT xdat, HCDT ydat, HCDT zdat, const char const mglData *x = dynamic_cast(xdat); const mglData *y = dynamic_cast(ydat); const mglData *z = dynamic_cast(zdat); - if(!x | !y | !z) return; + if(!x || !y || !z) return; long n=x->nx; - if((n<3) | (y->nx!=n) | (z->nx!=n)) return; + if((n<3) || (y->nx!=n) || (z->nx!=n)) return; gr->SaveState(opt); mglData *nums = mgl_triangulation_2d(x,y); diff --git a/src/data.cpp b/src/data.cpp index 2d9bf5b..90cb1c8 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -54,8 +54,9 @@ void mgl_set_num_thr(int n) void mgl_set_num_thr(int) { mglNumThr = 1; } #endif //----------------------------------------------------------------------------- -void mglStartThread(void *(*func)(void *), void (*post)(mglThreadD *,mreal *), long n, mreal *a, - const mreal *b, const mreal *c, const long *p, void *v, const mreal *d, const mreal *e, const char *s) +void mglStartThread(void *(*func)(void *), void (*post)(mglThreadD *,mreal *), long n, + mreal *a, const mreal *b, const mreal *c, const long *p, + const void *v, const mreal *d, const mreal *e, const char *s) { if(!func) return; #if MGL_HAVE_PTHREAD @@ -85,6 +86,35 @@ void mglStartThread(void *(*func)(void *), void (*post)(mglThreadD *,mreal *), l } } //----------------------------------------------------------------------------- +void mglStartThreadV(void *(*func)(void *), long n, mreal *a, const void *b, + const void *c, const long *p, const void *v, const mreal *d) +{ + if(!func) return; +#if MGL_HAVE_PTHREAD + if(mglNumThr<1) mgl_set_num_thr(0); + if(mglNumThr>1) + { + pthread_t *tmp=new pthread_t[mglNumThr]; + mglThreadV *par=new mglThreadV[mglNumThr]; + register long i; + for(i=0;inx,ny=d->ny,nz=d->nz,nn=nx*ny*nz; long p[3]={nx,ny,nz}; mreal *b = new mreal[nn]; @@ -317,6 +349,7 @@ void *mgl_int_x(void *par) } void mgl_data_integral(HMDT d, const char *dir) { + if(!dir || *dir==0) return; long nx=d->nx,ny=d->ny,nz=d->nz,nn=nx*ny*nz; long p[3]={nx,ny,nz}; mreal *b = new mreal[nn]; @@ -388,6 +421,7 @@ void *mgl_dif_x(void *par) } void mgl_data_diff(HMDT d, const char *dir) { + if(!dir || *dir==0) return; long nx=d->nx,ny=d->ny,nz=d->nz,nn=nx*ny*nz; long p[3]={nx,ny,nz}; mreal *b = new mreal[nn]; @@ -453,6 +487,7 @@ void *mgl_dif2_x(void *par) } void mgl_data_diff2(HMDT d, const char *dir) { + if(!dir || *dir==0) return; long nx=d->nx,ny=d->ny,nz=d->nz,nn=nx*ny*nz; long p[3]={nx,ny,nz}; mreal *b = new mreal[nn]; @@ -479,6 +514,7 @@ void mgl_data_diff2_(uintptr_t *d, const char *dir,int l) //----------------------------------------------------------------------------- void mgl_data_swap(HMDT d, const char *dir) { + if(!dir || *dir==0) return; if(strchr(dir,'z') && d->nz>1) mgl_data_roll(d,'z',d->nz/2); if(strchr(dir,'y') && d->ny>1) mgl_data_roll(d,'y',d->ny/2); if(strchr(dir,'x') && d->nx>1) mgl_data_roll(d,'x',d->nx/2); @@ -527,6 +563,7 @@ void mgl_data_roll_(uintptr_t *d, const char *dir, int *num, int) //----------------------------------------------------------------------------- void mgl_data_mirror(HMDT d, const char *dir) { + if(!dir || *dir==0) return; long nx=d->nx,ny=d->ny,nz=d->nz; register long i,j,k,i0,j0; mreal b, *a=d->a; @@ -564,10 +601,242 @@ void mgl_data_mirror_(uintptr_t *d, const char *dir,int l) { char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; mgl_data_mirror(_DT_,s); delete []s; } //----------------------------------------------------------------------------- -mreal mgl_data_linear(HCDT d, mreal x,mreal y,mreal z) +void mgl_data_clean(HMDT d, long id) +{ + if(id<0 || id+1>d->nx) return; + register long i,j,k,n=d->nx,m=d->ny; + mreal *b = new mreal[m*n], *a=d->a; + for(i=j=0;i+1ny = j; + delete []b; +} +void mgl_data_clean_(uintptr_t *d, int *id) { mgl_data_clean(_DT_,*id); } +//----------------------------------------------------------------------------- +void *mgl_solve_x(void *par) +{ + mglThreadD *t=(mglThreadD *)par; + register long l,i,i0,j,k, nx=t->p[0], ny=t->p[1], nz=t->p[2], n1=t->p[3]?nx-1:1, nn=t->n; + const mreal *a=t->b, *ii=t->c; + mreal *b=t->a,x,val=t->d[0],y1,y2,v,v0,dx,dy,dz,da = 1e-5*(val?fabs(val):1); + for(l=t->id;lnx-2) continue; + if(a) for(i=i0+1;ida || dx==0) + { + x += (val-v)/dx; kk++; + v = mglSpline3(a,nx,ny,nz,x,j,k, &dx,&dy,&dz); + if(kk>=10) + { + b[l] = x = fabs(v-val)v; + y1=d->v(i-1,j,k); y2=d->v(i,j,k); + if(val==y1) { b[l] = i-1; break; } + if(val==y2) { b[l] = i; break; } + if((y1-val)*(y2-val)<0) + { b[l] = i-1 + (val-y1)/(y2-y1); break; } + } + b[l] /= n1; + } + return 0; +} +void *mgl_solve_y(void *par) +{ + mglThreadD *t=(mglThreadD *)par; + register long l,i,i0,j,k, nx=t->p[0], ny=t->p[1], nz=t->p[2], n1=t->p[3]?ny-1:1, nn=t->n; + const mreal *a=t->b, *ii=t->c; + mreal *b=t->a,x,val=t->d[0],y1,y2,v,v0,dx,dy,dz,da = 1e-5*(val?fabs(val):1); + for(l=t->id;lny-2) continue; + if(a) for(i=i0+1;ida || dy==0) + { + x += (val-v)/dy; kk++; + v = mglSpline3(a,nx,ny,nz,j,x,k, &dx,&dy,&dz); + if(kk>=10) + { + b[l] = x = fabs(v-val)v; + y1=d->v(j,i-1,k); y2=d->v(j,i,k); + if(val==y1) { b[l] = i-1; break; } + if(val==y2) { b[l] = i; break; } + if((y1-val)*(y2-val)<0) + { b[l] = i-1 + (val-y1)/(y2-y1); break; } + } + b[l] /= n1; + } + return 0; +} +void *mgl_solve_z(void *par) +{ + mglThreadD *t=(mglThreadD *)par; + register long l,i,i0,j,k, nx=t->p[0], ny=t->p[1], nz=t->p[2], n1=t->p[3]?nz-1:1, nn=t->n; + const mreal *a=t->b, *ii=t->c; + mreal *b=t->a,x,val=t->d[0],y1,y2,v,v0,dx,dy,dz,da = 1e-5*(val?fabs(val):1); + for(l=t->id;lnz-2) continue; + if(a) for(i=i0+1;ida || dz==0) + { + x += (val-v)/dz; kk++; + v = mglSpline3(a,nx,ny,nz,j,k,x, &dx,&dy,&dz); + if(kk>=10) + { + b[l] = x = fabs(v-val)v; + y1=d->v(j,k,i-1); y2=d->v(j,k,i); + if(val==y1) { b[l] = i-1; break; } + if(val==y2) { b[l] = i; break; } + if((y1-val)*(y2-val)<0) + { b[l] = i-1 + (val-y1)/(y2-y1); break; } + } + b[l] /= n1; + } + return 0; +} +HMDT mgl_data_solve(HCDT dat, mreal val, char dir, HCDT i0, int norm) +{ + const mglData *i = dynamic_cast(i0); + const mglData *d = dynamic_cast(dat); + long p[4]={dat->GetNx(), dat->GetNy(), dat->GetNz(), norm}; + const mreal *ii=0; + mglData *r=new mglData; + if(dir=='x' && p[0]>1) + { + r->Create(p[1],p[2]); + if(i && i->nx*i->ny==p[1]*p[2]) ii = i->a; + mglStartThread(mgl_solve_x,0,p[1]*p[2],r->a,d?d->a:0,ii,p,dat,&val); + } + if(dir=='y' && p[1]>1) + { + r->Create(p[0],p[2]); + if(i && i->nx*i->ny==p[0]*p[2]) ii = i->a; + mglStartThread(mgl_solve_y,0,p[0]*p[2],r->a,d?d->a:0,ii,p,dat,&val); + } + if(dir=='z' && p[2]>1) + { + r->Create(p[0],p[1]); + if(i && i->nx*i->ny==p[0]*p[1]) ii = i->a; + mglStartThread(mgl_solve_z,0,p[0]*p[1],r->a,d?d->a:0,ii,p,dat,&val); + } + return r; +} +//----------------------------------------------------------------------------- +mreal mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0) +{ + mreal x=0, y1, y2, a, a0, dx=0,dy,dz, da = 1e-5*(val?fabs(val):1); + long nx = d->GetNx(); + if(i0<0 || i0>=nx) i0=0; + const mglData *dd=dynamic_cast(d); + if(dd) for(long i=i0+1;ia[i-1]; y2=dd->a[i]; + if(val==y1) return i-1; + if(val==y2) return i; + if((y1-val)*(y2-val)<0) + { + x = i-1 + (val-y1)/(y2-y1); + a0 = a = mgl_data_spline_ext(d, x,0,0, &dx,&dy,&dz); + unsigned k=0; + if(spl) while(fabs(a-val)>da || dx==0) + { + x += (val-a)/dx; k++; + a = mgl_data_spline_ext(d, x,0,0, &dx,&dy,&dz); + if(k>=10) + return fabs(a-val)v(i-1); y2=d->v(i); + if(val==y1) return i-1; + if(val==y2) return i; + if((y1-val)*(y2-val)<0) + return i-1 + (val-y1)/(y2-y1); + + } + return NAN; +} +//----------------------------------------------------------------------------- +mreal mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz) { long kx=long(x), ky=long(y), kz=long(z); mreal b0,b1; + bool dif = (dx && dy && dz); const mglData *dd=dynamic_cast(d); if(dd) { @@ -580,8 +849,10 @@ mreal mgl_data_linear(HCDT d, mreal x,mreal y,mreal z) z -= kz; if(nz==1) z=0; const mreal *aa=dd->a+kx+nx*(ky+ny*kz), *bb = aa+(nz>1?nx*ny:0); - b0 = aa[0]*(1-x-y+x*y) + x*(1-y)*aa[1] + y*(1-x)*aa[dn] + x*y*aa[1+dn]; - b1 = bb[0]*(1-x-y+x*y) + x*(1-y)*bb[1] + y*(1-x)*bb[dn] + x*y*bb[1+dn]; + b0 = x||y ? aa[0]*(1-x-y+x*y) + x*(1-y)*aa[1] + y*(1-x)*aa[dn] + x*y*aa[1+dn] : aa[0]; + b1 = x||y ? bb[0]*(1-x-y+x*y) + x*(1-y)*bb[1] + y*(1-x)*bb[dn] + x*y*bb[1+dn] : bb[0]; + if(dif) + { *dx = aa[1]-aa[0]; *dy = aa[dn]-aa[0]; *dz = bb[0]-aa[0]; } } else { @@ -591,15 +862,22 @@ mreal mgl_data_linear(HCDT d, mreal x,mreal y,mreal z) kz = (kz>=0 ? (kzv(kx,ky,kz)*(1-x-y+x*y) + x*(1-y)*d->v(kx+1,ky,kz) + - y*(1-x)*d->v(kx,ky+1,kz) + x*y*d->v(kx+1,ky+1,kz); + mreal a0 = d->v(kx,ky,kz), a1 = d->v(kx+1,ky,kz), a2 = d->v(kx,ky+1,kz); + if(dif) { *dx = a1-a0; *dy = a2-a0; *dz = -a0; } + if(x||y) b0 = a0*(1-x-y+x*y) + x*(1-y)*a1 + y*(1-x)*a2 + x*y*d->v(kx+1,ky+1,kz); + else b0 = a0; kz++; - b1 = d->v(kx,ky,kz)*(1-x-y+x*y) + x*(1-y)*d->v(kx+1,ky,kz) + - y*(1-x)*d->v(kx,ky+1,kz) + x*y*d->v(kx+1,ky+1,kz); + a0 = d->v(kx,ky,kz); a1 = d->v(kx+1,ky,kz); a2 = d->v(kx,ky+1,kz); + if(dif) *dz += a0; + if(x||y) b1 = a0*(1-x-y+x*y) + x*(1-y)*a1 + y*(1-x)*a2 + x*y*d->v(kx+1,ky+1,kz); + else b1 = a0; } return b0 + z*(b1-b0); } //----------------------------------------------------------------------------- +mreal mgl_data_linear(HCDT d, mreal x,mreal y,mreal z) +{ return mgl_data_linear_ext(d, x,y,z, 0,0,0); } +//----------------------------------------------------------------------------- mreal mgl_data_spline(HCDT d, mreal x,mreal y,mreal z) { const mglData *dd=dynamic_cast(d); @@ -607,6 +885,26 @@ mreal mgl_data_spline(HCDT d, mreal x,mreal y,mreal z) return mglSpline3(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,0,0,0); } //----------------------------------------------------------------------------- +mreal mgl_data_spline_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz) +{ + const mglData *dd=dynamic_cast(d); + if(!d) return 0; // NOTE: don't support general arrays + return mglSpline3(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz); +} +//----------------------------------------------------------------------------- +mreal mgl_data_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +{ return mgl_data_spline(_DA_(d),*x,*y,*z); } +mreal mgl_data_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +{ return mgl_data_linear(_DA_(d),*x,*y,*z); } +mreal mgl_data_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz) +{ return mgl_data_spline_ext(_DA_(d),*x,*y,*z,dx,dy,dz); } +mreal mgl_data_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz) +{ return mgl_data_linear_ext(_DA_(d),*x,*y,*z,dx,dy,dz); } +mreal mgl_data_solve_1d_(uintptr_t *d, mreal *val, int *spl, int *i0) +{ return mgl_data_solve_1d(_DA_(d),*val, *spl, *i0); } +uintptr_t mgl_data_solve_(uintptr_t *d, mreal *val, const char *dir, uintptr_t *i0, int *norm,int) +{ return uintptr_t(mgl_data_solve(_DA_(d),*val, *dir, _DA_(i0), *norm)); } +//----------------------------------------------------------------------------- mreal mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx, mreal *dy, mreal *dz) { if(!a || nx<1 || ny<1 || nz<1) return 0; @@ -621,13 +919,12 @@ mreal mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mr z = z>0 ?(znx-1 || y>ny-1 || z>nz-1) return 0; if(dd) { *dx=*dy=*dz=0; } + if(kx>nx-2) kx = nx-2; if(kx<0) kx = 0; + if(ky>ny-2) ky = ny-2; if(ky<0) ky = 0; + if(kz>nz-2) kz = nz-2; if(kz<0) kz = 0; if(nz>1 && z!=kz) // 3d interpolation - { // TODO: add dx,dy,dz evaluation - mreal b1[4]={0,0,0,0}; - if(kx>nx-2) kx = nx-2; - if(ky>ny-2) ky = ny-2; - if(kz>nz-2) kz = nz-2; - + { + mreal b1[4]={0,0,0,0}, x1[4]={0,0,0,0}, y1[4]={0,0,0,0}; long kk=1; if(kz==0) { kk=0; } else if(nz>3 && kz==nz-2) { kk=2; } @@ -637,18 +934,32 @@ mreal mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mr for(i=0,fx=1;i<4;i++) { for(j=0,fy=1;j<4;j++) - { b1[k] += fy*fx*_p[i][j]; fy *= y-ky; } + { + b1[k] += fy*fx*_p[i][j]; + x1[k] += i*fy*fx*_p[i][j]; + y1[k] += j*fy*fx*_p[i][j]; + fy *= y-ky; + } fx *= x-kx; } } mglFillP(kk, b1, nz>3 ? 4:3, _p[0]); + mglFillP(kk, x1, nz>3 ? 4:3, _p[1]); + mglFillP(kk, y1, nz>3 ? 4:3, _p[2]); for(i=0,fx=1,b=0;i<4;i++) - { b += fx*_p[0][i]; fx *= z-kz; } + { + b += fx*_p[0][i]; + if(dd) + { + *dx += fx*_p[1][i]; + *dy += fx*_p[2][i]; + *dz += i*fx*_p[0][i]; + } + fx *= z-kz; + } } else if(ny>1 && y!=ky) // 2d interpolation { - if(kx>nx-2) kx = nx-2; - if(ky>ny-2) ky = ny-2; mglFillP(kx, ky, a+kz*nx*ny, nx, ny, _p); fx = 1; b = 0; for(i=0;i<4;i++) @@ -670,7 +981,6 @@ mreal mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mr } else if(nx>1 && x!=kx) // 1d interpolation { - if(kx>nx-2) kx = nx-2; mglFillP(kx, a+(ky+ny*kz)*nx, nx, _p[0]); for(i=0,fx=1,b=0;i<4;i++) { @@ -827,11 +1137,6 @@ void mglFillP(long x, const mreal *a,long nx,mreal _p[4]) _p[3]=s[0]+s[1]+2*(f[0]-f[1]); } //----------------------------------------------------------------------------- -mreal mgl_data_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) -{ return mgl_data_spline(_DA_(d),*x,*y,*z); } -mreal mgl_data_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) -{ return mgl_data_linear(_DA_(d),*x,*y,*z); } -//----------------------------------------------------------------------------- void mgl_data_crop(HMDT d, long n1, long n2, char dir) { long nx=d->nx,ny=d->ny,nz=d->nz, nn; @@ -1329,6 +1634,7 @@ void *mgl_sew_x(void *par) } void mgl_data_sew(HMDT d, const char *dirs, mreal delta) { + if(!dirs || *dirs==0) return; long nx=d->nx, ny=d->ny, nz=d->nz; long p[3]={nx,ny,nz}; mreal da = delta; @@ -1622,3 +1928,10 @@ mreal *mgl_data_value(HMDT dat, long i,long j,long k) { register long ii=i*dat->nx*(j+dat->ny*k); return ii>=0 && iiGetNN() ? dat->a+ii : 0; } //----------------------------------------------------------------------------- +long mgl_data_get_nx(HCDT dat) { return dat->GetNx(); } +long mgl_data_get_ny(HCDT dat) { return dat->GetNy(); } +long mgl_data_get_nz(HCDT dat) { return dat->GetNz(); } +long mgl_data_get_nx_(uintptr_t *d) { return _DA_(d)->GetNx(); } +long mgl_data_get_ny_(uintptr_t *d) { return _DA_(d)->GetNy(); } +long mgl_data_get_nz_(uintptr_t *d) { return _DA_(d)->GetNz(); } +//----------------------------------------------------------------------------- diff --git a/src/data_io.cpp b/src/data_io.cpp index 2f87f5e..976e7f7 100644 --- a/src/data_io.cpp +++ b/src/data_io.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data_io.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -27,6 +27,8 @@ #include "mgl2/eval.h" #if MGL_HAVE_HDF5 +//#define H5_NO_DEPRECATED_SYMBOLS +#define H5_USE_16_API #include #endif #if MGL_HAVE_HDF4 @@ -44,14 +46,14 @@ HMDT mgl_create_data_file(const char *fname) { return new mglData(fname); } void mgl_delete_data(HMDT d) { if(d) delete d; } //----------------------------------------------------------------------------- uintptr_t mgl_create_data_() -{ return uintptr_t(new mglData()); }; +{ return uintptr_t(new mglData()); } uintptr_t mgl_create_data_size_(int *nx, int *ny, int *nz) -{ return uintptr_t(new mglData(*nx,*ny,*nz)); }; +{ return uintptr_t(new mglData(*nx,*ny,*nz)); } uintptr_t mgl_create_data_file_(const char *fname,int l) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; uintptr_t r = uintptr_t(new mglData(s)); delete []s; return r; } void mgl_delete_data_(uintptr_t *d) -{ if(_DT_) delete _DT_; }; +{ if(_DT_) delete _DT_; } //----------------------------------------------------------------------------- void mglFromStr(HMDT d,char *buf,long NX,long NY,long NZ) // TODO: add multithreading read { @@ -78,7 +80,7 @@ void mglFromStr(HMDT d,char *buf,long NX,long NY,long NZ) // TODO: add multithre while(buf[j]<=' ' && j' ' && buf[j]!=',' && j' ' && buf[j]!=',' && buf[j]!=';' && ja[i] = atof(s); i++; if(i>=NX*NY*NZ) break; @@ -245,20 +247,20 @@ void mgl_data_save(HCDT d, const char *fname,long ns) register long i,j,k; long nx=d->GetNx(), ny=d->GetNy(), nz=d->GetNz(); if(ns<0 || (ns>=nz && nz>1)) for(k=0;kv(j,i,k)); - fprintf(fp,"\n"); + for(j=0;jv(j,i,k)); + fprintf(fp,"%g\n",d->v(nx-1,i,k)); } fprintf(fp,"\n"); } else - { // ñîõðàíÿåì òîëüêî ñðåç + { // save selected slice if(nz>1) for(i=0;iv(j,i,ns)); - fprintf(fp,"\n"); + for(j=0;jv(j,i,ns)); + fprintf(fp,"%g\n",d->v(nx-1,i,ns)); } else if(nsv(j,ns)); @@ -303,7 +305,7 @@ int mgl_data_read(HMDT d, const char *fname) while(buf[i]=='#') { while(!isn(buf[i]) && i' ' && !first) first=true; - if(first && (ch==' ' || ch=='\t' || ch==',') && buf[i+1]>' ') k++; + if(first && (ch==' ' || ch=='\t' || ch==',' || ch==';') && buf[i+1]>' ') k++; } first = false; for(i=0;i' ' && !first) first=true; - if(first && (ch==' ' || ch=='\t' || ch==',') && b[i+1]>' ') nx++; + if(first && (ch==' ' || ch=='\t' || ch==',' || ch==';') && b[i+1]>' ') nx++; } } } @@ -637,7 +639,7 @@ void mgl_data_squeeze(HMDT d, long rx,long ry,long rz,long smooth) mreal s = 0; for(k1=k*rz;k1a[i1+nx*(j1+ny*k1)]; - b[i+kx*(j+ky*k)] = s/dx*dy*dz; + b[i+kx*(j+ky*k)] = s/(dx*dy*dz); } if(!d->link) delete [](d->a); d->a=b; d->nx = kx; d->ny = ky; d->nz = kz; d->NewId(); d->link=false; @@ -729,7 +731,7 @@ void mgl_data_transpose_(uintptr_t *d, const char *dim,int l) void *mgl_modify(void *par) { mglThreadD *t=(mglThreadD *)par; - mglFormula *f = (mglFormula *)(t->v); + const mglFormula *f = (const mglFormula *)(t->v); register long i,j,k,i0, nx=t->p[0],ny=t->p[1],nz=t->p[2]; mreal *b=t->a, dx,dy,dz; const mreal *v=t->b, *w=t->c; @@ -761,18 +763,34 @@ void mgl_data_modify_(uintptr_t *d, const char *eq,int *dim,int l) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; mgl_data_modify(_DT_,s,*dim); delete []s; } //----------------------------------------------------------------------------- +void *mgl_modify_gen(void *par) +{ + mglThreadV *t=(mglThreadV *)par; + const mglFormula *f = (const mglFormula *)(t->v); + register long i,j,k,i0, nx=t->p[0],ny=t->p[1],nz=t->p[2]; + mreal *b=t->a, dx,dy,dz; + HCDT v=(HCDT)t->b, w=(HCDT)t->c; + dx=nx>1?1/(nx-1.):0; dy=ny>1?1/(ny-1.):0; dz=nz>1?1/(nz-1.):0; + for(i0=t->id;i0n;i0+=mglNumThr) + { + i=i0%nx; j=((i0/nx)%ny); k=i0/(nx*ny); + b[i0] = f->Calc(i*dx, j*dy, k*dz, b[i0], v?v->vthr(i0):0, w?w->vthr(i0):0); + } + return 0; +} void mgl_data_modify_vw(HMDT d, const char *eq,HCDT vdat,HCDT wdat) -{ // NOTE: only for mglData +{ const mglData *v = dynamic_cast(vdat); const mglData *w = dynamic_cast(wdat); long nn = d->nx*d->ny*d->nz, par[3]={d->nx,d->ny,d->nz}; + if(vdat && vdat->GetNN()!=nn) return; + if(wdat && wdat->GetNN()!=nn) return; mglFormula f(eq); - if(v && w && v->nx*v->ny*v->nz==nn && w->nx*w->ny*w->nz==nn) - mglStartThread(mgl_modify,0,nn,d->a,v->a,w->a,par,&f); - else if(v && v->nx*v->ny*v->nz==nn) - mglStartThread(mgl_modify,0,nn,d->a,v->a,0,par,&f); - else - mglStartThread(mgl_modify,0,nn,d->a,0,0,par,&f); + if(v && w) mglStartThread(mgl_modify,0,nn,d->a,v->a,w->a,par,&f); + else if(vdat && wdat) mglStartThreadV(mgl_modify_gen,nn,d->a,vdat,wdat,par,&f); + else if(v) mglStartThread(mgl_modify,0,nn,d->a,v->a,0,par,&f); + else if(vdat) mglStartThreadV(mgl_modify_gen,nn,d->a,vdat,0,par,&f); + else mglStartThread(mgl_modify,0,nn,d->a,0,0,par,&f); } void mgl_data_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w,int l) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; @@ -781,7 +799,7 @@ void mgl_data_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t * void *mgl_fill_f(void *par) { mglThreadD *t=(mglThreadD *)par; - mglFormula *f = (mglFormula *)(t->v); + const mglFormula *f = (const mglFormula *)(t->v); register long i,j,k,i0, nx=t->p[0],ny=t->p[1]; mreal *b=t->a; const mreal *v=t->b, *w=t->c, *x=t->d; @@ -792,20 +810,39 @@ void *mgl_fill_f(void *par) } return 0; } +void *mgl_fill_fgen(void *par) +{ + mglThreadD *t=(mglThreadD *)par; + const mglFormula *f = (const mglFormula *)(t->v); + register long i,j,k,i0, nx=t->p[0],ny=t->p[1]; + mreal *b=t->a; + HCDT v=(HCDT)t->b, w=(HCDT)t->c; + const mreal *x=t->d; + for(i0=t->id;i0n;i0+=mglNumThr) + { + i=i0%nx; j=((i0/nx)%ny); k=i0/(nx*ny); + b[i0] = f->Calc(x[0]+i*x[1], x[2]+j*x[3], x[4]+k*x[5], b[i0], v?v->vthr(i0):0, w?w->vthr(i0):0); + } + return 0; +} void mgl_data_fill_eq(HMGL gr, HMDT d, const char *eq, HCDT vdat, HCDT wdat, const char *opt) -{ // NOTE: only for mglData +{ const mglData *v = dynamic_cast(vdat); const mglData *w = dynamic_cast(wdat); long nn = d->nx*d->ny*d->nz, par[3]={d->nx,d->ny,d->nz}; - if(v && v->nx*v->ny*v->nz!=nn) return; - if(w && w->nx*w->ny*w->nz!=nn) return; + if(vdat && vdat->GetNN()!=nn) return; + if(wdat && wdat->GetNN()!=nn) return; gr->SaveState(opt); mreal xx[6]={gr->Min.x,0, gr->Min.y,0, gr->Min.z,0}; if(d->nx>1) xx[1] = (gr->Max.x-gr->Min.x)/(d->nx-1.); if(d->ny>1) xx[3] = (gr->Max.y-gr->Min.y)/(d->ny-1.); if(d->nz>1) xx[5] = (gr->Max.z-gr->Min.z)/(d->nz-1.); mglFormula f(eq); - mglStartThread(mgl_fill_f,0,nn,d->a,v?v->a:0,w?w->a:0,par,&f,xx); + if(v && w) mglStartThread(mgl_fill_f,0,nn,d->a,v->a,w->a,par,&f,xx); + else if(vdat && wdat) mglStartThreadV(mgl_fill_fgen,nn,d->a,vdat,wdat,par,&f,xx); + else if(v) mglStartThread(mgl_fill_f,0,nn,d->a,v->a,0,par,&f,xx); + else if(vdat) mglStartThreadV(mgl_fill_fgen,nn,d->a,vdat,0,par,&f,xx); + else mglStartThread(mgl_fill_f,0,nn,d->a,0,0,par,&f,xx); gr->LoadState(); } void mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w, const char *opt,int l,int lo) @@ -814,10 +851,10 @@ void mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, uintptr_t *v mgl_data_fill_eq(_GR_,_DT_,s,_DA_(v),_DA_(w),o); delete []o; delete []s; } //----------------------------------------------------------------------------- #if MGL_HAVE_HDF4 -void mgl_data_read_hdf4(HMDT d,const char *fname,const char *data) +int mgl_data_read_hdf4(HMDT d,const char *fname,const char *data) { int32 sd = SDstart(fname,DFACC_READ), nn, i; - if(sd==-1) return; // is not a HDF4 file + if(sd==-1) return false; // is not a HDF4 file char name[64]; SDfileinfo(sd,&nn,&i); for(i=0;i(dat); // NOTE: only for mglData + if(!d) { mglData d(dat); mgl_data_save_hdf(&d,fname,data,rewrite); return; } hid_t hf,hd,hs; hsize_t dims[3]; long rank = 3, res; -#if MGL_HAVE_HDF5_18 - H5Eset_auto(H5E_DEFAULT,0,0); -#else H5Eset_auto(0,0); -#endif res=H5Fis_hdf5(fname); if(res>0 && !rewrite) hf = H5Fopen(fname, H5F_ACC_RDWR, H5P_DEFAULT); else hf = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); @@ -879,11 +915,7 @@ void mgl_data_save_hdf(HCDT dat,const char *fname,const char *data,int rewrite) #else hid_t mem_type_id = H5T_NATIVE_FLOAT; #endif -#if MGL_HAVE_HDF5_18 - hd = H5Dcreate(hf, data, mem_type_id, hs, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); -#else hd = H5Dcreate(hf, data, mem_type_id, hs, H5P_DEFAULT); -#endif H5Dwrite(hd, mem_type_id, hs, hs, H5P_DEFAULT, d->a); H5Dclose(hd); H5Sclose(hs); H5Fclose(hf); } @@ -893,14 +925,10 @@ int mgl_data_read_hdf(HMDT d,const char *fname,const char *data) hid_t hf,hd,hs; hsize_t dims[3]; long rank, res = H5Fis_hdf5(fname); - if(res<=0) { mgl_data_read_hdf4(d,fname,data); return false; } + if(res<=0) return mgl_data_read_hdf4(d,fname,data); hf = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT); if(hf<0) return false; -#if MGL_HAVE_HDF5_18 - hd = H5Dopen(hf,data,H5P_DEFAULT); -#else hd = H5Dopen(hf,data); -#endif if(hd<0) return false; hs = H5Dget_space(hd); rank = H5Sget_simple_extent_ndims(hs); @@ -927,24 +955,16 @@ int mgl_datas_hdf(const char *fname, char *buf, long size) buf[0]=0; hf = H5Fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT); if(!hf) return 0; -#if MGL_HAVE_HDF5_18 - hg = H5Gopen(hf,"/",H5P_DEFAULT); -#else hg = H5Gopen(hf,"/"); -#endif hsize_t num, i; char name[256]; long pos=0,len; - H5Gget_num_objs(hg, &num); + H5Gget_num_objs(hg, &num); // replace by H5G_info_t t; H5Gget_info(hg,&t); num=t.nlinks; for(i=0;isize) break; if(H5Tget_class(ht)==H5T_FLOAT || H5Tget_class(ht)==H5T_INTEGER) @@ -955,9 +975,12 @@ int mgl_datas_hdf(const char *fname, char *buf, long size) return i; } #else -void mgl_data_save_hdf(HCDT ,const char *,const char *,int ){} -int mgl_datas_hdf(const char *, char *, long ){return 0;} -int mgl_data_read_hdf(HMDT ,const char *,const char *){return false;} +void mgl_data_save_hdf(HCDT ,const char *,const char *,int ) +{ mglGlobalMess += "HDF5 support was disabled. Please, enable it and rebuild MathGL.\n"; } +int mgl_datas_hdf(const char *, char *, long ) +{ mglGlobalMess += "HDF5 support was disabled. Please, enable it and rebuild MathGL.\n"; return 0;} +int mgl_data_read_hdf(HMDT ,const char *,const char *) +{ mglGlobalMess += "HDF5 support was disabled. Please, enable it and rebuild MathGL.\n"; return false;} #endif //----------------------------------------------------------------------------- int mgl_data_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n) @@ -1034,7 +1057,7 @@ int mgl_data_read_range(HMDT dat, const char *templ, double from, double to, dou delete []fname; free(b); return true; } -int mgl_data_read_range_(uintptr_t *d, const char *fname, double *from, double *to, double *step, int *as_slice,int l) +int mgl_data_read_range_(uintptr_t *d, const char *fname, mreal *from, mreal *to, mreal *step, int *as_slice,int l) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; int r = mgl_data_read_range(_DT_,s,*from,*to,*step,*as_slice); delete []s; return r; } //----------------------------------------------------------------------------- @@ -1043,7 +1066,7 @@ int mgl_data_read_all(HMDT dat, const char *templ, int as_slice) #ifndef WIN32 mglData d; glob_t res; - unsigned long i; + size_t i; mreal *b; long kx,ky,kz; char *fname = new char[256]; diff --git a/src/data_new.cpp b/src/data_new.cpp index 74cc59a..1d33492 100644 --- a/src/data_new.cpp +++ b/src/data_new.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data_new.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -193,7 +193,7 @@ uintptr_t mgl_data_subdata_ext_(uintptr_t *d, uintptr_t *xx, uintptr_t *yy, uint void *mgl_column(void *par) { mglThreadD *t=(mglThreadD *)par; - mglFormula *f = (mglFormula *)t->v; + const mglFormula *f = (const mglFormula *)t->v; register long i,j, nx=t->p[0]; mreal *b=t->a, var[MGL_VS]; const mreal *a=t->b; @@ -327,6 +327,7 @@ void *mgl_sum_x(void *par) } HMDT mgl_data_sum(HCDT dat, const char *dir) { + if(!dir || *dir==0) return 0; long nx=dat->GetNx(),ny=dat->GetNy(),nz=dat->GetNz(); long p[3]={nx,ny,nz}; mreal *b = new mreal[nx*ny*nz]; @@ -397,6 +398,7 @@ void *mgl_max_x(void *par) } HMDT mgl_data_max_dir(HCDT dat, const char *dir) { + if(!dir || *dir==0) return 0; long nx=dat->GetNx(),ny=dat->GetNy(),nz=dat->GetNz(); long p[3]={nx,ny,nz}; mreal *b = new mreal[nx*ny*nz]; @@ -436,7 +438,7 @@ void *mgl_min_z(void *par) mreal *b=t->a; const mreal *a=t->b; for(i=t->id;ia[i+nn*j]) b[i] = a[i+nn*j]; return 0; } void *mgl_min_y(void *par) @@ -448,7 +450,7 @@ void *mgl_min_y(void *par) for(i=t->id;ia[k+nx*j]) b[i]=a[k+nx*j]; } return 0; } @@ -461,12 +463,13 @@ void *mgl_min_x(void *par) for(i=t->id;ia[j+k]) b[i]=a[j+k]; } return 0; } HMDT mgl_data_min_dir(HCDT dat, const char *dir) { + if(!dir || *dir==0) return 0; long nx=dat->GetNx(),ny=dat->GetNy(),nz=dat->GetNz(); long p[3]={nx,ny,nz}; mreal *b = new mreal[nx*ny*nz]; @@ -506,7 +509,7 @@ void *mgl_mom_z(void *par) long nx=t->p[0], ny=t->p[1], nz=t->p[2], nn=t->n; mreal *b=t->a, i0,i1,x,y,z; const mreal *a=t->b; - const mglFormula *eq = (mglFormula *)t->v; + const mglFormula *eq = (const mglFormula *)t->v; for(i=t->id;ip[0], ny=t->p[1], nz=t->p[2], nn=t->n; mreal *b=t->a, i0,i1,x,y,z; const mreal *a=t->b; - const mglFormula *eq = (mglFormula *)t->v; + const mglFormula *eq = (const mglFormula *)t->v; for(i=t->id;ip[0], ny=t->p[1], nz=t->p[2], nn=t->n; mreal *b=t->a, i0,i1,x,y,z; const mreal *a=t->b; - const mglFormula *eq = (mglFormula *)t->v; + const mglFormula *eq = (const mglFormula *)t->v; for(i=t->id;ip[0], ny=t->p[1], nz=t->p[2], n1=t->p[3], nn=t->n; + const mreal *ii=t->c, *jj=t->d, *kk=t->e; + HCDT a = (HCDT)t->v; + mreal *b=t->a,x,y,z; + for(i=t->id;i(dat); const mglData *i=dynamic_cast(idat); const mglData *j=dynamic_cast(jdat); const mglData *k=dynamic_cast(kdat); - if(!d || !i) return r; + if(!i) return r; - long p[4]={i->nx,i->ny,i->nz,norm}; + long p[4]={dat->GetNx(), dat->GetNy(), dat->GetNz(),norm}; register long n=i->nx*i->ny*i->nz; if(j && j->nx*j->ny*j->nz!=n) return r; if(k && k->nx*k->ny*k->nz!=n) return r; r->Create(i->nx,i->ny,i->nz); - mglStartThread(mgl_eval,0,n,r->a,d->a,i->a,p,0,j?j->a:0,k?k->a:0); + if(d) mglStartThread(mgl_eval,0,n,r->a,d->a,i->a,p,0,j?j->a:0,k?k->a:0); + else mglStartThread(mgl_eval_s,0,n,r->a,0,i->a,p,dat,j?j->a:0,k?k->a:0); return r; } uintptr_t mgl_data_evaluate_(uintptr_t *d, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm) @@ -623,19 +642,21 @@ uintptr_t mgl_data_evaluate_(uintptr_t *d, uintptr_t *idat, uintptr_t *jdat, uin void mgl_data_fourier(HMDT re, HMDT im, const char *dir) { #if MGL_HAVE_GSL + if(!dir || *dir==0) return; long nx = re->nx, ny = re->ny, nz = re->nz; if(nx*ny*nz != im->nx*im->ny*im->nz || !dir || dir[0]==0) return; double *a = new double[2*nx*ny*nz]; register long i,j; - gsl_fft_direction how = strchr(dir,'i')?backward:forward; for(i=0;ia[i]; a[2*i+1] = im->a[i]; } if(strchr(dir,'x') && nx>1) { gsl_fft_complex_wavetable *wt = gsl_fft_complex_wavetable_alloc(nx); gsl_fft_complex_workspace *ws = gsl_fft_complex_workspace_alloc(nx); - for(i=0;inx; mreal *aa=d->a; @@ -767,6 +796,7 @@ void mgl_data_fill_sample_(uintptr_t *d, const char *how,int l) void mgl_data_hankel(HMDT d, const char *dir) { #if MGL_HAVE_GSL + if(!dir || *dir==0) return; double *ai=0, *af=0, mm; gsl_dht *dht=0; register long i,j,k; @@ -818,6 +848,7 @@ void mgl_data_hankel_(uintptr_t *d, const char *dir,int l) void mgl_data_cosfft(HMDT d, const char *dir) { #if MGL_HAVE_GSL + if(!dir || *dir==0) return; double *b = 0; gsl_fft_complex_wavetable *wt=0; gsl_fft_complex_workspace *ws=0; @@ -876,6 +907,7 @@ void mgl_data_cosfft_(uintptr_t *d, const char *dir,int l) void mgl_data_sinfft(HMDT d, const char *dir) { #if MGL_HAVE_GSL + if(!dir || *dir==0) return; double *b = 0; gsl_fft_complex_wavetable *wt=0; gsl_fft_complex_workspace *ws=0; @@ -950,6 +982,7 @@ HMDT mgl_transform_a(HCDT am, HCDT ph, const char *tr) //----------------------------------------------------------------------------- HMDT mgl_transform(HCDT re, HCDT im, const char *tr) { + if(!tr || *tr==0) return 0; long nx = re->GetNx(), ny = re->GetNy(), nz = re->GetNz(); if(nx*ny*nz != im->GetNx()*im->GetNy()*im->GetNz() || !tr || tr[0]==0) return (new mglData); @@ -974,9 +1007,9 @@ HMDT mgl_transform(HCDT re, HCDT im, const char *tr) else if(strchr(tr,'i')) // do Fourier only once for speeding up { char str[5] = " i"; - if(tr[0]=='f') str[0]='x'; - if(tr[1]=='f') str[1]='y'; - if(tr[2]=='f') str[2]='z'; + if(tr[0]=='i') str[0]='x'; + if(tr[1]=='i') str[1]='y'; + if(tr[2]=='i') str[2]='z'; mgl_data_fourier(&rr,&ii,str); } else if(strchr(tr,'s')) // do Fourier only once for speeding up @@ -1165,9 +1198,9 @@ void *mgl_hist_1(void *par) { mglThreadD *t=(mglThreadD *)par; register long i,k, nn=t->n, n = t->p[0]; - mreal *b=new mreal[n], *v=(mreal *)t->v; + mreal *b=new mreal[n]; memset(b,0,n*sizeof(mreal)); - const mreal *a=t->b, *c=t->c; + const mreal *a=t->b, *c=t->c, *v=(const mreal *)t->v; for(i=t->id;in, n = t->p[0]; long ns=t->p[1], nx=t->p[2], ny=t->p[3], nz=t->p[4]; - mreal *b=new mreal[n], *v=(mreal *)t->v, f,w=1, x,y,z, d=1./ns; + mreal *b=new mreal[n], f,w=1, x,y,z, d=1./ns; memset(b,0,n*sizeof(mreal)); - const mreal *a=t->b, *c=t->c; + const mreal *a=t->b, *c=t->c, *v=(const mreal *)t->v; bool sp = n>0; for(i=t->id;i=0 && k * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -107,6 +107,8 @@ void mgl_data_import(HMDT d, const char *fname, const char *scheme,mreal v1,mrea delete []c; png_destroy_read_struct(&png_ptr, &info_ptr,&end_info); fclose(fp); +#else + mglGlobalMess += "PNG support was disabled. Please, enable it and rebuild MathGL.\n"; #endif } //----------------------------------------------------------------------------- @@ -166,6 +168,8 @@ void mgl_data_export(HCDT dd, const char *fname, const char *scheme,mreal v1,mre png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); free(p); free(d); +#else + mglGlobalMess += "PNG support was disabled. Please, enable it and rebuild MathGL.\n"; #endif } //----------------------------------------------------------------------------- diff --git a/src/def_font.cpp b/src/def_font.cpp index a853dbe..cfd080d 100644 --- a/src/def_font.cpp +++ b/src/def_font.cpp @@ -1,1023 +1,1239 @@ -/*************************************************************************** - * mgl_def_font.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Library General Public License as * - * published by the Free Software Foundation; either version 3 of the * - * License, or (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU Library General Public * - * License along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -//# font STIXGeneral.otf has 516 glyphs -unsigned mgl_numg=516, mgl_cur=246080; -float mgl_fact=50; -long mgl_gen_fnt[516][6] = { - {33, 232, 41, 0, 39, 62042}, - {34, 285, 41, 82, 38, 62276}, - {35, 350, 33, 164, 32, 62504}, - {36, 350, 81, 230, 80, 62696}, - {37, 522, 132, 392, 129, 63176}, - {38, 544, 128, 656, 127, 63950}, - {39, 125, 21, 912, 19, 64712}, - {40, 232, 22, 954, 20, 64826}, - {41, 232, 22, 998, 21, 64946}, - {42, 350, 165, 1042, 169, 65072}, - {43, 479, 12, 1372, 8, 66086}, - {44, 175, 33, 1396, 34, 66134}, - {45, 232, 4, 1462, 2, 66338}, - {46, 175, 21, 1470, 18, 66350}, - {47, 194, 4, 1512, 2, 66458}, - {48, 350, 43, 1520, 41, 66470}, - {49, 350, 28, 1606, 27, 66716}, - {50, 350, 43, 1662, 41, 66878}, - {51, 350, 92, 1748, 91, 67124}, - {52, 350, 15, 1932, 12, 67670}, - {53, 350, 74, 1962, 78, 67742}, - {54, 350, 68, 2110, 66, 68210}, - {55, 350, 13, 2246, 11, 68606}, - {56, 350, 85, 2272, 83, 68672}, - {57, 350, 68, 2442, 67, 69170}, - {58, 194, 43, 2578, 36, 69572}, - {59, 194, 55, 2664, 52, 69788}, - {60, 479, 7, 2774, 5, 70100}, - {61, 479, 9, 2788, 4, 70130}, - {62, 479, 7, 2806, 5, 70154}, - {63, 310, 79, 2820, 73, 70184}, - {64, 644, 137, 2978, 138, 70622}, - {65, 505, 48, 3252, 50, 71450}, - {66, 467, 91, 3348, 90, 71750}, - {67, 467, 72, 3530, 72, 72290}, - {68, 505, 68, 3674, 70, 72722}, - {69, 427, 56, 3810, 54, 73142}, - {70, 389, 50, 3922, 47, 73466}, - {71, 505, 87, 4022, 86, 73748}, - {72, 505, 61, 4196, 57, 74264}, - {73, 232, 29, 4318, 27, 74606}, - {74, 260, 45, 4376, 43, 74768}, - {75, 505, 72, 4466, 69, 75026}, - {76, 427, 40, 4610, 39, 75440}, - {77, 622, 49, 4690, 47, 75674}, - {78, 505, 50, 4788, 50, 75956}, - {79, 505, 63, 4888, 60, 76256}, - {80, 389, 66, 5014, 69, 76616}, - {81, 505, 85, 5146, 83, 77030}, - {82, 467, 69, 5316, 69, 77528}, - {83, 389, 92, 5454, 94, 77942}, - {84, 427, 32, 5638, 30, 78506}, - {85, 505, 70, 5702, 70, 78686}, - {86, 505, 42, 5842, 41, 79106}, - {87, 660, 76, 5926, 75, 79352}, - {88, 505, 82, 6078, 80, 79802}, - {89, 505, 55, 6242, 54, 80282}, - {90, 428, 31, 6352, 30, 80606}, - {91, 232, 18, 6414, 16, 80786}, - {92, 194, 4, 6450, 2, 80882}, - {93, 232, 18, 6458, 16, 80894}, - {94, 328, 7, 6494, 5, 80990}, - {95, 350, 4, 6508, 2, 81020}, - {96, 232, 18, 6516, 16, 81032}, - {97, 310, 115, 6552, 115, 81128}, - {98, 350, 70, 6782, 71, 81818}, - {99, 310, 62, 6922, 60, 82244}, - {100, 350, 71, 7046, 79, 82604}, - {101, 310, 55, 7188, 53, 83078}, - {102, 232, 57, 7298, 53, 83396}, - {103, 350, 146, 7412, 151, 83714}, - {104, 350, 68, 7704, 67, 84620}, - {105, 194, 47, 7840, 44, 85022}, - {106, 194, 75, 7934, 71, 85286}, - {107, 350, 75, 8084, 72, 85712}, - {108, 194, 29, 8234, 30, 86144}, - {109, 544, 107, 8292, 108, 86324}, - {110, 350, 66, 8506, 69, 86972}, - {111, 350, 53, 8638, 50, 87386}, - {112, 350, 72, 8744, 72, 87686}, - {113, 350, 68, 8888, 68, 88118}, - {114, 232, 60, 9024, 61, 88526}, - {115, 272, 83, 9144, 88, 88892}, - {116, 194, 49, 9310, 49, 89420}, - {117, 350, 58, 9408, 56, 89714}, - {118, 350, 52, 9524, 53, 90050}, - {119, 505, 79, 9628, 81, 90368}, - {120, 350, 87, 9786, 91, 90854}, - {121, 350, 78, 9960, 83, 91400}, - {122, 310, 27, 10116, 25, 91898}, - {123, 335, 56, 10170, 54, 92048}, - {124, 139, 4, 10282, 2, 92372}, - {125, 335, 56, 10290, 55, 92384}, - {126, 378, 42, 10402, 40, 92714}, - {161, 231, 41, 10486, 39, 92954}, - {162, 350, 82, 10568, 84, 93188}, - {163, 350, 140, 10732, 149, 93692}, - {164, 350, 74, 11012, 72, 94586}, - {165, 350, 72, 11160, 69, 95018}, - {166, 139, 9, 11304, 4, 95432}, - {167, 350, 155, 11322, 157, 95456}, - {168, 232, 43, 11632, 36, 96398}, - {169, 532, 93, 11718, 87, 96614}, - {170, 192, 98, 11904, 104, 97136}, - {171, 350, 72, 12100, 73, 97760}, - {172, 420, 6, 12244, 4, 98198}, - {173, 232, 4, 12256, 2, 98222}, - {174, 532, 108, 12264, 106, 98234}, - {175, 232, 4, 12480, 2, 98870}, - {176, 279, 43, 12488, 43, 98882}, - {177, 479, 17, 12574, 10, 99140}, - {178, 210, 43, 12608, 41, 99200}, - {179, 210, 75, 12694, 75, 99446}, - {180, 232, 18, 12844, 16, 99896}, - {181, 350, 69, 12880, 69, 99992}, - {182, 414, 48, 13018, 47, 100406}, - {183, 175, 21, 13114, 18, 100688}, - {184, 232, 40, 13156, 43, 100796}, - {185, 210, 25, 13236, 26, 101054}, - {186, 217, 48, 13286, 45, 101210}, - {187, 350, 71, 13382, 72, 101480}, - {188, 525, 46, 13524, 40, 101912}, - {189, 525, 76, 13616, 69, 102152}, - {190, 525, 96, 13768, 89, 102566}, - {191, 310, 88, 13960, 82, 103100}, - {192, 505, 66, 14136, 66, 103592}, - {193, 505, 66, 14268, 66, 103988}, - {194, 505, 56, 14400, 55, 104384}, - {195, 505, 92, 14512, 92, 104714}, - {196, 505, 92, 14696, 86, 105266}, - {197, 505, 92, 14880, 90, 105782}, - {198, 622, 85, 15064, 85, 106322}, - {199, 467, 109, 15234, 116, 106832}, - {200, 427, 75, 15452, 70, 107528}, - {201, 427, 75, 15602, 70, 107948}, - {202, 427, 64, 15752, 59, 108368}, - {203, 427, 100, 15880, 90, 108722}, - {204, 232, 48, 16080, 43, 109262}, - {205, 232, 48, 16176, 43, 109520}, - {206, 232, 36, 16272, 31, 109778}, - {207, 232, 72, 16344, 62, 109964}, - {208, 505, 69, 16488, 69, 110336}, - {209, 505, 93, 16626, 92, 110750}, - {210, 505, 82, 16812, 76, 111302}, - {211, 505, 82, 16976, 76, 111758}, - {212, 505, 71, 17140, 65, 112214}, - {213, 505, 106, 17282, 102, 112604}, - {214, 505, 107, 17494, 96, 113216}, - {215, 447, 12, 17708, 10, 113792}, - {216, 505, 79, 17732, 80, 113852}, - {217, 505, 89, 17890, 86, 114332}, - {218, 505, 90, 18068, 86, 114848}, - {219, 505, 78, 18248, 75, 115364}, - {220, 505, 114, 18404, 106, 115814}, - {221, 505, 74, 18632, 70, 116450}, - {222, 389, 70, 18780, 75, 116870}, - {223, 350, 98, 18920, 98, 117320}, - {224, 310, 134, 19116, 131, 117908}, - {225, 310, 134, 19384, 131, 118694}, - {226, 310, 123, 19652, 120, 119480}, - {227, 310, 159, 19898, 157, 120200}, - {228, 310, 159, 20216, 151, 121142}, - {229, 310, 159, 20534, 155, 122048}, - {230, 467, 127, 20852, 131, 122978}, - {231, 310, 96, 21106, 99, 123764}, - {232, 310, 74, 21298, 69, 124358}, - {233, 310, 74, 21446, 69, 124772}, - {234, 310, 63, 21594, 58, 125186}, - {235, 310, 99, 21720, 89, 125534}, - {236, 194, 44, 21918, 42, 126068}, - {237, 194, 45, 22006, 42, 126320}, - {238, 194, 34, 22096, 31, 126572}, - {239, 194, 70, 22164, 62, 126758}, - {240, 350, 74, 22304, 72, 127130}, - {241, 350, 109, 22452, 113, 127562}, - {242, 350, 72, 22670, 66, 128240}, - {243, 350, 72, 22814, 66, 128636}, - {244, 350, 61, 22958, 55, 129032}, - {245, 350, 95, 23080, 92, 129362}, - {246, 350, 97, 23270, 86, 129914}, - {247, 394, 48, 23464, 38, 130430}, - {248, 350, 73, 23560, 76, 130658}, - {249, 350, 77, 23706, 72, 131114}, - {250, 350, 77, 23860, 72, 131546}, - {251, 350, 66, 24014, 61, 131978}, - {252, 350, 102, 24146, 92, 132344}, - {253, 350, 96, 24350, 99, 132896}, - {254, 350, 73, 24542, 72, 133490}, - {255, 350, 122, 24688, 119, 133922}, - {768, 0, 18, 24932, 16, 134636}, - {769, 0, 18, 24968, 16, 134732}, - {770, 0, 7, 25004, 5, 134828}, - {771, 0, 41, 25018, 40, 134858}, - {772, 0, 4, 25100, 2, 135098}, - {773, 0, 4, 25108, 2, 135110}, - {774, 0, 22, 25116, 20, 135122}, - {775, 0, 21, 25160, 18, 135242}, - {776, 0, 43, 25202, 36, 135350}, - {777, 0, 44, 25288, 43, 135566}, - {778, 0, 43, 25376, 40, 135824}, - {779, 0, 37, 25462, 32, 136064}, - {780, 0, 7, 25536, 5, 136256}, - {781, 0, 4, 25550, 2, 136286}, - {782, 0, 9, 25558, 4, 136298}, - {783, 0, 37, 25576, 32, 136322}, - {784, 0, 44, 25650, 38, 136514}, - {785, 0, 22, 25738, 20, 136742}, - {786, 0, 35, 25782, 34, 136862}, - {787, 0, 33, 25852, 34, 137066}, - {788, 0, 34, 25918, 34, 137270}, - {789, 0, 33, 25986, 34, 137474}, - {790, 0, 18, 26052, 16, 137678}, - {791, 0, 18, 26088, 16, 137774}, - {792, 0, 8, 26124, 6, 137870}, - {793, 0, 8, 26140, 4, 137906}, - {794, 0, 6, 26156, 4, 137930}, - {795, 0, 30, 26168, 29, 137954}, - {796, 0, 26, 26228, 24, 138128}, - {797, 0, 8, 26280, 6, 138272}, - {798, 0, 8, 26296, 6, 138308}, - {799, 0, 12, 26312, 8, 138344}, - {800, 0, 4, 26336, 2, 138392}, - {801, 0, 34, 26344, 33, 138404}, - {802, 0, 34, 26412, 31, 138602}, - {803, 0, 21, 26480, 18, 138788}, - {804, 0, 43, 26522, 36, 138896}, - {805, 0, 44, 26608, 40, 139112}, - {806, 0, 33, 26696, 34, 139352}, - {807, 0, 40, 26762, 43, 139556}, - {808, 0, 33, 26842, 31, 139814}, - {809, 0, 4, 26908, 2, 140000}, - {810, 0, 8, 26916, 6, 140012}, - {811, 0, 49, 26932, 47, 140048}, - {812, 0, 7, 27030, 5, 140330}, - {813, 0, 7, 27044, 5, 140360}, - {814, 0, 22, 27058, 20, 140390}, - {815, 0, 22, 27102, 20, 140510}, - {816, 0, 40, 27146, 40, 140630}, - {817, 0, 4, 27226, 2, 140870}, - {818, 0, 4, 27234, 2, 140882}, - {819, 0, 9, 27242, 4, 140894}, - {820, 0, 39, 27260, 40, 140918}, - {821, 0, 4, 27338, 2, 141158}, - {822, 0, 4, 27346, 2, 141170}, - {823, 0, 4, 27354, 2, 141182}, - {824, 0, 4, 27362, 2, 141194}, - {825, 0, 26, 27370, 25, 141206}, - {826, 0, 8, 27422, 6, 141356}, - {827, 0, 9, 27438, 8, 141392}, - {828, 0, 42, 27456, 41, 141440}, - {829, 0, 12, 27540, 10, 141686}, - {830, 0, 39, 27564, 40, 141746}, - {831, 0, 9, 27642, 4, 141986}, - {838, 0, 8, 27660, 6, 142010}, - {844, 0, 86, 27676, 84, 142046}, - {857, 0, 129, 27848, 133, 142550}, - {860, 0, 22, 28106, 20, 143348}, - {864, 0, 44, 28150, 50, 143468}, - {865, 0, 22, 28238, 20, 143768}, - {866, 0, 33, 28282, 36, 143888}, - {894, 194, 55, 28348, 52, 144104}, - {900, 193, 16, 28458, 16, 144416}, - {901, 232, 60, 28490, 52, 144512}, - {902, 505, 63, 28610, 62, 144824}, - {903, 194, 21, 28736, 18, 145196}, - {904, 525, 75, 28778, 68, 145304}, - {905, 595, 79, 28928, 73, 145712}, - {906, 328, 47, 29086, 42, 146150}, - {908, 505, 82, 29180, 76, 146402}, - {910, 588, 76, 29344, 72, 146858}, - {911, 521, 82, 29496, 78, 147290}, - {912, 238, 98, 29660, 91, 147758}, - {913, 505, 45, 29856, 46, 148304}, - {914, 467, 71, 29946, 70, 148580}, - {915, 410, 34, 30088, 33, 149000}, - {916, 505, 8, 30156, 7, 149198}, - {917, 427, 55, 30172, 52, 149240}, - {918, 428, 31, 30282, 30, 149552}, - {919, 505, 61, 30344, 57, 149732}, - {920, 505, 105, 30466, 104, 150074}, - {921, 232, 29, 30676, 27, 150698}, - {922, 511, 72, 30734, 69, 150860}, - {923, 491, 41, 30878, 40, 151274}, - {924, 622, 49, 30960, 47, 151514}, - {925, 505, 50, 31058, 50, 151796}, - {926, 450, 62, 31158, 54, 152096}, - {927, 505, 63, 31282, 60, 152420}, - {928, 505, 55, 31408, 53, 152780}, - {929, 389, 66, 31518, 69, 153098}, - {931, 436, 24, 31650, 22, 153512}, - {932, 427, 32, 31698, 30, 153644}, - {933, 505, 57, 31762, 56, 153824}, - {934, 534, 76, 31876, 77, 154160}, - {935, 505, 82, 32028, 80, 154622}, - {936, 521, 83, 32192, 81, 155102}, - {937, 521, 63, 32358, 62, 155588}, - {938, 232, 73, 32484, 63, 155960}, - {939, 505, 101, 32630, 92, 156338}, - {940, 380, 84, 32832, 80, 156890}, - {941, 307, 109, 33000, 110, 157370}, - {942, 358, 76, 33218, 72, 158030}, - {943, 192, 54, 33370, 54, 158462}, - {944, 367, 122, 33478, 110, 158786}, - {945, 380, 66, 33722, 64, 159446}, - {946, 346, 101, 33854, 99, 159830}, - {947, 332, 46, 34056, 48, 160424}, - {948, 350, 83, 34148, 82, 160712}, - {949, 307, 93, 34314, 94, 161204}, - {950, 308, 100, 34500, 101, 161768}, - {951, 358, 58, 34700, 56, 162374}, - {952, 346, 57, 34816, 56, 162710}, - {953, 192, 36, 34930, 38, 163046}, - {954, 350, 63, 35002, 66, 163274}, - {955, 347, 48, 35128, 47, 163670}, - {956, 369, 64, 35224, 63, 163952}, - {957, 318, 34, 35352, 35, 164330}, - {958, 308, 137, 35420, 141, 164540}, - {959, 353, 43, 35694, 41, 165386}, - {960, 350, 69, 35780, 69, 165632}, - {961, 346, 54, 35918, 53, 166046}, - {962, 308, 79, 36026, 79, 166364}, - {963, 383, 45, 36184, 43, 166838}, - {964, 333, 46, 36274, 44, 167096}, - {965, 367, 60, 36366, 58, 167360}, - {966, 435, 71, 36486, 72, 167708}, - {967, 350, 52, 36628, 51, 168140}, - {968, 485, 57, 36732, 55, 168446}, - {969, 437, 90, 36846, 92, 168776}, - {970, 238, 80, 37026, 74, 169328}, - {971, 367, 104, 37186, 94, 169772}, - {972, 353, 61, 37394, 57, 170336}, - {973, 367, 78, 37516, 74, 170678}, - {974, 437, 108, 37672, 108, 171122}, - {976, 314, 93, 37888, 95, 171770}, - {977, 387, 95, 38074, 99, 172340}, - {978, 505, 72, 38264, 70, 172934}, - {981, 435, 63, 38408, 64, 173354}, - {982, 533, 97, 38534, 96, 173738}, - {984, 505, 77, 38728, 75, 174314}, - {985, 350, 55, 38882, 53, 174764}, - {986, 467, 71, 38992, 69, 175082}, - {987, 322, 79, 39134, 81, 175496}, - {988, 389, 38, 39292, 35, 175982}, - {989, 328, 10, 39368, 6, 176192}, - {990, 492, 69, 39388, 68, 176228}, - {991, 357, 8, 39526, 6, 176636}, - {992, 560, 56, 39542, 54, 176672}, - {993, 369, 45, 39654, 46, 176996}, - {1008, 385, 75, 39744, 76, 177272}, - {1009, 350, 64, 39894, 62, 177728}, - {1012, 505, 65, 40022, 64, 178100}, - {1013, 307, 51, 40152, 50, 178484}, - {1014, 310, 52, 40254, 50, 178784}, - {8450, 493, 61, 40358, 59, 179084}, - {8453, 585, 121, 40480, 112, 179438}, - {8455, 418, 109, 40722, 108, 180110}, - {8460, 576, 131, 40940, 129, 180758}, - {8461, 502, 22, 41202, 20, 181532}, - {8462, 403, 81, 41246, 87, 181652}, - {8463, 405, 94, 41408, 100, 182174}, - {8465, 533, 131, 41596, 125, 182774}, - {8469, 488, 20, 41858, 18, 183524}, - {8470, 708, 116, 41898, 111, 183632}, - {8471, 532, 109, 42130, 110, 184298}, - {8472, 578, 148, 42348, 146, 184958}, - {8473, 474, 43, 42644, 47, 185834}, - {8474, 535, 116, 42730, 127, 186116}, - {8476, 611, 131, 42962, 136, 186878}, - {8477, 522, 55, 43224, 64, 187694}, - {8478, 546, 76, 43334, 84, 188078}, - {8482, 685, 85, 43486, 82, 188582}, - {8484, 508, 15, 43656, 14, 189074}, - {8485, 296, 64, 43686, 62, 189158}, - {8486, 521, 62, 43814, 60, 189530}, - {8487, 521, 62, 43938, 60, 189890}, - {8488, 507, 107, 44062, 105, 190250}, - {8489, 252, 23, 44276, 22, 190880}, - {8491, 505, 89, 44322, 91, 191012}, - {8493, 501, 104, 44500, 100, 191558}, - {8494, 589, 68, 44708, 69, 192158}, - {8498, 374, 10, 44844, 8, 192572}, - {8501, 477, 119, 44864, 126, 192620}, - {8502, 447, 69, 45102, 73, 193376}, - {8503, 353, 82, 45240, 82, 193814}, - {8504, 419, 77, 45404, 80, 194306}, - {8508, 471, 49, 45558, 53, 194786}, - {8509, 378, 98, 45656, 108, 195104}, - {8510, 328, 11, 45852, 10, 195752}, - {8511, 502, 18, 45874, 18, 195812}, - {8512, 646, 19, 45910, 18, 195920}, - {8513, 486, 47, 45948, 46, 196028}, - {8514, 391, 6, 46042, 4, 196304}, - {8515, 391, 6, 46054, 4, 196328}, - {8516, 440, 9, 46066, 7, 196352}, - {8517, 505, 45, 46084, 46, 196394}, - {8518, 401, 65, 46174, 67, 196670}, - {8519, 366, 67, 46304, 69, 197072}, - {8520, 180, 19, 46438, 16, 197486}, - {8521, 213, 40, 46476, 40, 197582}, - {8522, 464, 40, 46556, 36, 197822}, - {8523, 544, 129, 46636, 129, 198038}, - {8531, 525, 107, 46894, 104, 198812}, - {8532, 525, 124, 47108, 119, 199436}, - {8533, 525, 99, 47356, 102, 200150}, - {8534, 525, 114, 47554, 117, 200762}, - {8535, 525, 146, 47782, 151, 201464}, - {8536, 525, 86, 48074, 88, 202370}, - {8537, 525, 86, 48246, 80, 202898}, - {8538, 525, 127, 48418, 127, 203378}, - {8539, 525, 118, 48672, 114, 204140}, - {8540, 525, 166, 48908, 160, 204824}, - {8541, 525, 159, 49240, 158, 205784}, - {8542, 525, 103, 49558, 96, 206732}, - {8592, 648, 41, 49764, 44, 207308}, - {8593, 357, 40, 49846, 44, 207572}, - {8594, 648, 41, 49926, 44, 207836}, - {8595, 357, 43, 50008, 44, 208100}, - {8596, 648, 78, 50094, 86, 208364}, - {8597, 357, 84, 50250, 87, 208880}, - {8598, 648, 53, 50418, 68, 209402}, - {8599, 648, 48, 50524, 65, 209810}, - {8600, 648, 50, 50620, 64, 210200}, - {8601, 648, 56, 50720, 66, 210584}, - {8602, 648, 48, 50832, 52, 210980}, - {8603, 648, 51, 50928, 52, 211292}, - {8604, 648, 69, 51030, 72, 211604}, - {8605, 648, 70, 51168, 74, 212036}, - {8606, 648, 83, 51308, 88, 212480}, - {8607, 357, 80, 51474, 88, 213008}, - {8608, 648, 86, 51634, 89, 213536}, - {8609, 357, 80, 51806, 86, 214070}, - {8610, 648, 70, 51966, 75, 214586}, - {8611, 648, 71, 52106, 75, 215036}, - {8612, 648, 43, 52248, 48, 215486}, - {8613, 357, 44, 52334, 48, 215774}, - {8614, 648, 42, 52422, 46, 216062}, - {8615, 357, 47, 52506, 48, 216338}, - {8616, 357, 82, 52600, 90, 216626}, - {8617, 648, 63, 52764, 67, 217166}, - {8618, 648, 63, 52890, 66, 217568}, - {8619, 648, 78, 53016, 81, 217964}, - {8620, 648, 78, 53172, 82, 218450}, - {8621, 839, 123, 53328, 128, 218942}, - {8622, 648, 85, 53574, 94, 219710}, - {8623, 357, 50, 53744, 61, 220274}, - {8624, 324, 46, 53844, 46, 220640}, - {8625, 324, 46, 53936, 47, 220916}, - {8626, 324, 46, 54028, 46, 221198}, - {8627, 324, 45, 54120, 47, 221474}, - {8628, 648, 43, 54210, 46, 221756}, - {8629, 648, 40, 54296, 47, 222032}, - {8630, 648, 59, 54376, 62, 222314}, - {8631, 648, 61, 54494, 62, 222686}, - {8632, 648, 57, 54616, 66, 223058}, - {8633, 648, 93, 54730, 95, 223454}, - {8634, 682, 92, 54916, 98, 224024}, - {8635, 682, 89, 55100, 98, 224612}, - {8636, 668, 20, 55278, 19, 225200}, - {8637, 668, 20, 55318, 18, 225314}, - {8638, 357, 23, 55358, 23, 225422}, - {8639, 357, 23, 55404, 23, 225560}, - {8640, 668, 20, 55450, 18, 225698}, - {8641, 668, 20, 55490, 18, 225806}, - {8642, 357, 23, 55530, 23, 225914}, - {8643, 357, 23, 55576, 23, 226052}, - {8644, 648, 85, 55622, 89, 226190}, - {8645, 541, 84, 55792, 88, 226724}, - {8646, 648, 79, 55960, 88, 227252}, - {8647, 648, 82, 56118, 88, 227780}, - {8648, 541, 82, 56282, 88, 228308}, - {8649, 648, 82, 56446, 88, 228836}, - {8650, 541, 78, 56610, 88, 229364}, - {8651, 648, 46, 56766, 46, 229892}, - {8652, 648, 48, 56858, 46, 230168}, - {8653, 648, 68, 56954, 71, 230444}, - {8654, 648, 101, 57090, 104, 230870}, - {8655, 648, 69, 57292, 71, 231494}, - {8656, 648, 55, 57430, 57, 231920}, - {8657, 479, 57, 57540, 57, 232262}, - {8658, 648, 56, 57654, 57, 232604}, - {8659, 479, 55, 57766, 57, 232946}, - {8660, 648, 88, 57876, 90, 233288}, - {8661, 479, 107, 58052, 110, 233828}, - {8662, 648, 61, 58266, 72, 234488}, - {8663, 648, 60, 58388, 72, 234920}, - {8664, 648, 60, 58508, 72, 235352}, - {8665, 648, 61, 58628, 72, 235784}, - {8666, 648, 61, 58750, 63, 236216}, - {8667, 648, 59, 58872, 62, 236594}, - {8668, 648, 52, 58990, 54, 236966}, - {8669, 648, 54, 59094, 54, 237290}, - {8670, 357, 56, 59202, 56, 237614}, - {8671, 357, 57, 59314, 56, 237950}, - {8672, 648, 57, 59428, 50, 238286}, - {8673, 357, 55, 59542, 50, 238586}, - {8674, 648, 59, 59652, 50, 238886}, - {8675, 357, 57, 59770, 50, 239186}, - {8676, 648, 48, 59884, 47, 239486}, - {8677, 648, 45, 59980, 48, 239768}, - {8678, 648, 35, 60070, 35, 240056}, - {8679, 479, 36, 60140, 36, 240266}, - {8680, 648, 35, 60212, 35, 240482}, - {8681, 479, 36, 60282, 35, 240692}, - {8682, 479, 46, 60354, 44, 240902}, - {8692, 648, 87, 60446, 93, 241166}, - {8693, 541, 84, 60620, 88, 241724}, - {8694, 648, 119, 60788, 124, 242252}, - {8695, 648, 48, 61026, 50, 242996}, - {8696, 648, 50, 61122, 50, 243296}, - {8697, 648, 86, 61222, 92, 243596}, - {8698, 648, 56, 61394, 56, 244148}, - {8699, 648, 59, 61506, 56, 244484}, - {8700, 648, 93, 61624, 98, 244820}, - {8701, 648, 30, 61810, 28, 245408}, - {8702, 648, 30, 61870, 29, 245576}, - {8703, 648, 56, 61930, 55, 245750} +unsigned mgl_numg=411, mgl_cur=243136; +float mgl_fact=35.7143; +long mgl_gen_fnt[411][6] = { + {0x21,166,41,0,39,164}, + {0x22,204,43,398,38,570}, + {0x23,250,33,798,32,930}, + {0x24,250,81,1122,80,1446}, + {0x25,373,130,1926,129,2446}, + {0x26,388,128,3220,127,3732}, + {0x27,89,20,4494,19,4574}, + {0x28,166,22,4688,20,4776}, + {0x29,166,22,4896,21,4984}, + {0x2a,250,154,5110,169,5726}, + {0x2b,342,12,6740,8,6788}, + {0x2c,125,34,6836,34,6972}, + {0x2d,166,4,7176,2,7192}, + {0x2e,125,21,7204,18,7288}, + {0x2f,138,4,7396,2,7412}, + {0x30,250,43,7424,41,7596}, + {0x31,250,28,7842,27,7954}, + {0x32,250,43,8116,41,8288}, + {0x33,250,91,8534,90,8898}, + {0x34,250,15,9438,12,9498}, + {0x35,250,72,9570,77,9858}, + {0x36,250,68,10320,66,10592}, + {0x37,250,13,10988,11,11040}, + {0x38,250,85,11106,83,11446}, + {0x39,250,68,11944,67,12216}, + {0x3a,138,43,12618,36,12790}, + {0x3b,138,57,13006,52,13234}, + {0x3c,342,7,13546,5,13574}, + {0x3d,342,9,13604,4,13640}, + {0x3e,342,7,13664,5,13692}, + {0x3f,222,77,13722,73,14030}, + {0x40,460,136,14468,136,15012}, + {0x41,361,47,15828,50,16016}, + {0x42,333,90,16316,90,16676}, + {0x43,333,72,17216,72,17504}, + {0x44,361,67,17936,68,18204}, + {0x45,305,57,18612,54,18840}, + {0x46,277,51,19164,47,19368}, + {0x47,361,88,19650,86,20002}, + {0x48,361,60,20518,56,20758}, + {0x49,166,27,21094,26,21202}, + {0x4a,186,45,21358,43,21538}, + {0x4b,361,70,21796,69,22076}, + {0x4c,305,37,22490,39,22638}, + {0x4d,444,49,22872,47,23068}, + {0x4e,361,47,23350,50,23538}, + {0x4f,361,63,23838,60,24090}, + {0x50,278,66,24450,69,24714}, + {0x51,361,85,25128,83,25468}, + {0x52,333,69,25966,69,26242}, + {0x53,277,91,26656,94,27020}, + {0x54,305,32,27584,30,27712}, + {0x55,361,68,27892,68,28164}, + {0x56,361,42,28572,41,28740}, + {0x57,472,72,28986,75,29274}, + {0x58,361,82,29724,80,30052}, + {0x59,361,55,30532,54,30752}, + {0x5a,305,32,31076,30,31204}, + {0x5b,166,18,31384,16,31456}, + {0x5c,138,4,31552,2,31568}, + {0x5d,166,17,31580,16,31648}, + {0x5e,234,7,31744,5,31772}, + {0x5f,250,4,31802,2,31818}, + {0x60,166,17,31830,16,31898}, + {0x61,222,112,31994,115,32442}, + {0x62,250,70,33132,71,33412}, + {0x63,222,62,33838,60,34086}, + {0x64,250,72,34446,79,34734}, + {0x65,222,53,35208,53,35420}, + {0x66,166,57,35738,53,35966}, + {0x67,250,139,36284,149,36840}, + {0x68,250,60,37734,67,37974}, + {0x69,138,45,38376,44,38556}, + {0x6a,138,71,38820,71,39104}, + {0x6b,250,69,39530,72,39806}, + {0x6c,138,30,40238,30,40358}, + {0x6d,388,102,40538,108,40946}, + {0x6e,250,66,41594,67,41858}, + {0x6f,250,53,42260,50,42472}, + {0x70,250,68,42772,72,43044}, + {0x71,250,64,43476,68,43732}, + {0x72,166,61,44140,61,44384}, + {0x73,194,79,44750,86,45066}, + {0x74,138,47,45582,49,45770}, + {0x75,250,54,46064,56,46280}, + {0x76,250,54,46616,53,46832}, + {0x77,361,72,47150,81,47438}, + {0x78,250,83,47924,89,48256}, + {0x79,250,74,48790,79,49086}, + {0x7a,222,27,49560,25,49668}, + {0x7b,239,55,49818,54,50038}, + {0x7c,99,4,50362,2,50378}, + {0x7d,239,55,50390,55,50610}, + {0x7e,270,41,50940,40,51104}, + {0xa1,165,41,51344,39,51508}, + {0xa2,250,81,51742,84,52066}, + {0xa3,250,135,52570,148,53110}, + {0xa4,250,73,53998,72,54290}, + {0xa5,250,71,54722,69,55006}, + {0xa6,99,9,55420,4,55456}, + {0xa7,250,152,55480,156,56088}, + {0xa8,166,43,57024,36,57196}, + {0xa9,380,92,57412,87,57780}, + {0xaa,137,95,58302,103,58682}, + {0xab,250,69,59300,73,59576}, + {0xac,300,6,60014,4,60038}, + {0xad,166,4,60062,2,60078}, + {0xae,380,106,60090,106,60514}, + {0xaf,166,4,61150,2,61166}, + {0xb0,199,43,61178,41,61350}, + {0xb1,342,17,61596,10,61664}, + {0xb2,150,41,61724,41,61888}, + {0xb3,150,74,62134,75,62430}, + {0xb4,166,16,62880,16,62944}, + {0xb5,250,68,63040,67,63312}, + {0xb6,295,48,63714,47,63906}, + {0xb7,125,21,64188,18,64272}, + {0xb8,166,40,64380,43,64540}, + {0xb9,150,23,64798,26,64890}, + {0xba,155,46,65046,45,65230}, + {0xbb,250,73,65500,72,65792}, + {0xbc,375,43,66224,40,66396}, + {0xbd,375,74,66636,69,66932}, + {0xbe,375,95,67346,89,67726}, + {0xbf,222,86,68260,82,68604}, + {0xc0,361,65,69096,66,69356}, + {0xc1,361,65,69752,66,70012}, + {0xc2,361,55,70408,55,70628}, + {0xc3,361,89,70958,92,71314}, + {0xc4,361,91,71866,86,72230}, + {0xc5,361,91,72746,90,73110}, + {0xc6,444,86,73650,85,73994}, + {0xc7,333,108,74504,116,74936}, + {0xc8,305,74,75632,70,75928}, + {0xc9,305,74,76348,70,76644}, + {0xca,305,65,77064,59,77324}, + {0xcb,305,101,77678,90,78082}, + {0xcc,166,45,78622,42,78802}, + {0xcd,166,45,79054,42,79234}, + {0xce,166,36,79486,31,79630}, + {0xcf,166,72,79816,62,80104}, + {0xd0,361,70,80476,69,80756}, + {0xd1,361,88,81170,92,81522}, + {0xd2,361,80,82074,76,82394}, + {0xd3,361,81,82850,76,83174}, + {0xd4,361,71,83630,65,83914}, + {0xd5,361,104,84304,102,84720}, + {0xd6,361,107,85332,96,85760}, + {0xd7,319,12,86336,10,86384}, + {0xd8,361,78,86444,80,86756}, + {0xd9,361,87,87236,84,87584}, + {0xda,361,87,88088,84,88436}, + {0xdb,361,76,88940,73,89244}, + {0xdc,361,112,89682,104,90130}, + {0xdd,361,73,90754,70,91046}, + {0xde,277,70,91466,75,91746}, + {0xdf,250,98,92196,98,92588}, + {0xe0,222,130,93176,131,93696}, + {0xe1,222,129,94482,131,94998}, + {0xe2,222,120,95784,120,96264}, + {0xe3,222,155,96984,157,97604}, + {0xe4,222,156,98546,151,99170}, + {0xe5,222,156,100076,155,100700}, + {0xe6,333,127,101630,132,102138}, + {0xe7,222,97,102930,99,103318}, + {0xe8,222,71,103912,69,104196}, + {0xe9,222,72,104610,69,104898}, + {0xea,222,61,105312,58,105556}, + {0xeb,222,97,105904,89,106292}, + {0xec,138,40,106826,42,106986}, + {0xed,138,41,107238,42,107402}, + {0xee,138,33,107654,31,107786}, + {0xef,138,70,107972,62,108252}, + {0xf0,250,74,108624,72,108920}, + {0xf1,250,109,109352,109,109788}, + {0xf2,250,71,110442,66,110726}, + {0xf3,250,71,111122,66,111406}, + {0xf4,250,61,111802,55,112046}, + {0xf5,250,94,112376,92,112752}, + {0xf6,250,97,113304,86,113692}, + {0xf7,281,48,114208,38,114400}, + {0xf8,250,73,114628,76,114920}, + {0xf9,250,73,115376,72,115668}, + {0xfa,250,73,116100,72,116392}, + {0xfb,250,62,116824,61,117072}, + {0xfc,250,98,117438,92,117830}, + {0xfd,250,92,118382,95,118750}, + {0xfe,250,71,119320,72,119604}, + {0xff,250,118,120036,115,120508}, + {0x300,0,15,121198,16,121258}, + {0x301,0,16,121354,16,121418}, + {0x302,0,7,121514,5,121542}, + {0x303,0,40,121572,40,121732}, + {0x304,0,4,121972,2,121988}, + {0x305,0,4,122000,2,122016}, + {0x306,0,22,122028,20,122116}, + {0x307,0,21,122236,18,122320}, + {0x308,0,43,122428,36,122600}, + {0x309,0,44,122816,43,122992}, + {0x30a,0,43,123250,40,123422}, + {0x30b,0,36,123662,32,123806}, + {0x30c,0,7,123998,5,124026}, + {0x30d,0,4,124056,2,124072}, + {0x30e,0,9,124084,4,124120}, + {0x30f,0,36,124144,32,124288}, + {0x391,361,45,124480,46,124660}, + {0x392,333,71,124936,70,125220}, + {0x393,293,35,125640,33,125780}, + {0x394,361,8,125978,7,126010}, + {0x395,305,56,126052,52,126276}, + {0x396,305,32,126588,30,126716}, + {0x397,361,60,126896,56,127136}, + {0x398,361,105,127472,104,127892}, + {0x399,166,27,128516,26,128624}, + {0x39a,365,70,128780,69,129060}, + {0x39b,351,41,129474,40,129638}, + {0x39c,444,49,129878,47,130074}, + {0x39d,361,47,130356,50,130544}, + {0x39e,321,62,130844,54,131092}, + {0x39f,361,63,131416,60,131668}, + {0x3a0,361,52,132028,52,132236}, + {0x3a1,278,66,132548,69,132812}, + {0x3a2,0,0,133226,0,133226}, + {0x3a3,311,24,133226,22,133322}, + {0x3a4,305,32,133454,30,133582}, + {0x3a5,361,55,133762,56,133982}, + {0x3a6,381,76,134318,77,134622}, + {0x3a7,361,82,135084,80,135412}, + {0x3a8,372,81,135892,81,136216}, + {0x3a9,372,62,136702,60,136950}, + {0x3aa,166,71,137310,62,137594}, + {0x3ab,361,99,137966,92,138362}, + {0x3ac,271,84,138914,80,139250}, + {0x3ad,219,111,139730,110,140174}, + {0x3ae,256,71,140834,72,141118}, + {0x3af,137,52,141550,54,141758}, + {0x3b0,262,119,142082,110,142558}, + {0x3b1,271,66,143218,64,143482}, + {0x3b2,247,96,143866,99,144250}, + {0x3b3,237,47,144844,48,145032}, + {0x3b4,250,83,145320,80,145652}, + {0x3b5,219,94,146132,94,146508}, + {0x3b6,220,100,147072,101,147472}, + {0x3b7,256,55,148078,56,148298}, + {0x3b8,247,57,148634,56,148862}, + {0x3b9,137,34,149198,38,149334}, + {0x3ba,250,64,149562,66,149818}, + {0x3bb,248,48,150214,47,150406}, + {0x3bc,263,64,150688,63,150944}, + {0x3bd,227,33,151322,35,151454}, + {0x3be,220,137,151664,139,152212}, + {0x3bf,252,43,153046,41,153218}, + {0x3c0,250,67,153464,69,153732}, + {0x3c1,247,55,154146,53,154366}, + {0x3c2,220,79,154684,79,155000}, + {0x3c3,273,45,155474,43,155654}, + {0x3c4,238,46,155912,44,156096}, + {0x3c5,262,58,156360,58,156592}, + {0x3c6,311,73,156940,72,157232}, + {0x3c7,250,52,157664,51,157872}, + {0x3c8,347,54,158178,55,158394}, + {0x3c9,312,91,158724,90,159088}, + {0x3d1,276,96,159628,99,160012}, + {0x3d5,311,63,160606,64,160858}, + {0x3d6,381,95,161242,96,161622}, + {0x3f0,275,77,162198,76,162506}, + {0x3f1,250,63,162962,62,163214}, + {0x3f5,219,51,163586,50,163790}, + {0x410,356,47,164090,50,164278}, + {0x411,305,63,164578,60,164830}, + {0x412,325,92,165190,90,165558}, + {0x413,285,38,166098,38,166250}, + {0x414,332,71,166478,73,166762}, + {0x415,314,56,167200,54,167424}, + {0x416,510,145,167748,143,168328}, + {0x417,287,90,169186,89,169546}, + {0x418,361,58,170080,55,170312}, + {0x419,361,107,170642,104,171070}, + {0x41a,344,100,171694,99,172094}, + {0x41b,341,64,172688,64,172944}, + {0x41c,446,48,173328,47,173520}, + {0x41d,362,60,173802,56,174042}, + {0x41e,364,63,174378,60,174630}, + {0x41f,362,52,174990,52,175198}, + {0x420,285,65,175510,69,175770}, + {0x421,338,71,176184,72,176468}, + {0x422,309,32,176900,30,177028}, + {0x423,355,75,177208,78,177508}, + {0x424,384,76,177976,77,178280}, + {0x425,358,82,178742,80,179070}, + {0x426,357,59,179550,63,179786}, + {0x427,328,64,180164,63,180420}, + {0x428,497,71,180798,78,181082}, + {0x429,497,81,181550,89,181874}, + {0x42a,368,53,182408,50,182620}, + {0x42b,441,80,182920,75,183240}, + {0x42c,305,51,183690,48,183894}, + {0x42d,325,76,184182,76,184486}, + {0x42e,450,93,184942,89,185314}, + {0x42f,318,64,185848,64,186104}, + {0x430,224,113,186488,114,186940}, + {0x431,253,79,187624,78,187940}, + {0x432,237,84,188408,84,188744}, + {0x433,196,34,189248,32,189384}, + {0x434,231,59,189576,64,189812}, + {0x435,233,49,190196,48,190392}, + {0x436,360,144,190680,148,191256}, + {0x437,194,85,192144,88,192484}, + {0x438,262,56,193012,55,193236}, + {0x439,262,106,193566,103,193990}, + {0x43a,251,85,194608,87,194948}, + {0x43b,249,63,195470,64,195722}, + {0x43c,308,48,196106,48,196298}, + {0x43d,262,58,196586,56,196818}, + {0x43e,256,53,197154,50,197366}, + {0x43f,262,52,197666,52,197874}, + {0x440,249,71,198186,72,198470}, + {0x441,228,63,198902,60,199154}, + {0x442,217,40,199514,38,199674}, + {0x443,245,69,199902,73,200178}, + {0x444,338,134,200616,136,201152}, + {0x445,244,77,201968,81,202276}, + {0x446,262,57,202762,59,202990}, + {0x447,256,62,203344,63,203592}, + {0x448,383,76,203970,78,204274}, + {0x449,383,82,204742,85,205070}, + {0x44a,269,56,205580,54,205804}, + {0x44b,334,77,206128,75,206436}, + {0x44c,228,49,206886,48,207082}, + {0x44d,222,54,207370,55,207586}, + {0x44e,368,81,207916,79,208240}, + {0x44f,235,59,208714,59,208950}, + {0x210f,289,94,209304,101,209680}, + {0x2111,381,130,210286,125,210806}, + {0x2113,0,0,211556,0,211556}, + {0x211c,436,132,211556,135,212084}, + {0x2190,463,40,212894,44,213054}, + {0x2191,255,39,213318,44,213474}, + {0x2192,463,41,213738,44,213902}, + {0x2193,255,38,214166,44,214318}, + {0x2194,463,75,214582,86,214882}, + {0x2195,255,74,215398,86,215694}, + {0x2196,463,50,216210,66,216410}, + {0x2197,463,50,216806,65,217006}, + {0x2198,463,45,217396,63,217576}, + {0x2199,463,49,217954,64,218150}, + {0x2200,280,12,218534,11,218582}, + {0x2201,231,48,218648,47,218840}, + {0x2202,235,70,219122,72,219402}, + {0x2203,280,12,219834,10,219882}, + {0x2204,280,30,219942,30,220062}, + {0x2205,381,70,220242,70,220522}, + {0x2206,365,8,220942,7,220974}, + {0x2207,365,8,221016,7,221048}, + {0x2208,342,29,221090,27,221206}, + {0x2209,342,52,221368,56,221576}, + {0x220a,242,29,221912,27,222028}, + {0x220b,342,30,222190,27,222310}, + {0x220c,342,56,222472,55,222696}, + {0x220d,242,29,223026,28,223142}, + {0x220e,272,4,223310,2,223326}, + {0x220f,500,49,223338,47,223534}, + {0x2210,500,49,223816,47,224012}, + {0x2211,457,22,224294,20,224382}, + {0x2212,342,4,224502,2,224518}, + {0x2213,342,17,224530,10,224598}, + {0x2214,342,34,224658,26,224794}, + {0x2215,261,4,224950,2,224966}, + {0x2216,213,4,224978,2,224994}, + {0x2217,261,135,225006,133,225546}, + {0x2218,175,43,226344,40,226516}, + {0x2219,175,21,226756,18,226840}, + {0x221a,463,19,226948,18,227024}, + {0x221b,463,93,227132,93,227504}, + {0x221c,463,35,228062,30,228202}, + {0x221d,342,65,228382,65,228642}, + {0x221e,463,85,229032,85,229372}, + {0x221f,342,6,229882,4,229906}, + {0x2220,342,6,229930,4,229954}, + {0x2221,342,33,229978,42,230110}, + {0x2222,342,48,230362,52,230554}, + {0x2223,132,4,230866,2,230882}, + {0x2224,202,12,230894,8,230942}, + {0x2225,261,9,230990,4,231026}, + {0x2226,304,20,231050,14,231130}, + {0x2227,310,7,231214,5,231242}, + {0x2228,310,7,231272,5,231300}, + {0x2229,310,26,231330,25,231434}, + {0x222a,310,26,231584,24,231688}, + {0x222b,229,67,231832,70,232100}, + {0x222c,350,137,232520,140,233068}, + {0x222d,471,205,233908,210,234728}, + {0x222e,249,117,235988,126,236456}, + {0x222f,370,209,237212,232,238048}, + {0x2260,342,20,239440,18,239520}, + {0x2261,342,14,239628,6,239684}, + {0x2262,342,28,239720,26,239832}, + {0x2263,342,19,239988,8,240064}, + {0x2264,342,12,240112,7,240160}, + {0x2265,342,12,240202,7,240250}, + {0x2266,342,17,240292,9,240360}, + {0x2267,342,17,240414,9,240482}, + {0x2268,342,28,240536,23,240648}, + {0x2269,342,28,240786,23,240898}, + {0x226a,466,15,241036,10,241096}, + {0x226b,466,15,241156,10,241216}, + {0x226c,233,80,241276,84,241596}, + {0x226d,342,55,242100,60,242320}, + {0x226e,342,20,242680,19,242760}, + {0x226f,342,20,242874,19,242954}, + {0x27c2,346,8,243068,6,243100} +}; +short mgl_buf_fnt[243136] = { +88,88,94,88,117,278,117,282,118,286,118,297,117,311,113,322,108,331,101,336,92,338,81,336,74,331,69,323,66,312,65,300,65,289,66,284,66,278,16383,16383,118,21,116,30,113,37,107,43,100,47,92,49,83,47,76,43,70,37,66,30,65,22,66,13,70,6,75,0,82,-2,91,-3,100,-2,107,0,113,6,116,13,118,21,150,215,154,243,158,268,162,289,165,306,166,318,165,324,162,330,157,334,151,337,145,338,138,337,132,334,127,330,124,324,123,316,124,307,126,291,129,270,134,244,139,215,16383,16383,65,215,70,243,75,268,78,289,80,306,81,318,80,324,77,330,73,334,67,337,60,338,53,337,47,334,42,330,40,324,39,316,39,307,42,291,45,270, +107,43,107,0,113,37,113,37,107,0,113,6,113,37,113,6,116,30,116,30,113,6,116,13,116,30,116,13,118,21,65,22,66,13,66,30,66,30,66,13,70,6,66,30,70,6,70,37,70,37,70,6,75,0,70,37,75,0,76,43,76,43,75,0,82,-2,76,43,82,-2,83,47,83,47,82,-2,91,-3,83,47,91,-3,92,49,92,49,91,-3,100,-2,92,49,100,-2,100,47,100,47,100,-2,107,0,100,47,107,0,107,43,118,297,117,311,117,278,118,297,117,278,117,282,118,297,117,282,118,286,118,297,118,286,118,290,118,297,118,290,118,294,117,278,117,311,113,322,117,278,113,322,108,331,117,278,108,331,101,336,117,278,101,336,94,88,92,338,81,336,88,88,92,338,88,88,94,88,92,338,94,88,101,336,66,284,66,278,69,323,69,323,66,278,88,88,69,323,88,88,74,331,74,331,88,88,81,336,66,312,65,300,65,297,66,312,65,297,65,293,66,312,65,293,65,289,66,312,65,289,66,284,66,312,66,284,69,323, +150,215,154,243,158,268,162,289,165,306,166,318,165,324,162,330,157,334,151,337,145,338,138,337,132,334,127,330,124,324,123,316,124,307,126,291,129,270,134,244,139,215,16383,16383,65,215,70,243,75,268,78,289,80,306,81,318,80,324,77,330,73,334,67,337,60,338,53,337,47,334,42,330,40,324,39,316,39,307,42,291,45,270,50,244,55,215,248,203,248,230,200,230,214,331,185,331,171,230,104,230,119,331,90,331,75,230,17,230,17,203,71,203,60,136,3,136,3,108,56,108,40,0,69,0,85,108,152,108,137,0,166,0,181,108,235,108,235,136,185,136,195,203,16383,16383,166,203,156,136,89,136,100,203,132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321, +123,316,124,307,124,324,124,324,124,307,126,291,124,324,126,291,127,330,127,330,126,291,129,270,127,330,129,270,132,334,132,334,129,270,134,244,132,334,134,244,138,337,138,337,134,244,139,215,138,337,139,215,145,338,145,338,139,215,150,215,145,338,150,215,151,337,151,337,150,215,154,243,151,337,154,243,157,334,157,334,154,243,158,268,157,334,158,268,162,330,162,330,158,268,162,289,162,330,162,289,165,324,165,324,162,289,165,306,165,324,165,306,166,318,39,316,39,307,40,324,40,324,39,307,42,291,40,324,42,291,42,330,42,330,42,291,45,270,42,330,45,270,47,334,47,334,45,270,50,244,47,334,50,244,53,337,53,337,50,244,55,215,53,337,55,215,60,338,60,338,55,215,65,215,60,338,65,215,67,337,67,337,65,215,70,243,67,337,70,243,73,334,73,334,70,243,75,268,73,334,75,268,77,330,77,330,75,268,78,289,77,330,78,289,80,324,80,324,78,289,80,306,80,324,80,306,81,318, +248,203,248,230,200,230,214,331,185,331,171,230,104,230,119,331,90,331,75,230,17,230,17,203,71,203,60,136,3,136,3,108,56,108,40,0,69,0,85,108,152,108,137,0,166,0,181,108,235,108,235,136,185,136,195,203,16383,16383,166,203,156,136,89,136,100,203,132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,173,326,155,330,132,332,132,363,115,363,115,332,88,328,64,319,44,304,31,283,26,257,29,234,38,214,54,196,79,177,115,155,115,14,90,17,69,27,52,42,38,63,30,90,22,90, +90,331,75,230,85,108,85,108,75,230,71,203,85,108,71,203,69,0,69,0,71,203,60,136,69,0,60,136,56,108,56,108,60,136,3,136,56,108,3,136,3,108,17,230,17,203,71,203,17,230,71,203,75,230,90,331,85,108,89,136,90,331,89,136,100,203,90,331,100,203,104,230,90,331,104,230,119,331,185,331,171,230,181,108,181,108,171,230,166,203,181,108,166,203,166,0,166,0,166,203,156,136,166,0,156,136,152,108,152,108,156,136,89,136,152,108,89,136,85,108,104,230,100,203,166,203,104,230,166,203,171,230,200,230,214,331,195,203,195,203,214,331,185,331,195,203,185,331,185,136,185,136,185,331,181,108,185,136,181,108,235,108,200,230,195,203,248,203,200,230,248,203,248,230,185,136,235,108,235,136,166,0,152,108,137,0,69,0,56,108,40,0, +132,319,154,314,172,304,186,291,197,273,205,250,213,250,213,305,202,314,189,321,173,326,155,330,132,332,132,363,115,363,115,332,88,328,64,319,44,304,31,283,26,257,29,234,38,214,54,196,79,177,115,155,115,14,90,17,69,27,52,42,38,63,30,90,22,90,22,26,38,16,54,9,71,4,91,1,115,0,115,-43,132,-43,132,0,164,6,191,17,211,32,224,54,229,85,228,96,227,105,225,115,222,123,219,130,210,141,199,152,185,164,163,178,132,195,16383,16383,115,204,93,219,79,232,69,243,64,254,63,266,65,281,71,293,81,304,96,313,115,319,16383,16383,132,147,156,132,172,118,182,105,188,90,189,74,187,55,181,40,170,28,154,20,132,14,343,107,341,127,335,143,325,155,312,163,295,165,267,159,241,143,220,120,206,91,200,60,203,38,212,18,225,4,242,-5,261,-8,286,-2,309,14,327,39,339,71,343,107,16383,16383,331,108,328,77,318,48,303,25,285,10,265,4,255,6,248,10,242,18,238,27,237,38,239,59,244,82,252,103,263,123,276,140,280,144,284,147,290,149,295,151,300,151,311,149,319,143,326,134,330,122,331,108,16383,16383,310,353,289,353,265,331,248,317,235,309,221,305,194,305,185,307,176,311,167,317,157,324,150,330,144,334,138,336,133,338,127,338,97,332,71,317,50,293,36,264,31,232,34,209,42,191,54,176,70,166,89,163,99,164,108,166,116,169,132,181,146,197,157,215, +132,319,154,314,155,330,155,330,154,314,172,304,155,330,172,304,173,326,173,326,172,304,186,291,173,326,186,291,189,321,189,321,186,291,197,273,189,321,197,273,202,314,202,314,197,273,205,250,202,314,205,250,213,305,213,305,205,250,213,250,228,96,227,105,229,85,229,85,227,105,225,115,229,85,225,115,224,54,224,54,225,115,222,123,224,54,222,123,219,130,211,32,224,54,219,130,211,32,219,130,210,141,211,32,210,141,199,152,211,32,199,152,191,17,191,17,199,152,189,74,191,17,189,74,187,55,191,17,187,55,181,40,191,17,181,40,170,28,191,17,170,28,164,6,188,90,189,74,199,152,188,90,199,152,185,164,188,90,185,164,182,105,132,147,156,132,163,178,163,178,156,132,172,118,163,178,172,118,185,164,185,164,172,118,182,105,132,14,132,147,132,195,132,14,132,195,115,155,132,14,115,155,132,-43,132,332,132,363,115,155,132,332,115,155,132,195,132,332,132,195,132,319,132,332,132,319,155,330,115,0,115,155,115,14,115,0,115,14,91,1,91,1,115,14,90,17,91,1,90,17,71,4,71,4,90,17,69,27,71,4,69,27,54,9,54,9,69,27,52,42,54,9,52,42,38,63,38,16,54,9,38,63,38,16,38,63,30,90,38,16,30,90,22,90,38,16,22,90,22,26,132,363,115,363,115,319,115,319,115,363,115,332,115,319,115,155,132,363,71,293,81,304,88,328,88,328,81,304,96,313,88,328,96,313,115,332,115,332,96,313,115,319,64,319,44,304,54,196,64,319,54,196,63,266,64,319,63,266,65,281,64,319,65,281,71,293,64,319,71,293,88,328,63,266,54,196,64,254,64,254,54,196,79,177,64,254,79,177,69,243,69,243,79,177,79,232,26,257,29,234,31,283,31,283,29,234,38,214,31,283,38,214,44,304,44,304,38,214,54,196,79,232,79,177,93,219,93,219,79,177,115,155,93,219,115,155,115,204,115,204,115,155,115,319,164,6,170,28,154,20,164,6,154,20,132,14,164,6,132,14,132,0,132,-43,115,155,115,0,132,-43,115,0,115,-43,132,195,132,147,163,178, +343,107,341,127,335,143,325,155,312,163,295,165,267,159,241,143,220,120,206,91,200,60,203,38,212,18,225,4,242,-5,261,-8,286,-2,309,14,327,39,339,71,343,107,16383,16383,331,108,328,77,318,48,303,25,285,10,265,4,255,6,248,10,242,18,238,27,237,38,239,59,244,82,252,103,263,123,276,140,280,144,284,147,290,149,295,151,300,151,311,149,319,143,326,134,330,122,331,108,16383,16383,310,353,289,353,265,331,248,317,235,309,221,305,194,305,185,307,176,311,167,317,157,324,150,330,144,334,138,336,133,338,127,338,97,332,71,317,50,293,36,264,31,232,34,209,42,191,54,176,70,166,89,163,99,164,108,166,116,169,132,181,146,197,157,215,165,234,171,255,172,276,172,289,171,294,171,299,179,296,187,294,194,292,201,292,209,291,223,292,236,295,247,301,258,309,269,320,72,-8,95,-8,16383,16383,161,285,157,251,148,222,133,198,115,182,94,176,85,178,77,183,71,190,67,200,66,211,67,228,70,245,75,262,82,278,90,293,95,302,101,309,107,314,115,319,126,325,135,316,140,312,144,310,148,307,153,305,157,301,159,297,160,292,161,285,368,55,359,45,350,38,342,33,332,30,321,29,304,31,288,36,274,46,259,58,246,75,260,96,273,115,284,134,296,152,309,173,316,184,323,192,332,198,342,201,355,203,355,213,248,213,248,203,261,201,270,197,276,193,279,187,280,179,278,165,273,150,264,133,251,113,234,89,218,107,205,126,192,146,180,167,168,192,199,207,221,222,235,238,243,256,246,276,242,298,233,315,218,328,199,335,177,338,153,335,132,325,116,309,105,288,101,263,101,250,103,237,106,223,111,207,118,189,99,177,72,158,50,138,34,116,24,92,21,69,25,42,36,20,53,5,77,-3,107,-6,130,-4,151,0,172,9,193,22,214,39,233,22,250,9,266,0,283,-4,300,-6,319,-3,336,3,352,14,365,30,375,50,16383,16383,219,278,217,261,211,246,200,233,183,220,161,208,152,225,146,239,143,253,141,266,141,281,142,294,148,306,156,315,167,320,180,322,193,320,204,314,212,304,217,292,219,278,16383,16383,202,52,185,40,170,31,155,25,142,21,129,20,109,23,92,31,79,45,70,64,67,87,69,106,75,124,86,140,103,155,126,171,142,141,156,115,170,92,202,52,50,215,56,244, +326,134,330,122,335,143,335,143,330,122,331,108,339,71,331,108,328,77,339,71,328,77,327,39,327,39,328,77,318,48,327,39,318,48,309,14,309,14,318,48,303,25,309,14,303,25,286,-2,286,-2,303,25,285,10,286,-2,285,10,265,4,265,4,255,6,261,-8,261,-8,255,6,248,10,261,-8,248,10,242,18,242,-5,261,-8,242,18,242,-5,242,18,238,27,242,-5,238,27,237,38,242,-5,237,38,225,4,244,82,252,103,267,159,267,159,252,103,263,123,267,159,263,123,276,140,276,140,280,144,295,165,295,165,280,144,284,147,295,165,284,147,290,149,241,143,220,120,225,4,241,143,225,4,237,38,241,143,237,38,239,59,241,143,239,59,244,82,241,143,244,82,267,159,200,60,203,38,206,91,206,91,203,38,212,18,206,91,212,18,220,120,220,120,212,18,225,4,326,134,325,155,319,143,319,143,325,155,312,163,319,143,312,163,311,149,311,149,312,163,300,151,295,151,300,151,295,165,295,151,295,165,290,149,295,165,267,159,276,140,312,163,295,165,300,151,339,71,343,107,341,127,339,71,341,127,335,143,339,71,335,143,331,108,265,4,261,-8,286,-2,67,228,70,245,71,317,71,317,70,245,75,262,71,317,75,262,97,332,97,332,75,262,82,278,97,332,82,278,90,293,90,293,95,302,97,332,97,332,95,302,101,309,97,332,101,309,127,338,127,338,101,309,107,314,127,338,107,314,115,319,77,183,89,163,85,178,85,178,89,163,94,176,115,182,94,176,99,164,115,182,99,164,108,166,71,190,67,200,70,166,71,190,70,166,89,163,71,190,89,163,77,183,67,200,66,211,70,166,70,166,66,211,54,176,54,176,66,211,71,317,71,317,66,211,67,228,148,307,153,305,150,330,148,307,150,330,144,310,144,310,150,330,144,334,144,310,144,334,140,312,140,312,144,334,138,336,140,312,138,336,135,316,135,316,138,336,133,338,135,316,133,338,131,320,131,320,133,338,127,338,131,320,127,338,126,325,247,301,248,317,236,295,236,295,248,317,235,309,236,295,235,309,223,292,223,292,235,309,221,305,223,292,221,305,209,291,209,291,221,305,205,305,194,305,185,307,187,294,194,305,187,294,194,292,194,305,194,292,201,292,194,305,201,292,205,305,176,311,171,299,179,296,176,311,179,296,185,307,185,307,179,296,187,294,167,317,157,324,157,301,167,317,157,301,159,297,167,317,159,297,160,292,167,317,160,292,161,285,167,317,161,285,165,234,167,317,165,234,171,255,167,317,171,255,171,299,167,317,171,299,176,311,124,175,132,181,133,198,133,198,132,181,146,197,133,198,146,197,148,222,148,222,146,197,157,215,148,222,157,215,157,251,157,251,157,215,165,234,157,251,165,234,161,285,310,353,289,353,269,320,269,320,289,353,265,331,269,320,265,331,258,309,258,309,265,331,248,317,258,309,248,317,247,301,269,320,72,-8,95,-8,269,320,95,-8,310,353,172,276,172,281,172,285,172,276,172,285,172,289,172,276,172,289,171,294,172,276,171,294,171,299,172,276,171,299,171,255,116,169,124,175,133,198,116,169,133,198,115,182,116,169,115,182,108,166,157,324,150,330,153,305,157,324,153,305,157,301,31,232,34,209,36,264,36,264,34,209,42,191,36,264,42,191,50,293,50,293,42,191,54,176,50,293,54,176,71,317,94,176,89,163,99,164,127,338,115,319,126,325,209,291,205,305,201,292,325,155,326,134,335,143, +368,55,359,45,350,38,342,33,332,30,321,29,304,31,288,36,274,46,259,58,246,75,260,96,273,115,284,134,296,152,309,173,316,184,323,192,332,198,342,201,355,203,355,213,248,213,248,203,261,201,270,197,276,193,279,187,280,179,278,165,273,150,264,133,251,113,234,89,218,107,205,126,192,146,180,167,168,192,199,207,221,222,235,238,243,256,246,276,242,298,233,315,218,328,199,335,177,338,153,335,132,325,116,309,105,288,101,263,101,250,103,237,106,223,111,207,118,189,99,177,72,158,50,138,34,116,24,92,21,69,25,42,36,20,53,5,77,-3,107,-6,130,-4,151,0,172,9,193,22,214,39,233,22,250,9,266,0,283,-4,300,-6,319,-3,336,3,352,14,365,30,375,50,16383,16383,219,278,217,261,211,246,200,233,183,220,161,208,152,225,146,239,143,253,141,266,141,281,142,294,148,306,156,315,167,320,180,322,193,320,204,314,212,304,217,292,219,278,16383,16383,202,52,185,40,170,31,155,25,142,21,129,20,109,23,92,31,79,45,70,64,67,87,69,106,75,124,86,140,103,155,126,171,142,141,156,115,170,92,202,52,50,215,56,244,60,269,64,290,66,306,66,324,63,330,59,334,53,337,46,338,39,337,33,334,28,330,25,324,24,317,25,306,27,289,31,268,35,243,40,215,152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,103,-56,146,-88,15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,130,243,130,262,131,270,133,278,135,287,140,302,142,307,143,312,144,316,144,320,143,326,140,331,136,335,131,337,126,338,120,337,115,335,111,331,109,326,108,321,108,317,110,307,111,301,113,295,115,285,118,276,121,249,121,243,110,249,101,255,93,262,85,270,76,280,70,286,65,290,60,293,56,295,51,296,46,295,41,292,38,288,36,283, +153,335,132,325,142,294,142,294,132,325,141,281,142,141,141,281,132,325,142,141,132,325,126,171,118,189,103,155,126,171,118,189,126,171,132,325,118,189,132,325,116,309,118,189,116,309,111,207,99,177,72,158,75,124,99,177,75,124,86,140,99,177,86,140,103,155,99,177,103,155,118,189,72,158,50,138,53,5,72,158,53,5,67,87,72,158,67,87,69,106,72,158,69,106,75,124,79,45,70,64,77,-3,77,-3,70,64,67,87,53,5,50,138,36,20,36,20,50,138,34,116,36,20,34,116,25,42,25,42,34,116,24,92,25,42,24,92,21,69,101,250,103,237,105,288,105,288,103,237,106,223,105,288,106,223,116,309,116,309,106,223,111,207,185,40,170,31,172,9,172,9,170,31,155,25,172,9,155,25,151,0,151,0,155,25,142,21,151,0,142,21,130,-4,130,-4,142,21,129,20,109,23,92,31,107,-6,109,23,107,-6,130,-4,109,23,130,-4,129,20,79,45,77,-3,107,-6,79,45,107,-6,92,31,246,75,251,113,234,89,246,75,234,89,250,9,250,9,234,89,233,22,233,22,234,89,218,107,233,22,218,107,214,39,214,39,218,107,205,126,214,39,205,126,202,52,202,52,205,126,192,146,202,52,192,146,186,72,186,72,192,146,180,167,186,72,180,167,170,92,170,92,180,167,168,192,170,92,168,192,161,208,156,115,170,92,161,208,156,115,161,208,152,225,156,115,152,225,146,239,156,115,146,239,143,253,156,115,143,253,142,141,141,266,141,281,142,141,141,266,142,141,143,253,142,294,148,306,153,335,153,335,148,306,156,315,153,335,156,315,177,338,177,338,156,315,167,320,177,338,167,320,180,322,180,322,193,320,199,335,199,335,193,320,204,314,199,335,204,314,218,328,218,328,204,314,212,304,218,328,212,304,217,292,217,261,221,222,219,278,219,278,221,222,233,315,233,315,221,222,235,238,233,315,235,238,242,298,242,298,235,238,243,256,242,298,243,256,246,276,218,328,217,292,219,278,218,328,219,278,233,315,199,335,177,338,180,322,183,220,168,192,199,207,183,220,199,207,200,233,200,233,199,207,221,222,200,233,221,222,211,246,211,246,221,222,217,261,183,220,161,208,168,192,193,22,214,39,202,52,193,22,202,52,185,40,193,22,185,40,172,9,246,75,250,9,259,58,259,58,250,9,266,0,259,58,266,0,274,46,274,46,266,0,283,-4,274,46,283,-4,288,36,288,36,283,-4,300,-6,288,36,300,-6,304,31,304,31,300,-6,319,-3,304,31,319,-3,321,29,321,29,319,-3,336,3,321,29,336,3,332,30,270,197,276,193,355,213,355,213,276,193,279,187,355,213,279,187,280,179,280,179,284,134,296,152,280,179,296,152,309,173,309,173,316,184,280,179,280,179,316,184,323,192,280,179,323,192,332,198,342,201,355,203,355,213,342,201,355,213,332,198,332,198,355,213,280,179,261,201,270,197,355,213,261,201,355,213,248,213,261,201,248,213,248,203,280,179,278,165,284,134,284,134,278,165,273,150,284,134,273,150,273,115,273,115,273,150,264,133,273,115,264,133,260,96,260,96,264,133,251,113,260,96,251,113,246,75,375,50,368,55,365,30,365,30,368,55,359,45,365,30,359,45,352,14,352,14,359,45,350,38,352,14,350,38,342,33,342,33,332,30,336,3,342,33,336,3,352,14,77,-3,67,87,53,5,101,250,105,288,101,263, +50,215,56,244,60,269,64,290,66,306,66,324,63,330,59,334,53,337,46,338,39,337,33,334,28,330,25,324,24,317,25,306,27,289,31,268,35,243,40,215,152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17, +24,317,25,306,25,324,25,324,25,306,27,289,25,324,27,289,28,330,28,330,27,289,31,268,28,330,31,268,33,334,33,334,31,268,35,243,33,334,35,243,39,337,39,337,35,243,40,215,39,337,40,215,46,338,46,338,40,215,50,215,46,338,50,215,53,337,53,337,50,215,56,244,53,337,56,244,59,334,59,334,56,244,60,269,59,334,60,269,63,330,63,330,60,269,64,290,63,330,64,290,66,324,66,324,64,290,66,306,66,324,66,306,66,318, +152,-79,116,-44,92,-8,77,31,69,76,67,127,69,180,77,223,92,261,116,295,152,330,147,338,104,307,69,270,44,227,29,179,24,126,29,75,44,27,69,-17,103,-56,146,-88,15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338, +24,126,29,75,29,179,29,179,29,75,44,27,29,179,44,27,44,227,44,227,44,27,69,-17,44,227,69,-17,67,127,67,127,69,270,44,227,116,295,152,330,147,338,116,295,147,338,104,307,116,295,104,307,92,261,67,127,69,180,69,270,69,270,69,180,77,223,69,270,77,223,104,307,104,307,77,223,92,261,116,-44,92,-8,103,-56,116,-44,103,-56,146,-88,116,-44,146,-88,152,-79,77,31,69,76,69,-17,77,31,69,-17,103,-56,77,31,103,-56,92,-8,67,127,69,-17,69,76, +15,330,51,295,76,259,90,219,97,174,99,122,97,69,90,26,75,-11,51,-45,15,-79,19,-88,62,-56,97,-19,122,23,137,71,142,123,137,174,121,222,96,267,63,306,21,338,134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251, +97,174,99,122,99,122,122,23,99,122,97,69,122,23,97,69,97,-19,97,-19,97,69,90,26,97,-19,90,26,75,-11,97,174,99,122,121,222,121,222,99,122,122,23,121,222,122,23,137,174,137,174,122,23,137,71,137,174,137,71,142,123,96,267,63,306,76,259,96,267,76,259,90,219,96,267,90,219,97,174,96,267,97,174,121,222,51,295,76,259,63,306,51,295,63,306,21,338,51,295,21,338,15,330,15,-79,19,-88,51,-45,51,-45,19,-88,62,-56,51,-45,62,-56,75,-11,75,-11,62,-56,97,-19, +134,235,147,243,158,248,178,254,190,256,200,258,207,261,212,265,215,270,216,277,215,284,213,289,209,293,204,295,198,296,190,294,183,288,174,281,166,272,159,264,154,259,144,251,130,243,130,262,131,270,133,278,135,287,140,302,142,307,143,312,144,316,144,320,143,326,140,331,136,335,131,337,126,338,120,337,115,335,111,331,109,326,108,321,108,317,110,307,111,301,113,295,115,285,118,276,121,249,121,243,110,249,101,255,93,262,85,270,76,280,70,286,65,290,60,293,56,295,51,296,46,295,41,292,38,288,36,283,35,277,36,270,40,265,46,261,56,257,69,254,78,252,87,249,97,246,106,242,117,235,106,229,97,224,88,221,78,218,65,215,53,213,45,210,39,205,35,200,34,193,35,187,37,182,41,178,46,176,52,175,57,176,61,177,65,179,74,188,81,196,92,207,94,210,97,212,105,218,112,222,121,228,121,224,120,212,119,201,118,192,115,183,113,174,111,169,109,163,108,159,107,154,107,151,108,145,110,140,114,136,119,133,124,132,130,133,136,136,140,141,143,146,145,152,144,154,144,157,143,161,141,164,140,169,136,179,130,212,130,228,134,225,140,221,147,217,153,212,161,205,169,196,175,188,182,182,187,178,193,175,199,175,205,176,210,178,216,188,217,194,215,201,212,206,206,210,198,213,186,215,176,218,165,220,147,228,138,233,318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,39,46,33,40,29,32,27,22,29,13,32,6,38,1,46,-1,56,-2,60,-2,63,-1,66,-1,68,0,73,0,75,-1,78,-4,78,-6,76,-16,71,-27,63,-38,51,-49,36,-60,142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,200,29,222,67,234,114,238,165,16383,16383,190,162,187,108,179,65,166,33,148,13,125,6,102,13,84,33,71,65,63,109,60,165,63,220,71,265,84,298,101,318,124,325,148,318,166,298,179,265,187,219,190,162,197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38, +69,254,69,254,78,252,69,254,78,252,70,286,69,254,70,286,65,290,69,254,65,290,60,293,69,254,60,293,56,295,69,254,56,295,56,257,51,296,46,295,46,261,51,296,46,261,56,257,51,296,56,257,56,295,36,283,36,270,38,288,38,288,36,270,40,265,38,288,40,265,41,292,41,292,40,265,46,261,41,292,46,261,46,295,81,196,86,201,88,221,88,221,86,201,89,204,88,221,89,204,97,224,97,224,89,204,92,207,97,224,92,207,94,210,94,210,97,212,97,224,97,224,97,212,106,229,78,218,65,215,69,183,78,218,69,183,74,188,78,218,74,188,81,196,78,218,81,196,88,221,110,140,114,136,111,169,111,169,114,136,113,174,115,183,113,174,114,136,115,183,114,136,119,133,144,157,143,161,143,146,144,157,143,146,145,152,144,157,145,152,144,154,141,164,140,169,140,141,141,164,140,141,143,146,141,164,143,146,143,161,136,179,134,190,136,136,136,179,136,136,140,141,136,179,140,141,140,169,134,190,132,201,136,136,136,136,132,201,130,212,136,136,130,212,130,133,130,133,130,212,130,224,126,338,120,337,120,258,126,338,120,258,121,249,126,338,121,249,121,228,126,338,121,228,124,132,126,338,124,132,130,133,126,338,130,133,130,224,126,338,130,224,130,243,126,338,130,243,130,255,126,338,130,255,131,337,121,243,121,228,121,249,120,337,115,335,115,285,120,337,115,285,118,276,120,337,118,276,119,267,120,337,119,267,120,258,113,295,115,285,115,335,113,295,115,335,111,331,113,295,111,331,111,301,204,295,198,296,200,258,200,258,198,296,190,294,200,258,190,294,190,256,190,256,190,294,183,288,190,256,183,288,178,254,178,254,183,288,174,281,178,254,174,281,168,251,168,251,174,281,166,272,168,251,166,272,159,264,159,264,154,259,158,248,158,248,154,259,149,255,158,248,149,255,147,243,147,243,149,255,144,251,147,243,144,251,137,247,130,243,130,228,134,225,130,243,134,225,134,235,130,243,134,235,137,247,137,247,134,235,147,243,176,218,165,220,169,196,176,218,169,196,175,188,176,218,175,188,182,182,176,218,182,182,186,215,199,175,205,176,206,210,206,210,205,176,210,178,206,210,210,178,212,206,212,206,210,178,213,183,212,206,213,183,215,201,215,201,213,183,216,188,215,201,216,188,217,194,198,213,186,215,187,178,198,213,187,178,193,175,198,213,193,175,199,175,198,213,199,175,206,210,216,277,215,284,215,270,215,270,215,284,213,289,215,270,213,289,212,265,212,265,213,289,209,293,212,265,209,293,207,261,207,261,209,293,204,295,207,261,204,295,200,258,159,264,158,248,168,251,161,205,169,196,165,220,161,205,165,220,156,224,161,205,156,224,153,212,147,228,138,233,140,221,147,228,140,221,147,217,147,228,147,217,153,212,147,228,153,212,156,224,143,326,140,331,142,307,143,326,142,307,143,312,143,326,143,312,144,316,143,326,144,316,144,320,133,278,135,287,136,335,136,335,135,287,138,296,136,335,138,296,140,331,140,331,138,296,140,302,140,331,140,302,142,307,131,337,130,255,130,262,131,337,130,262,131,270,131,337,131,270,133,278,131,337,133,278,136,335,134,235,134,225,140,221,134,235,140,221,138,233,124,132,121,228,121,224,124,132,121,224,120,212,124,132,120,212,119,201,124,132,119,201,119,133,118,192,115,183,119,133,118,192,119,133,119,201,101,215,105,218,106,229,106,229,105,218,112,222,106,229,112,222,117,235,117,235,112,222,121,228,117,235,121,228,121,243,76,280,78,252,85,270,85,270,78,252,87,249,85,270,87,249,93,262,93,262,87,249,97,246,93,262,97,246,101,255,101,255,97,246,106,242,101,255,106,242,110,249,110,249,106,242,117,235,110,249,117,235,121,243,108,317,109,312,109,326,109,326,109,312,110,307,109,326,110,307,111,331,111,331,110,307,111,301,111,169,109,163,110,140,110,140,109,163,108,159,110,140,108,159,108,145,108,145,108,159,107,154,108,145,107,154,107,151,65,215,53,213,57,176,65,215,57,176,61,177,65,215,61,177,65,179,65,215,65,179,69,183,34,193,35,187,35,200,35,200,35,187,37,182,35,200,37,182,39,205,39,205,37,182,41,178,39,205,41,178,45,210,45,210,41,178,46,176,45,210,46,176,53,213,53,213,46,176,52,175,53,213,52,175,57,176,70,286,78,252,76,280,106,229,97,212,101,215,108,317,109,326,108,321,187,178,186,215,182,182,36,270,36,283,35,277, +318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49, +188,273,155,273,188,-20,188,-20,155,273,155,143,188,-20,155,143,155,110,155,110,155,143,24,143,155,110,24,143,24,110,188,110,318,110,188,143,188,143,318,110,318,143,188,-20,155,110,155,-20, +41,-69,60,-58,76,-44,88,-27,95,-10,98,7,96,22,90,34,81,43,70,49,57,51,47,49,39,46,33,40,29,32,27,22,29,13,32,6,38,1,46,-1,56,-2,60,-2,63,-1,66,-1,68,0,73,0,75,-1,78,-4,78,-6,76,-16,71,-27,63,-38,51,-49,36,-60,142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330, +63,-1,66,-1,70,49,70,49,66,-1,68,0,70,49,68,0,71,0,71,0,73,0,81,43,81,43,73,0,75,-1,81,43,75,-1,77,-3,27,22,29,13,29,32,29,32,29,13,32,6,29,32,32,6,33,40,33,40,32,6,38,1,33,40,38,1,39,46,39,46,38,1,46,-1,39,46,46,-1,47,49,47,49,46,-1,56,-2,47,49,56,-2,57,51,57,51,56,-2,60,-2,57,51,60,-2,70,49,70,49,60,-2,63,-1,98,7,96,22,95,-10,95,-10,96,22,90,34,95,-10,90,34,88,-27,88,-27,90,34,81,43,88,-27,81,43,78,-6,78,-6,76,-16,88,-27,88,-27,76,-16,76,-44,81,43,77,-3,78,-4,81,43,78,-4,78,-6,81,43,70,49,71,0,36,-60,41,-69,51,-49,51,-49,41,-69,60,-58,51,-49,60,-58,63,-38,63,-38,60,-58,76,-44,63,-38,76,-44,71,-27,71,-27,76,-44,76,-16, +142,97,142,128,20,128,20,97,90,22,89,30,85,38,79,44, +142,97,142,128,20,128,142,97,20,128,20,97, +90,22,89,30,85,38,79,44,71,49,63,50,54,49,46,45,40,39,37,31,35,22,37,13,40,6,46,0,54,-3,63,-5,71,-3,79,0,85,6,89,13,90,22,143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2, +35,22,37,13,37,31,37,31,37,13,40,6,37,31,40,6,40,39,40,39,40,6,46,0,40,39,46,0,46,45,46,45,46,0,54,-3,46,45,54,-3,54,49,54,49,54,-3,62,-5,54,49,62,-5,63,50,63,50,62,-5,71,-3,63,50,71,-3,71,49,71,49,71,-3,79,0,71,49,79,0,79,44,79,44,79,0,85,6,79,44,85,6,85,38,85,38,85,6,89,13,85,38,89,13,89,30,89,30,89,13,90,22, +143,338,110,338,-3,-6,30,-6,238,165,232,222,218,270,194,307, +143,338,110,338,-3,-6,143,338,-3,-6,30,-6, +238,165,232,222,218,270,194,307,164,330,127,338,84,329,52,304,29,266,16,220,12,168,16,118,27,71,48,31,80,3,125,-6,168,2,200,29,222,67,234,114,238,165,16383,16383,190,162,187,108,179,65,166,33,148,13,125,6,102,13,84,33,71,65,63,109,60,165,63,220,71,265,84,298,101,318,124,325,148,318,166,298,179,265,187,219,190,162,197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278, +101,318,124,325,124,325,127,338,124,325,148,318,127,338,148,318,164,330,164,330,148,318,166,298,164,330,166,298,194,307,194,307,166,298,179,265,194,307,179,265,187,219,166,33,168,2,179,65,179,65,168,2,200,29,179,65,200,29,187,108,187,108,200,29,190,162,194,307,190,162,200,29,194,307,200,29,218,270,218,270,200,29,222,67,218,270,222,67,232,222,232,222,222,67,234,114,232,222,234,114,238,165,125,6,125,-6,148,13,148,13,125,-6,168,2,148,13,168,2,166,33,71,265,84,298,84,329,84,329,84,298,101,318,84,329,101,318,127,338,127,338,101,318,124,325,12,168,16,118,16,220,16,220,16,118,27,71,16,220,27,71,29,266,29,266,27,71,48,31,29,266,48,31,52,304,52,304,48,31,63,109,52,304,63,109,60,165,60,165,63,220,52,304,52,304,63,220,71,265,52,304,71,265,84,329,102,13,84,33,80,3,102,13,80,3,125,-6,102,13,125,-6,125,6,80,3,84,33,71,65,80,3,71,65,63,109,80,3,63,109,48,31,194,307,187,219,190,162, +197,0,197,7,178,8,164,12,155,18,151,27,150,38,150,336,145,338,55,292,55,286,69,291,74,293,84,295,88,296,92,296,97,295,101,293,104,288,106,281,107,272,107,47,105,33,100,22,92,14,78,10,59,7,59,0,237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,195,302,176,321,150,334,119,338,86,333,59,320,39,299,24,271,15,238,26,236,38,262,50,280,63,292, +100,22,92,14,197,0,197,0,92,14,78,10,197,0,78,10,59,7,79,294,84,295,145,338,145,338,84,295,88,296,145,338,88,296,92,296,92,296,97,295,145,338,145,338,97,295,101,293,145,338,101,293,104,288,164,12,155,18,107,47,107,47,155,18,151,27,107,47,151,27,107,272,106,281,107,272,145,338,106,281,145,338,104,288,145,338,55,292,69,291,145,338,69,291,74,293,145,338,74,293,79,294,150,38,150,336,145,338,150,38,145,338,107,272,150,38,107,272,151,27,197,0,197,7,178,8,197,0,178,8,164,12,197,0,164,12,105,33,197,0,105,33,100,22,197,0,59,7,59,0,105,33,164,12,107,47,69,291,55,292,55,286, +237,69,230,71,221,57,212,48,203,42,193,39,182,38,65,38,147,126,171,153,189,179,202,203,209,226,211,250,207,278,195,302,176,321,150,334,119,338,86,333,59,320,39,299,24,271,15,238,26,236,38,262,50,280,63,292,79,299,99,301,123,298,142,289,156,275,165,255,169,230,166,205,159,181,146,155,128,129,103,100,15,6,15,0,210,0,31,255,43,275,57,290,71,300,87,306,105,308,123,306,138,300,149,290,157,275,159,257,157,240,152,224,143,211,132,199,118,190,112,186,105,183,96,179,87,176,76,172,76,165,92,165,104,164,113,163,121,162,127,160,146,152,161,141,171,127,178,109,180,88,176,63,167,42,153,26,135,15,114,11,106,11,99,13,90,15,82,20,71,26,64,31, +26,236,38,262,39,299,39,299,38,262,50,280,39,299,50,280,59,320,59,320,50,280,63,292,59,320,63,292,86,333,86,333,63,292,79,299,86,333,79,299,99,301,99,301,123,298,119,338,119,338,123,298,150,334,24,271,15,238,26,236,24,271,26,236,39,299,166,205,171,153,169,230,169,230,171,153,176,321,176,321,171,153,189,179,176,321,189,179,195,302,195,302,189,179,202,203,195,302,202,203,207,278,207,278,202,203,209,226,207,278,209,226,211,250,176,321,150,334,156,275,176,321,156,275,165,255,176,321,165,255,169,230,150,334,123,298,142,289,150,334,142,289,156,275,159,181,146,155,147,126,159,181,147,126,171,153,159,181,171,153,166,205,15,0,210,0,15,6,15,6,210,0,65,38,15,6,65,38,103,100,103,100,65,38,147,126,103,100,147,126,128,129,128,129,147,126,146,155,119,338,86,333,99,301,212,48,203,42,210,0,210,0,203,42,193,39,210,0,193,39,182,38,210,0,182,38,65,38,237,69,230,71,221,57,237,69,221,57,212,48,237,69,212,48,210,0, +31,255,43,275,57,290,71,300,87,306,105,308,123,306,138,300,149,290,157,275,159,257,157,240,152,224,143,211,132,199,118,190,112,186,105,183,96,179,87,176,76,172,76,165,92,165,104,164,113,163,121,162,127,160,146,152,161,141,171,127,178,109,180,88,176,63,167,42,153,26,135,15,114,11,106,11,99,13,90,15,82,20,71,26,64,31,57,35,51,38,41,40,34,39,29,36,25,32,22,27,21,22,23,12,30,4,41,-1,57,-5,76,-6,103,-4,130,0,154,9,175,22,193,40,200,52,207,65,211,79,214,94,215,109,214,125,212,139,207,152,201,164,194,174,187,180,181,185,173,190,164,195,152,200,170,213,183,226,192,241,197,255,199,270,195,292,184,311,168,326,146,335,121,338,92,334,68,323,48,306,33,284,22,257,237,84,237,116,185,116,185,338,163,338,6,116,6,84,146,84,146,0,185,0,185,84,16383,16383,146,116,26,116,146,287,219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,145,171,156,159,166,146,172,131,177,114,178,96,174,71,164,48,149,29,131,16,110,12,104,12,98,14,90,17,83,21,75,27,66,34,58,39,51,41,45,43,38,43,30,42,24,40,19,36,17,31,16,24,19,13,27,5,40,-1,58,-5,79,-6,99,-5,117,-2,134,1,149,8,164,17,182,33,196,51,206,71,211,95,213,122,213,137,211,150,207,162,202,174,195,185,178,205,159,220,137,232,108,241,70,249,90,291,188,291,192,292,198,294,200,296,201,298,223,342,185,337,152,329,123,317, +22,257,31,255,33,284,33,284,31,255,43,275,33,284,43,275,48,306,48,306,43,275,57,290,48,306,57,290,68,323,68,323,57,290,71,300,68,323,71,300,92,334,92,334,71,300,87,306,92,334,87,306,105,308,105,308,123,306,121,338,121,338,123,306,146,335,123,306,138,300,146,335,146,335,138,300,149,290,146,335,149,290,168,326,168,326,149,290,157,275,168,326,157,275,159,257,159,257,157,240,170,213,170,213,157,240,152,200,170,213,183,226,184,311,184,311,183,226,192,241,184,311,192,241,195,292,195,292,192,241,197,255,195,292,197,255,199,270,170,213,184,311,168,326,170,213,168,326,159,257,152,200,157,240,152,224,152,200,152,224,146,152,152,200,146,152,161,141,152,200,161,141,164,195,164,195,171,127,173,190,173,190,171,127,178,109,173,190,178,109,181,185,181,185,178,109,180,88,193,40,180,88,176,63,193,40,176,63,175,22,175,22,176,63,167,42,175,22,167,42,154,9,154,9,167,42,153,26,154,9,153,26,135,15,132,199,127,160,146,152,132,199,146,152,143,211,143,211,146,152,152,224,215,109,214,125,214,94,214,94,214,125,212,139,214,94,212,139,211,79,211,79,212,139,207,152,211,79,207,152,207,65,207,65,207,152,201,164,207,65,201,164,200,52,200,52,201,164,194,174,200,52,194,174,193,40,193,40,194,174,187,180,193,40,187,180,181,185,103,-4,130,0,106,11,106,11,130,0,114,11,135,15,114,11,130,0,135,15,130,0,154,9,87,176,76,172,92,165,87,176,92,165,96,179,96,179,92,165,104,164,96,179,104,164,105,183,105,183,104,164,113,163,105,183,113,163,112,186,112,186,113,163,118,190,132,199,118,190,121,162,132,199,121,162,127,160,121,338,92,334,105,308,118,190,113,163,121,162,103,-4,106,11,99,13,103,-4,99,13,90,15,103,-4,90,15,82,20,103,-4,82,20,76,-6,76,-6,82,20,71,26,76,-6,71,26,64,31,76,-6,64,31,57,35,76,-6,57,35,57,-5,57,35,51,38,57,-5,57,-5,51,38,46,39,57,-5,46,39,41,-1,41,-1,46,39,41,40,41,-1,41,40,34,39,30,4,41,-1,34,39,30,4,34,39,29,36,30,4,29,36,25,32,30,4,25,32,23,12,22,27,21,22,23,12,22,27,23,12,25,32,92,165,76,172,76,165,180,88,193,40,181,185,164,195,161,141,171,127, +237,84,237,116,185,116,185,338,163,338,6,116,6,84,146,84,146,0,185,0,185,84,16383,16383,146,116,26,116,146,287,219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182, +6,84,146,84,6,116,6,116,146,84,26,116,6,116,26,116,163,338,163,338,26,116,146,287,163,338,146,287,185,0,185,0,146,287,146,116,185,0,146,116,146,84,146,84,146,116,26,116,163,338,185,0,185,338,185,116,185,84,237,84,185,116,237,84,237,116,185,0,146,84,146,0, +219,340,214,344,210,339,206,335,202,333,197,331,87,331,32,213,32,208,34,206,38,206,65,204,89,199,110,191,129,182,145,171,156,159,166,146,172,131,177,114,178,96,174,71,164,48,149,29,131,16,110,12,104,12,98,14,90,17,83,21,75,27,66,34,58,39,51,41,45,43,38,43,30,42,24,40,19,36,17,31,16,24,19,13,27,5,40,-1,58,-5,79,-6,99,-5,117,-2,134,1,149,8,164,17,182,33,196,51,206,71,211,95,213,122,213,137,211,150,207,162,202,174,195,185,178,205,159,220,137,232,108,241,70,249,90,291,188,291,192,292,198,294,200,296,201,298,223,342,185,337,152,329,123,317,97,300,71,277,52,254,37,229,26,201,19,171,17,140,18,118,21,98,26,78,33,60,41,44,53,26,68,12,86,1,106,-4,129,-6,148,-5,166,0,182,7,196,17,209,30,218,43,225,57,230,73,233,91,234,109,230,145,217,174,198,196,172,209,140,214,127,213,115,211,103,207,90,201,76,191,89,234,111,270,142,300,180,321,224,334,16383,16383,189,94,187,65,180,41,169,23,154,11,134,7,109,13,89,30,75,56,66,91,64,133,67,157,76,173,89,184,105,189,122,191,146,187,165,175,179,156,187,128,189,94,224,323,224,331,40,331,10,257, +211,95,213,122,213,137,211,95,213,137,211,150,211,95,211,150,207,162,211,95,207,162,206,71,178,205,178,96,182,33,178,205,182,33,195,185,195,185,182,33,196,51,195,185,196,51,202,174,202,174,196,51,206,71,202,174,206,71,207,162,149,8,164,17,164,48,164,48,164,17,182,33,164,48,182,33,174,71,174,71,182,33,178,96,110,12,117,-2,131,16,131,16,117,-2,134,1,131,16,134,1,149,29,149,29,134,1,149,8,149,29,149,8,164,48,202,333,197,331,198,294,202,333,198,294,200,296,202,333,200,296,201,298,202,333,201,298,219,340,202,333,219,340,206,335,190,331,192,292,197,331,197,331,192,292,195,293,197,331,195,293,198,294,210,339,206,335,219,340,210,339,219,340,214,344,87,331,70,249,90,291,87,331,90,291,190,331,190,331,90,291,188,291,190,331,188,291,192,292,38,206,65,204,70,249,70,249,65,204,89,199,70,249,89,199,108,241,108,241,89,199,110,191,108,241,110,191,137,232,137,232,110,191,129,182,137,232,129,182,145,171,145,171,156,159,159,220,159,220,156,159,166,146,159,220,166,146,178,205,178,205,166,146,172,131,178,205,172,131,177,114,87,331,32,213,33,207,87,331,33,207,34,206,87,331,34,206,36,206,87,331,36,206,38,206,87,331,38,206,70,249,32,213,32,212,33,207,33,207,32,212,32,208,32,208,32,212,32,211,79,-6,99,-5,83,21,79,-6,83,21,75,27,79,-6,75,27,66,34,79,-6,66,34,58,39,79,-6,58,39,58,-5,58,39,51,41,58,-5,58,-5,51,41,45,43,58,-5,45,43,40,-1,40,-1,45,43,38,43,40,-1,38,43,30,42,27,5,40,-1,30,42,27,5,30,42,24,40,27,5,24,40,19,36,27,5,19,36,19,13,17,31,16,24,19,13,17,31,19,13,19,36,104,12,98,14,99,-5,104,12,99,-5,117,-2,104,12,117,-2,110,12,159,220,137,232,145,171,90,17,83,21,99,-5,90,17,99,-5,98,14,178,205,177,114,178,96,32,208,32,211,32,210, +223,342,185,337,152,329,123,317,97,300,71,277,52,254,37,229,26,201,19,171,17,140,18,118,21,98,26,78,33,60,41,44,53,26,68,12,86,1,106,-4,129,-6,148,-5,166,0,182,7,196,17,209,30,218,43,225,57,230,73,233,91,234,109,230,145,217,174,198,196,172,209,140,214,127,213,115,211,103,207,90,201,76,191,89,234,111,270,142,300,180,321,224,334,16383,16383,189,94,187,65,180,41,169,23,154,11,134,7,109,13,89,30,75,56,66,91,64,133,67,157,76,173,89,184,105,189,122,191,146,187,165,175,179,156,187,128,189,94,224,323,224,331,40,331,10,257,19,253,30,270,40,282,51,289,62,293,78,294,185,294,86,-3,118,-3,223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,179,324,156,334,128,338,97,335,70,324,49,308,36,287,31,260,33,242,38,225,49,208,67,189,93,166,66,145,47,127,35,111,30,94,28,75,32,48,45,25,66,8,92,-2,124,-6,157,-2,185,8,205,26,218,49,223,78,16383,16383,177,267,176,249,171,234,162,220,149,207,131,195,107,210,90,225,77,240,70,257,68,275,71,292,78,305, +140,214,127,213,146,187,146,187,127,213,122,191,105,189,122,191,115,211,105,189,115,211,103,207,64,133,67,157,71,277,71,277,67,157,76,173,71,277,76,173,76,191,76,191,76,173,89,184,76,191,89,184,90,201,90,201,89,184,105,189,90,201,105,189,103,207,127,213,115,211,122,191,187,65,180,41,182,7,182,7,180,41,169,23,182,7,169,23,166,0,166,0,169,23,154,11,166,0,154,11,148,-5,148,-5,154,11,134,7,148,-5,134,7,129,-6,129,-6,134,7,109,13,129,-6,109,13,106,-4,106,-4,109,13,89,30,106,-4,89,30,86,1,86,1,89,30,75,56,86,1,75,56,68,12,68,12,75,56,66,91,68,12,66,91,64,133,53,26,68,12,64,133,64,133,71,277,53,26,53,26,71,277,52,254,53,26,52,254,41,44,41,44,52,254,37,229,41,44,37,229,33,60,33,60,37,229,26,78,218,43,225,57,230,145,230,145,225,57,230,73,230,145,230,73,234,109,234,109,230,73,233,91,189,94,196,17,198,196,198,196,196,17,209,30,198,196,209,30,217,174,217,174,209,30,218,43,217,174,218,43,230,145,146,187,165,175,172,209,172,209,165,175,179,156,172,209,179,156,198,196,198,196,179,156,187,128,198,196,187,128,189,94,187,65,182,7,196,17,187,65,196,17,189,94,76,191,89,234,97,300,97,300,89,234,111,270,97,300,111,270,123,317,123,317,111,270,142,300,123,317,142,300,152,329,152,329,142,300,180,321,152,329,180,321,185,337,185,337,180,321,224,334,185,337,224,334,223,342,97,300,71,277,76,191,17,140,18,118,19,171,19,171,18,118,21,98,19,171,21,98,26,201,26,201,21,98,26,78,26,201,26,78,37,229,140,214,146,187,172,209, +224,323,224,331,40,331,10,257,19,253,30,270,40,282,51,289,62,293,78,294,185,294,86,-3,118,-3,223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309, +118,-3,224,323,185,294,185,294,224,323,224,331,185,294,224,331,78,294,62,293,78,294,224,331,62,293,224,331,40,331,40,331,10,257,19,253,40,331,19,253,30,270,40,331,30,270,40,282,40,331,40,282,51,289,40,331,51,289,62,293,118,-3,185,294,86,-3, +223,78,220,100,213,121,199,141,177,162,145,185,171,200,190,215,203,229,210,246,212,267,208,289,197,309,179,324,156,334,128,338,97,335,70,324,49,308,36,287,31,260,33,242,38,225,49,208,67,189,93,166,66,145,47,127,35,111,30,94,28,75,32,48,45,25,66,8,92,-2,124,-6,157,-2,185,8,205,26,218,49,223,78,16383,16383,177,267,176,249,171,234,162,220,149,207,131,195,107,210,90,225,77,240,70,257,68,275,71,292,78,305,89,316,104,322,123,324,142,322,157,314,168,302,175,286,177,267,16383,16383,136,136,154,122,167,109,177,95,183,79,185,62,182,44,175,29,163,17,148,10,129,7,108,10,91,19,77,34,69,54,66,79,67,97,71,113,79,128,90,142,106,156,30,-10,65,-4,95,3,121,13,145,28,170,49,191,72,208,100,220,130,227,163,229,197,228,221,224,244,217,265,209,284,198,300,185,313,171,324,155,332,138,337,119,338,85,332,57,316,35,291,20,258,15,220,19,186,31,158,50,137,75,123,105,118,122,119,138,122,153,128,167,136,180,147,164,101,140,63,109,33,71,12,28,0,16383,16383,181,177,177,163,167,153,153,146,137,141,123,140,102,144,85,157,72,177,64,204,61,237,62,253,64,269,68,284,73,297,79,307,84,313,91,318,98,321,106,323,115,324,139,319,157,304,170,278,178,243,181,197,96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176, +167,109,177,162,154,122,154,122,177,162,145,185,154,122,145,185,136,136,136,136,145,185,149,207,136,136,149,207,131,195,131,195,107,210,136,136,136,136,107,210,106,156,90,142,106,156,93,166,66,8,69,54,66,79,66,79,67,97,66,145,66,145,67,97,71,113,66,145,71,113,93,166,93,166,71,113,79,128,93,166,79,128,90,142,30,94,32,48,35,111,35,111,32,48,45,25,35,111,45,25,47,127,47,127,45,25,66,8,47,127,66,8,66,145,66,145,66,8,66,79,107,210,90,225,93,166,107,210,93,166,106,156,90,225,77,240,93,166,93,166,77,240,70,257,93,166,70,257,67,189,67,189,70,257,68,275,70,324,68,275,71,292,70,324,71,292,78,305,128,338,123,324,142,322,128,338,142,322,156,334,156,334,142,322,157,314,156,334,157,314,179,324,179,324,157,314,168,302,179,324,168,302,175,286,182,44,175,29,185,8,185,8,175,29,163,17,185,8,163,17,157,-2,157,-2,163,17,148,10,157,-2,148,10,129,7,129,7,108,10,124,-6,124,-6,108,10,92,-2,92,-2,108,10,91,19,92,-2,91,19,77,34,92,-2,77,34,69,54,92,-2,69,54,66,8,78,305,89,316,97,335,97,335,89,316,104,322,97,335,104,322,128,338,128,338,104,322,123,324,49,308,36,287,38,225,49,308,38,225,49,208,49,308,49,208,67,189,49,308,67,189,68,275,49,308,68,275,70,324,36,287,31,260,33,242,36,287,33,242,38,225,171,200,190,215,176,249,176,249,190,215,177,267,179,324,177,267,190,215,179,324,190,215,197,309,197,309,190,215,203,229,197,309,203,229,208,289,208,289,203,229,210,246,208,289,210,246,212,267,171,200,176,249,171,234,171,200,171,234,162,220,171,200,162,220,149,207,171,200,149,207,145,185,223,78,220,100,218,49,218,49,220,100,213,121,218,49,213,121,205,26,205,26,213,121,199,141,205,26,199,141,185,62,185,62,199,141,183,79,177,95,183,79,199,141,177,95,199,141,177,162,177,95,177,162,167,109,185,62,185,8,205,26,129,7,124,-6,157,-2,182,44,185,8,185,62,179,324,175,286,177,267,70,324,78,305,97,335,32,48,30,94,28,75, +30,-10,65,-4,95,3,121,13,145,28,170,49,191,72,208,100,220,130,227,163,229,197,228,221,224,244,217,265,209,284,198,300,185,313,171,324,155,332,138,337,119,338,85,332,57,316,35,291,20,258,15,220,19,186,31,158,50,137,75,123,105,118,122,119,138,122,153,128,167,136,180,147,164,101,140,63,109,33,71,12,28,0,16383,16383,181,177,177,163,167,153,153,146,137,141,123,140,102,144,85,157,72,177,64,204,61,237,62,253,64,269,68,284,73,297,79,307,84,313,91,318,98,321,106,323,115,324,139,319,157,304,170,278,178,243,181,197,96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,85,179,91,185,95,193,96,201,16383,16383,96,22,95,31,91,38,85,45,77,49,69,50,60,49,52,45,46,39,42,31,41,22,42,13,46,6,52,0,60,-3,69,-5,77,-3,85,0,91,6,95,13,96,22,95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44, +62,253,64,269,57,316,57,316,64,269,68,284,57,316,68,284,85,332,85,332,68,284,73,297,85,332,73,297,79,307,79,307,84,313,85,332,85,332,84,313,91,318,85,332,91,318,119,338,119,338,91,318,98,321,119,338,98,321,106,323,119,338,106,323,115,324,115,324,139,319,119,338,119,338,139,319,138,337,123,140,105,118,122,119,123,140,122,119,138,122,123,140,102,144,105,118,85,157,72,177,75,123,85,157,75,123,105,118,85,157,105,118,102,144,61,237,62,253,57,316,61,237,57,316,50,137,61,237,50,137,64,204,64,204,50,137,75,123,64,204,75,123,72,177,15,220,19,186,20,258,20,258,19,186,31,158,20,258,31,158,35,291,35,291,31,158,50,137,35,291,50,137,57,316,137,141,123,140,138,122,137,141,138,122,153,146,153,146,138,122,153,128,153,146,153,128,167,153,167,153,153,128,167,136,167,153,167,136,177,163,177,163,167,136,180,147,177,163,180,147,181,177,181,177,180,147,191,72,181,177,191,72,181,197,178,243,181,197,185,313,178,243,185,313,171,324,138,337,139,319,155,332,155,332,139,319,157,304,155,332,157,304,171,324,171,324,157,304,170,278,171,324,170,278,178,243,229,197,228,221,227,163,227,163,228,221,224,244,227,163,224,244,220,130,220,130,224,244,217,265,220,130,217,265,209,284,220,130,209,284,208,100,208,100,209,284,198,300,208,100,198,300,191,72,191,72,198,300,185,313,191,72,185,313,181,197,30,-10,65,-4,71,12,71,12,65,-4,95,3,71,12,95,3,109,33,109,33,95,3,121,13,109,33,121,13,140,63,140,63,121,13,145,28,140,63,145,28,164,101,164,101,145,28,170,49,164,101,170,49,180,147,180,147,170,49,191,72,71,12,28,0,30,-10, +96,201,95,210,91,218,85,224,77,228,69,229,60,228,52,224,46,218,42,211,41,201,42,193,46,185,52,179,60,176,69,174,77,176,85,179,91,185,95,193,96,201,16383,16383,96,22,95,31,91,38,85,45,77,49,69,50,60,49,52,45,46,39,42,31,41,22,42,13,46,6,52,0,60,-3,69,-5,77,-3,85,0,91,6,95,13,96,22,95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,100,-28,107,-11,109,7,107,22,102,34,93,43,82,49,70,51,60,49,52,46,46,40,42,32,40,23,41,14,45,7,51,2,59,-1,69,-2, +42,211,42,193,46,218,46,218,42,193,46,185,46,218,46,185,52,224,52,224,46,185,52,179,52,224,52,179,60,228,60,228,52,179,60,176,60,228,60,176,69,229,69,229,60,176,69,174,69,229,69,174,77,228,77,228,69,174,77,176,77,228,77,176,85,224,85,224,77,176,85,179,85,224,85,179,91,218,91,218,85,179,91,185,91,218,91,185,95,210,95,210,91,185,95,193,95,210,95,193,96,201,42,31,42,13,46,39,46,39,42,13,46,6,46,39,46,6,52,45,52,45,46,6,52,0,52,45,52,0,60,49,60,49,52,0,60,-3,60,49,60,-3,69,50,69,50,60,-3,69,-5,69,50,69,-5,77,49,77,49,69,-5,77,-3,77,49,77,-3,85,45,85,45,77,-3,85,0,85,45,85,0,91,38,91,38,85,0,91,6,91,38,91,6,95,31,95,31,91,6,95,13,95,31,95,13,96,22,42,13,42,31,41,22,42,193,42,211,41,201, +95,201,94,210,90,218,84,224,77,228,68,229,59,228,51,224,45,218,42,211,40,201,42,193,46,185,52,179,59,176,68,174,77,176,84,179,90,185,94,193,95,201,16383,16383,54,-69,73,-58,88,-44,100,-28,107,-11,109,7,107,22,102,34,93,43,82,49,70,51,60,49,52,46,46,40,42,32,40,23,41,14,45,7,51,2,59,-1,69,-2,72,-2,75,-1,78,-1,81,0,85,0,87,-2,89,-3,90,-5,90,-7,88,-17,83,-28,75,-38,63,-49,49,-60,310,-11,310,20,94,127,310,234,310,267,28,129,28,124,319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,24,93,24,60,310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,131,118,137,133,145,147,155,161,176,187,191,208,201,226,206,242,207,259,202,286,189,308,169,324,144,335,116,338,89,335,66,325,49,310,38,290,34,267,35,255,38,246,44,239,50,235,58,233,65,234,71,237,75,242,78,248,79,255,77,264,72,270,66,276, +42,211,42,193,45,218,45,218,42,193,46,185,45,218,46,185,51,224,51,224,46,185,52,179,51,224,52,179,59,228,59,228,52,179,59,176,59,228,59,176,68,229,68,229,59,176,68,174,68,229,68,174,77,228,77,228,68,174,77,176,77,228,77,176,84,224,84,224,77,176,84,179,84,224,84,179,90,218,90,218,84,179,90,185,90,218,90,185,94,210,94,210,90,185,94,193,94,210,94,193,95,201,75,-1,78,-1,82,49,82,49,78,-1,81,0,82,49,81,0,83,0,83,0,85,0,93,43,93,43,85,0,87,-2,93,43,87,-2,89,-3,40,23,41,14,42,32,42,32,41,14,45,7,42,32,45,7,46,40,46,40,45,7,51,2,46,40,51,2,52,46,52,46,51,2,59,-1,52,46,59,-1,60,49,60,49,59,-1,69,-2,60,49,69,-2,70,51,70,51,69,-2,72,-2,70,51,72,-2,82,49,82,49,72,-2,75,-1,109,7,107,22,107,-11,107,-11,107,22,102,34,107,-11,102,34,100,-28,100,-28,102,34,93,43,100,-28,93,43,90,-7,90,-7,88,-44,100,-28,93,43,89,-3,90,-5,93,43,90,-5,90,-7,93,43,82,49,83,0,88,-44,90,-7,88,-17,88,-44,88,-17,83,-28,88,-44,83,-28,75,-38,88,-44,75,-38,73,-58,63,-49,49,-60,54,-69,63,-49,54,-69,73,-58,63,-49,73,-58,75,-38,42,193,42,211,40,201, +310,-11,310,20,94,127,310,234,310,267,28,129,28,124,319,160,319,193,24,193,24,160,16383,16383,319,60,319,93, +94,127,310,234,310,267,94,127,310,267,28,129,94,127,28,129,310,-11,94,127,310,-11,310,20,310,-11,28,129,28,124, +319,160,319,193,24,193,24,160,16383,16383,319,60,319,93,24,93,24,60,310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101, +24,193,24,160,319,160,24,193,319,160,319,193,24,93,24,60,319,60,24,93,319,60,319,93, +310,124,310,129,28,267,28,234,244,127,28,20,28,-11,122,82,126,101,131,118,137,133,145,147,155,161,176,187, +310,124,310,129,28,267,310,124,28,267,28,234,310,124,28,234,244,127,310,124,244,127,28,20,310,124,28,20,28,-11, +122,82,126,101,131,118,137,133,145,147,155,161,176,187,191,208,201,226,206,242,207,259,202,286,189,308,169,324,144,335,116,338,89,335,66,325,49,310,38,290,34,267,35,255,38,246,44,239,50,235,58,233,65,234,71,237,75,242,78,248,79,255,77,264,72,270,66,276,62,283,60,292,62,301,69,310,80,317,92,321,107,323,124,320,139,312,151,300,159,283,161,264,160,246,156,227,150,209,136,171,126,147,120,127,116,109,114,95,113,82,16383,16383,145,22,144,30,140,38,134,44,127,48,119,49,110,48,103,44,97,38,93,31,92,22,93,14,97,7,102,1,110,-2,119,-3,127,-2,135,1,140,7,144,14,145,22,344,36,323,27,303,20,283,16,263,13,243,12,196,19,156,40,126,71,107,112,100,161,101,184,105,206,112,227,120,247,131,265,148,285,167,301,189,313,214,320,241,323,286,316,326,296,357,267,377,229,384,186,381,157,372,130,358,108,341,94,321,88,314,89,308,92,304,96,301,103,300,112,300,115,301,117,301,120,334,247,300,247,295,228,294,228,289,238,284,245,276,250,268,253,257,254,242,252,229,248,216,241,204,231,194,219,183,203,174,185,167,167,162,147,161,128,163,109,169,93,179,82,191,75,204,72,219,74,232,78,245,86,257,96,267,108,268,108,271,96,279,86,288,78,300,73,313,71,341,78,366,95,386,121, +60,292,60,292,60,292,60,292,66,325,49,310,60,292,49,310,50,235,60,292,50,235,58,233,144,335,116,338,124,320,124,320,116,338,107,323,92,321,107,323,116,338,92,321,116,338,89,335,60,292,62,301,66,325,66,325,62,301,69,310,66,325,69,310,89,335,89,335,69,310,80,317,89,335,80,317,92,321,34,267,35,255,38,290,38,290,35,255,38,246,38,290,38,246,49,310,49,310,38,246,44,239,49,310,44,239,50,235,62,283,65,234,66,276,66,276,65,234,71,237,66,276,71,237,72,270,72,270,71,237,75,242,72,270,75,242,77,264,77,264,75,242,78,248,77,264,78,248,79,255,65,234,62,283,60,292,65,234,60,292,58,233,119,49,119,-3,127,48,127,48,119,-3,127,-2,127,48,127,-2,134,44,134,44,127,-2,135,1,134,44,135,1,140,38,140,38,135,1,140,7,140,38,140,7,144,30,144,30,140,7,144,14,144,30,144,14,145,22,92,22,93,14,93,31,93,31,93,14,97,7,93,31,97,7,97,38,97,38,97,7,102,1,97,38,102,1,103,44,103,44,102,1,110,-2,103,44,110,-2,110,48,110,48,110,-2,119,-3,110,48,119,-3,119,49,124,320,139,312,144,335,144,335,139,312,151,300,144,335,151,300,169,324,169,324,151,300,159,283,169,324,159,283,161,264,161,264,160,246,176,187,176,187,160,246,156,227,176,187,156,227,155,161,155,161,156,227,150,209,155,161,150,209,145,147,145,147,150,209,143,190,145,147,143,190,137,133,137,133,143,190,136,171,137,133,136,171,131,118,131,118,136,171,126,147,131,118,126,147,126,101,126,101,126,147,122,82,202,286,189,308,191,208,202,286,191,208,201,226,202,286,201,226,206,242,202,286,206,242,207,259,176,187,191,208,189,308,176,187,189,308,169,324,176,187,169,324,161,264,122,82,126,147,120,127,122,82,120,127,116,109,122,82,116,109,114,95,122,82,114,95,113,82, +344,36,323,27,303,20,283,16,263,13,243,12,196,19,156,40,126,71,107,112,100,161,101,184,105,206,112,227,120,247,131,265,148,285,167,301,189,313,214,320,241,323,286,316,326,296,357,267,377,229,384,186,381,157,372,130,358,108,341,94,321,88,314,89,308,92,304,96,301,103,300,112,300,115,301,117,301,120,334,247,300,247,295,228,294,228,289,238,284,245,276,250,268,253,257,254,242,252,229,248,216,241,204,231,194,219,183,203,174,185,167,167,162,147,161,128,163,109,169,93,179,82,191,75,204,72,219,74,232,78,245,86,257,96,267,108,268,108,271,96,279,86,288,78,300,73,313,71,341,78,366,95,386,121,400,154,405,191,396,238,374,279,338,310,293,331,241,338,215,337,191,333,169,326,148,316,128,304,105,282,86,257,71,228,61,197,58,164,67,108,93,61,132,24,182,1,241,-6,261,-5,281,-2,302,2,324,10,350,22,16383,16383,286,202,285,187,282,171,277,155,271,138,264,123,257,113,250,105,242,99,234,95,226,94,216,96,207,101,201,110,197,122,196,137,197,150,199,163,203,175,208,186,214,197,223,209,234,219,244,226,254,231,263,232,271,231,277,227,282,221,285,213,286,202,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,140,313,172,309,197,301,214,287,225,268,228,245,225,223,217,205,202,193,181,186,153,183,16383,16383,108,163,139,162,162,161,181,158,198,152,215,143,224,136,231,126,235,115,238,103,239,89,238,77,236,66,232,56,227,47,220,40,207,30,194,24,179,20,161,19,138,18,126,19,118,21,112,26,109,32, +156,40,126,71,132,24,132,24,126,71,107,112,132,24,107,112,93,61,93,61,107,112,100,161,105,282,100,161,101,184,105,282,101,184,105,206,105,206,112,227,128,304,128,304,112,227,120,247,128,304,120,247,131,265,131,265,148,285,148,316,148,316,148,285,167,301,148,316,167,301,169,326,169,326,167,301,189,313,169,326,189,313,191,333,191,333,189,313,214,320,191,333,214,320,215,337,215,337,214,320,241,323,215,337,241,323,241,338,241,338,241,323,293,331,93,61,100,161,105,282,93,61,105,282,86,257,93,61,86,257,71,228,93,61,71,228,67,108,61,197,58,164,67,108,61,197,67,108,71,228,384,186,386,121,396,238,384,186,396,238,377,229,377,229,396,238,374,279,377,229,374,279,357,267,357,267,374,279,338,310,357,267,338,310,326,296,326,296,338,310,293,331,326,296,293,331,286,316,286,316,293,331,241,323,148,316,128,304,131,265,344,36,323,27,324,10,324,10,323,27,303,20,324,10,303,20,302,2,302,2,303,20,283,16,302,2,283,16,281,-2,281,-2,283,16,263,13,281,-2,263,13,261,-5,261,-5,263,13,243,12,261,-5,243,12,241,-6,241,-6,243,12,196,19,241,-6,196,19,182,1,182,1,196,19,156,40,182,1,156,40,132,24,276,250,268,253,271,231,271,231,268,253,263,232,254,231,263,232,257,254,254,231,257,254,244,226,244,226,257,254,242,252,244,226,242,252,234,219,234,219,242,252,229,248,234,219,229,248,223,209,223,209,229,248,216,241,223,209,216,241,214,197,199,163,203,175,204,231,204,231,203,175,208,186,204,231,208,186,216,241,216,241,208,186,214,197,194,219,196,137,197,150,194,219,197,150,204,231,204,231,197,150,199,163,201,110,204,72,207,101,207,101,204,72,219,74,207,101,219,74,216,96,216,96,219,74,226,94,234,95,226,94,232,78,234,95,232,78,245,86,197,122,196,137,191,75,197,122,191,75,204,72,197,122,204,72,201,110,196,137,194,219,191,75,191,75,194,219,183,203,191,75,183,203,179,82,179,82,183,203,174,185,179,82,174,185,169,93,169,93,174,185,167,167,169,93,167,167,163,109,163,109,167,167,162,147,163,109,162,147,161,128,268,253,257,254,263,232,267,108,268,108,271,138,267,108,271,138,264,123,264,123,257,113,267,108,267,108,257,113,257,96,308,92,304,96,312,71,312,71,304,96,301,103,312,71,301,103,300,73,300,73,301,103,300,112,300,115,301,117,300,247,300,247,301,117,301,119,300,247,301,119,301,120,301,120,334,247,300,247,300,247,295,228,300,73,300,247,300,73,300,112,300,247,300,112,300,114,300,247,300,114,300,115,295,228,294,228,300,73,300,73,294,228,289,238,300,73,289,238,288,78,288,78,289,238,286,202,288,78,286,202,285,187,288,78,285,187,282,171,285,213,286,202,289,238,285,213,289,238,284,245,285,213,284,245,282,221,277,227,282,221,284,245,277,227,284,245,276,250,277,227,276,250,271,231,384,186,381,157,386,121,386,121,381,157,372,130,386,121,372,130,366,95,366,95,372,130,358,108,366,95,358,108,341,78,341,78,358,108,341,94,341,78,341,94,321,88,321,88,314,89,341,78,341,78,314,89,312,71,396,238,386,121,400,154,396,238,400,154,405,191,288,78,282,171,279,86,279,86,282,171,277,155,279,86,277,155,271,96,271,96,277,155,271,138,271,96,271,138,268,108,250,105,242,99,245,86,250,105,245,86,257,96,250,105,257,96,257,113,226,94,219,74,232,78,234,95,245,86,242,99,308,92,312,71,314,89,344,36,324,10,350,22,105,282,105,206,128,304, +353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183, +55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0, +211,175,225,178,236,182,245,185,259,195,266,203,272,213,276,224,279,235,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,295,102,292,115,287,126,281,137,272,147,263,154,254,160,242,166,229,170,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,140,313,172,309,197,301,214,287,225,268,228,245,225,223,217,205,202,193,181,186,153,183,16383,16383,108,163,139,162,162,161,181,158,198,152,215,143,224,136,231,126,235,115,238,103,239,89,238,77,236,66,232,56,227,47,220,40,207,30,194,24,179,20,161,19,138,18,126,19,118,21,112,26,109,32,108,41,307,65,285,47,265,32,244,23,222,17,197,15,177,17,157,21,139,28,123,38,108,51,95,68,85,88,78,112,73,140,72,171,77,219,93,260,117,291,151,311,192,318,211,316,228,311,244,304,259,293,272,280,279,272,285,263,290,252,295,240,299,224,310,224,305,338,296,338,293,332,290,328,285,324,280,322,275,321,269,322,262,324,254,326,240,330,228,333,204,337,192,338,180,338,153,336,127,330,102,320,80,305,59,286,44,266,31,243,22,218,16,191,14,162,16,133,22,106,32,80,45,57,62,37,81,22,103,9,127,0,153,-4,180,-6,214,-4,245,3,273,16,297,34,316,56,8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12, +51,24,42,16,177,0,177,0,42,16,29,11,177,0,29,11,8,9,55,295,56,275,112,310,55,295,112,310,148,331,148,331,112,310,115,312,148,331,115,312,119,313,148,331,119,313,140,313,148,331,140,313,172,309,207,30,194,24,217,4,217,4,194,24,179,20,217,4,179,20,177,0,177,0,179,20,161,19,177,0,161,19,138,18,138,18,126,19,177,0,177,0,126,19,118,21,177,0,118,21,55,37,55,37,118,21,56,56,258,300,232,317,236,182,236,182,232,317,228,245,236,182,228,245,225,223,236,182,225,223,225,178,225,178,225,223,217,205,225,178,217,205,211,175,211,175,217,205,202,193,211,175,202,193,211,174,211,174,202,193,215,143,211,174,215,143,229,170,229,170,215,143,224,136,153,183,162,161,181,186,181,186,162,161,181,158,181,186,181,158,202,193,202,193,181,158,198,152,202,193,198,152,215,143,236,66,232,56,250,15,250,15,232,56,227,47,250,15,227,47,220,40,220,40,207,30,217,4,162,161,153,183,139,162,139,162,153,183,108,183,139,162,108,183,108,163,109,32,108,41,56,275,109,32,56,275,56,56,56,56,118,21,112,26,56,56,112,26,109,32,272,147,263,154,275,34,275,34,263,154,254,160,275,34,254,160,250,15,250,15,254,160,242,166,250,15,242,166,239,89,239,89,238,77,250,15,250,15,238,77,236,66,242,166,229,170,231,126,242,166,231,126,235,115,242,166,235,115,238,103,242,166,238,103,239,89,232,317,195,327,197,301,232,317,197,301,214,287,232,317,214,287,225,268,232,317,225,268,228,245,195,327,148,331,172,309,195,327,172,309,197,301,56,275,108,41,108,296,56,275,108,296,108,303,56,275,108,303,109,307,56,275,109,307,112,310,148,331,8,331,29,320,148,331,29,320,43,316,148,331,43,316,51,308,148,331,51,308,55,295,266,203,272,213,274,277,274,277,272,213,276,224,274,277,276,224,280,248,280,248,276,224,279,235,245,185,252,190,258,300,258,300,252,190,259,195,258,300,259,195,274,277,274,277,259,195,266,203,292,115,287,126,291,58,292,115,291,58,296,89,292,115,296,89,295,102,281,137,272,147,275,34,281,137,275,34,291,58,281,137,291,58,287,126,220,40,217,4,250,15,258,300,236,182,245,185,29,320,8,331,8,321,229,170,224,136,231,126,177,0,8,9,8,0,51,24,177,0,55,37, +307,65,285,47,265,32,244,23,222,17,197,15,177,17,157,21,139,28,123,38,108,51,95,68,85,88,78,112,73,140,72,171,77,219,93,260,117,291,151,311,192,318,211,316,228,311,244,304,259,293,272,280,279,272,285,263,290,252,295,240,299,224,310,224,305,338,296,338,293,332,290,328,285,324,280,322,275,321,269,322,262,324,254,326,240,330,228,333,204,337,192,338,180,338,153,336,127,330,102,320,80,305,59,286,44,266,31,243,22,218,16,191,14,162,16,133,22,106,32,80,45,57,62,37,81,22,103,9,127,0,153,-4,180,-6,214,-4,245,3,273,16,297,34,316,56,8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,254,21,275,32,299,51,318,75,331,102,340,133,343,167,341,196,334,223,324,247,310,267,293,286,270,302,244,314,214,323,180,329,143,331,16383,16383,103,291,104,300,107,306,112,310,119,312,129,313,157,311,182,308,203,301,222,291,241,278,257,260,271,241,280,219,286,193,288,164,286,132,280,104,270,81,255,61,236,45,218,34,200,27,179,22,155,19,127,18,117,19,110,22,106,26,104,33,103,42,299,84,285,84,271,57,255,38,234,26, +62,37,73,140,72,171,72,171,80,305,62,37,62,37,80,305,59,286,62,37,59,286,45,57,45,57,59,286,44,266,45,57,44,266,32,80,32,80,44,266,31,243,32,80,31,243,22,106,22,106,31,243,22,218,22,106,22,218,16,133,16,133,22,218,16,191,16,133,16,191,14,162,78,112,81,22,85,88,85,88,81,22,103,9,85,88,103,9,95,68,95,68,103,9,108,51,123,38,108,51,127,0,123,38,127,0,139,28,139,28,127,0,153,-4,139,28,153,-4,157,21,157,21,153,-4,180,-6,157,21,180,-6,177,17,177,17,180,-6,197,15,222,17,197,15,214,-4,222,17,214,-4,245,3,73,140,62,37,81,22,73,140,81,22,78,112,108,51,103,9,127,0,254,326,259,293,262,324,262,324,259,293,272,280,262,324,272,280,269,322,269,322,272,280,275,321,280,322,275,321,279,272,280,322,279,272,285,263,275,321,272,280,279,272,228,333,228,311,240,330,240,330,228,311,244,304,240,330,244,304,247,328,247,328,244,304,259,293,247,328,259,293,254,326,216,335,204,337,211,316,216,335,211,316,228,311,216,335,228,311,228,333,204,337,192,338,211,316,211,316,192,338,192,318,151,311,192,318,153,336,151,311,153,336,127,330,310,224,305,338,299,224,299,224,305,338,296,338,299,224,296,338,295,240,295,240,296,338,293,332,295,240,293,332,290,252,290,252,293,332,290,328,290,252,290,328,285,263,285,263,290,328,285,324,285,263,285,324,280,322,316,56,307,65,297,34,297,34,307,65,285,47,297,34,285,47,273,16,273,16,285,47,265,32,273,16,265,32,245,3,245,3,265,32,244,23,245,3,244,23,222,17,197,15,180,-6,214,-4,192,318,192,338,180,338,192,318,180,338,153,336,72,171,77,219,80,305,80,305,77,219,93,260,80,305,93,260,102,320,102,320,93,260,117,291,102,320,117,291,127,330,127,330,117,291,151,311, +8,331,8,321,27,320,40,316,47,308,51,295,52,275,52,57,51,38,48,25,40,16,27,12,8,9,8,0,148,0,178,1,206,6,231,12,254,21,275,32,299,51,318,75,331,102,340,133,343,167,341,196,334,223,324,247,310,267,293,286,270,302,244,314,214,323,180,329,143,331,16383,16383,103,291,104,300,107,306,112,310,119,312,129,313,157,311,182,308,203,301,222,291,241,278,257,260,271,241,280,219,286,193,288,164,286,132,280,104,270,81,255,61,236,45,218,34,200,27,179,22,155,19,127,18,117,19,110,22,106,26,104,33,103,42,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61, +48,25,40,16,148,0,148,0,40,16,27,12,148,0,27,12,8,9,52,57,51,38,110,22,110,22,51,38,148,0,110,22,148,0,117,19,117,19,148,0,127,18,155,19,127,18,148,0,155,19,148,0,178,1,104,300,107,306,52,275,52,275,107,306,112,310,52,275,112,310,143,331,143,331,112,310,119,312,143,331,119,312,129,313,129,313,119,312,129,312,129,313,129,312,157,311,129,313,157,311,143,331,143,331,157,311,180,329,206,6,231,12,218,34,218,34,231,12,236,45,255,61,236,45,254,21,255,61,254,21,275,32,155,19,178,1,179,22,179,22,178,1,206,6,179,22,206,6,200,27,200,27,206,6,218,34,244,314,241,278,257,260,244,314,257,260,270,302,270,302,257,260,271,241,270,302,271,241,293,286,293,286,271,241,280,219,293,286,280,219,286,193,182,308,203,301,214,323,214,323,203,301,222,291,214,323,222,291,244,314,244,314,222,291,241,278,180,329,157,311,182,308,180,329,182,308,214,323,343,167,341,196,340,133,340,133,341,196,334,223,340,133,334,223,331,102,331,102,334,223,324,247,331,102,324,247,318,75,318,75,324,247,310,267,318,75,310,267,299,51,299,51,310,267,293,286,299,51,293,286,288,164,288,164,286,132,299,51,299,51,286,132,280,104,299,51,280,104,275,32,275,32,280,104,270,81,275,32,270,81,255,61,236,45,231,12,254,21,110,22,106,26,52,57,52,57,106,26,104,33,52,57,104,33,52,275,52,275,104,33,103,42,52,275,103,42,103,291,40,316,47,308,143,331,143,331,47,308,51,295,143,331,51,295,52,275,27,320,40,316,143,331,27,320,143,331,8,331,27,320,8,331,8,321,148,0,8,9,8,0,48,25,148,0,51,38,104,300,52,275,103,291,293,286,286,193,288,164, +299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,127,12,113,16,105,24,102,37,100,56,100,164,171,164,193,162,209,158,219,150,225,136,228,115,239,115,239,232,228,232,225,212,218,198,208,190,193,185,171,184,100,184,100,292,101,300,102,306,105,310,110,311,118,312,184,312,214,311,234,306,247,297,255,282,261,259,354,177,227,177,227,168,246,166,259,162,267,154, +45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232, +273,259,271,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,61,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,127,12,113,16,105,24,102,37,100,56,100,164,171,164,193,162,209,158,219,150,225,136,228,115,239,115,239,232,228,232,225,212,218,198,208,190,193,185,171,184,100,184,100,292,101,300,102,306,105,310,110,311,118,312,184,312,214,311,234,306,247,297,255,282,261,259,354,177,227,177,227,168,246,166,259,162,267,154,270,142,271,122,271,44,268,34,259,25,244,19,226,14,204,13,161,19,124,39,97,69,79,111,73,162,75,191,79,219,86,244,97,266,112,283,125,295,140,305,157,312,175,317,195,318,211,317,227,314,242,308,256,300,268,291,276,282,283,273,290,262,296,249,304,233,315,233,311,338,300,338,298,333,294,328,289,325,283,322,277,321,274,322,270,322,266,323,261,325, +38,315,45,307,271,331,271,331,45,307,110,311,271,331,110,311,118,312,271,331,118,312,184,312,271,331,184,312,214,311,50,276,102,37,100,56,100,184,100,164,171,164,100,184,171,164,171,184,193,185,171,184,193,162,193,185,193,162,208,190,208,190,193,162,209,158,208,190,209,158,218,198,218,198,209,158,219,150,218,198,219,150,225,212,225,212,219,150,225,136,225,212,225,136,228,232,228,232,225,136,228,115,228,232,228,115,239,115,271,331,214,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,276,100,56,100,292,50,276,100,292,101,300,50,276,101,300,102,306,50,276,102,306,105,310,50,276,105,310,49,294,110,311,45,307,49,294,110,311,49,294,105,310,25,319,38,315,271,331,25,319,271,331,6,331,25,319,6,331,6,321,146,0,146,9,127,12,146,0,127,12,113,16,146,0,113,16,49,40,146,0,49,40,45,25,146,0,45,25,37,16,146,0,37,16,25,12,146,0,25,12,6,9,146,0,6,9,6,0,50,61,49,40,113,16,50,61,113,16,105,24,50,61,105,24,102,37,50,61,102,37,50,276,171,184,171,164,193,162,228,232,239,115,239,232, +354,177,227,177,227,168,246,166,259,162,267,154,270,142,271,122,271,44,268,34,259,25,244,19,226,14,204,13,161,19,124,39,97,69,79,111,73,162,75,191,79,219,86,244,97,266,112,283,125,295,140,305,157,312,175,317,195,318,211,317,227,314,242,308,256,300,268,291,276,282,283,273,290,262,296,249,304,233,315,233,311,338,300,338,298,333,294,328,289,325,283,322,277,321,274,322,270,322,266,323,261,325,256,326,243,331,230,334,218,336,204,338,189,338,161,336,135,331,111,322,89,310,70,295,51,275,36,251,25,225,19,195,16,164,18,135,23,110,31,86,42,65,57,46,79,28,105,13,133,2,162,-4,193,-6,223,-5,251,0,278,6,301,16,320,28,320,128,321,144,324,156,330,162,340,166,354,168,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331, +16,164,18,135,19,195,19,195,18,135,23,110,19,195,23,110,25,225,25,225,23,110,31,86,25,225,31,86,36,251,36,251,31,86,42,65,36,251,42,65,51,275,51,275,42,65,57,46,51,275,57,46,70,295,70,295,57,46,73,162,157,312,161,336,140,305,140,305,161,336,135,331,140,305,135,331,125,295,125,295,135,331,112,283,97,266,112,283,111,322,97,266,111,322,89,310,89,310,70,295,75,191,89,310,75,191,79,219,89,310,79,219,86,244,89,310,86,244,97,266,193,-6,204,13,162,-4,162,-4,204,13,161,19,162,-4,161,19,133,2,133,2,161,19,124,39,133,2,124,39,105,13,105,13,124,39,97,69,105,13,97,69,79,28,79,28,97,69,79,111,79,28,79,111,73,162,259,25,244,19,251,0,251,0,244,19,226,14,251,0,226,14,223,-5,223,-5,226,14,204,13,73,162,57,46,79,28,268,291,266,323,261,325,268,291,261,325,256,300,268,291,270,322,266,323,204,338,195,318,211,317,204,338,211,317,218,336,218,336,211,317,227,314,218,336,227,314,230,334,230,334,227,314,242,308,230,334,242,308,243,331,243,331,242,308,256,300,243,331,256,300,256,326,256,326,256,300,261,325,270,322,276,282,274,322,274,322,276,282,277,321,283,322,277,321,283,273,283,322,283,273,290,262,268,291,276,282,270,322,304,233,315,233,311,338,304,233,311,338,300,338,304,233,300,338,298,333,304,233,298,333,296,249,294,328,289,325,290,262,294,328,290,262,296,249,294,328,296,249,298,333,277,321,276,282,283,273,340,166,354,168,354,177,340,166,354,177,330,162,330,162,354,177,270,142,330,162,270,142,271,122,278,6,271,122,271,44,278,6,271,44,268,34,330,162,271,122,324,156,324,156,271,122,278,6,324,156,278,6,321,144,321,144,278,6,301,16,321,144,301,16,320,128,320,128,301,16,320,28,354,177,227,177,246,166,354,177,246,166,259,162,354,177,259,162,267,154,354,177,267,154,270,142,259,25,251,0,278,6,259,25,278,6,268,34,189,338,161,336,175,317,189,338,175,317,195,318,189,338,195,318,204,338,135,331,111,322,112,283,161,336,157,312,175,317,223,-5,204,13,193,-6,246,166,227,177,227,168,283,322,290,262,289,325,75,191,70,295,73,162, +352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,-1,37,-2,29,0,16,6,6,17,0,31,-5, +49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,149,331,9,331,28,319,149,331,28,319,41,315,149,331,41,315,49,307,149,331,49,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,105,38,104,56,104,180,104,157,256,157,104,180,256,157,256,180,256,180,256,157,312,25,256,180,312,25,308,37,54,274,104,56,104,274,54,274,104,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,255,294,320,315,255,294,256,274,308,37,256,274,256,180,307,55,307,274,256,274,256,274,307,274,308,293,256,274,308,293,312,307,352,331,211,331,231,319,352,331,231,319,244,315,352,331,244,315,251,307,352,331,251,307,255,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,256,62,255,41,320,17,256,62,320,17,312,25,256,62,312,25,256,157,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,54,61,53,39,117,17,54,61,117,17,109,25,54,61,109,25,105,38,54,61,105,38,54,274,148,0,9,9,9,0,352,0,212,9,212,0,256,274,308,37,307,55,231,319,211,331,211,321,320,315,256,274,312,307,28,319,9,331,9,321, +157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44, +52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321, +177,331,33,331,33,321,54,319,67,315,75,308,79,295,80,275,80,47,79,34,78,24,75,17,69,13,61,12,56,13,53,16,51,21,48,27,46,34,42,41,38,47,33,52,28,54,22,55,14,54,7,50,2,44,-1,37,-2,29,0,16,6,6,17,0,31,-5,47,-6,76,-2,100,8,117,28,128,56,131,93,131,275,132,294,136,307,143,315,157,319,177,321,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17, +78,24,75,17,76,-2,76,-2,75,17,69,13,76,-2,69,13,61,12,61,12,56,13,76,-2,76,-2,56,13,47,-6,157,319,177,321,177,331,157,319,177,331,143,315,143,315,177,331,79,295,143,315,79,295,80,275,100,8,80,275,80,47,100,8,80,47,79,34,131,275,132,294,117,28,131,275,117,28,128,56,131,275,128,56,131,93,132,294,136,307,80,275,132,294,80,275,100,8,132,294,100,8,117,28,177,331,33,331,54,319,177,331,54,319,67,315,177,331,67,315,75,308,177,331,75,308,79,295,78,24,76,-2,100,8,78,24,100,8,79,34,47,-6,56,13,53,16,47,-6,53,16,51,21,47,-6,51,21,48,27,47,-6,48,27,46,34,47,-6,46,34,42,41,47,-6,42,41,38,47,47,-6,38,47,33,52,47,-6,33,52,31,-5,33,52,28,54,31,-5,31,-5,28,54,22,55,31,-5,22,55,17,0,17,0,22,55,14,54,17,0,14,54,7,50,17,0,7,50,6,6,6,6,7,50,2,44,6,6,2,44,0,16,0,16,2,44,-1,37,0,16,-1,37,-2,29,54,319,33,331,33,321,143,315,80,275,136,307, +362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,299,87,286,87,277,69,273,62,265,50,254,39,239,30,223,24,203,21,180,20,127,20,114,22,106,26,102,32,100,42,100,274,101,294,105,307,113,315,127,319,147,321,147,331,6,331,6,321,26,319,38,314,46,306,49,292,50,273,50,57,49,38,45,25,37,16,25,12,6,9,6,0,275,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9, +158,321,158,321,137,319,137,319,158,321,158,331,137,319,158,331,124,315,124,315,158,331,61,293,124,315,61,293,62,275,114,36,62,275,62,63,114,36,62,63,118,23,118,23,62,63,126,16,62,275,114,36,113,55,113,174,113,148,126,158,113,174,126,158,202,256,202,256,126,158,166,192,202,256,166,192,259,281,62,275,113,55,113,274,62,275,113,274,113,293,62,275,113,293,117,307,62,275,117,307,124,315,158,331,17,331,37,319,158,331,37,319,50,315,158,331,50,315,57,306,158,331,57,306,61,293,234,289,226,280,259,281,259,281,226,280,215,269,259,281,215,269,202,256,338,331,208,331,220,321,338,331,220,321,229,320,338,331,229,320,235,318,338,331,235,318,238,315,338,331,238,315,240,311,338,331,240,311,241,305,338,331,241,305,305,316,338,331,305,316,320,320,338,331,320,320,338,321,241,305,259,281,278,298,241,305,278,298,292,309,241,305,292,309,305,316,239,298,234,289,259,281,239,298,259,281,241,305,241,15,237,12,362,0,362,0,237,12,231,11,362,0,231,11,224,10,244,22,362,0,336,16,244,22,336,16,322,25,244,22,322,25,305,41,244,22,305,41,283,64,244,22,283,64,241,32,283,64,166,192,176,107,283,64,176,107,198,84,283,64,198,84,217,63,283,64,217,63,232,46,283,64,232,46,241,32,349,11,336,16,362,0,349,11,362,0,362,9,244,18,241,15,362,0,244,18,362,0,244,22,210,9,210,0,362,0,210,9,362,0,224,10,157,0,157,9,139,12,157,0,139,12,126,16,157,0,126,16,61,40,157,0,61,40,57,26,157,0,57,26,50,17,157,0,50,17,36,12,157,0,36,12,17,9,157,0,17,9,17,0,61,40,126,16,62,63,176,107,166,192,126,158,220,321,208,331,208,321,37,319,17,331,17,321, +299,87,286,87,277,69,273,62,265,50,254,39,239,30,223,24,203,21,180,20,127,20,114,22,106,26,102,32,100,42,100,274,101,294,105,307,113,315,127,319,147,321,147,331,6,331,6,321,26,319,38,314,46,306,49,292,50,273,50,57,49,38,45,25,37,16,25,12,6,9,6,0,275,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48, +147,321,147,321,127,319,127,319,147,321,147,331,127,319,147,331,113,315,113,315,147,331,49,292,113,315,49,292,50,273,102,32,50,273,50,57,102,32,50,57,106,26,106,26,50,57,49,38,106,26,49,38,114,22,114,22,49,38,45,25,114,22,45,25,127,20,127,20,45,25,275,0,127,20,275,0,146,20,146,20,275,0,180,20,100,42,100,274,50,273,50,273,100,274,101,294,50,273,101,294,105,307,147,331,6,331,26,319,147,331,26,319,38,314,147,331,38,314,46,306,147,331,46,306,49,292,277,69,273,62,275,0,275,0,273,62,269,56,275,0,269,56,265,50,265,50,254,39,275,0,275,0,254,39,239,30,275,0,239,30,223,24,299,87,286,87,281,77,299,87,281,77,277,69,299,87,277,69,275,0,203,21,180,20,275,0,203,21,275,0,223,24,275,0,45,25,37,16,275,0,37,16,25,12,275,0,25,12,6,9,275,0,6,9,6,0,50,273,102,32,100,42,26,319,6,331,6,321,113,315,50,273,105,307, +432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,344,166,336,222, +49,29,41,18,123,0,123,0,41,18,27,12,123,0,27,12,6,9,333,26,325,17,432,0,432,0,325,17,312,12,432,0,312,12,292,9,413,320,431,321,431,331,413,320,431,331,401,316,401,316,431,331,337,286,401,316,337,286,393,307,393,307,337,286,389,294,401,17,393,25,337,61,337,61,393,25,389,38,337,61,389,38,337,286,337,286,389,38,388,56,337,286,388,56,388,275,203,0,209,0,222,80,222,80,209,0,337,286,222,80,337,286,332,331,332,331,337,286,431,331,106,331,7,331,28,319,106,331,28,319,42,315,106,331,42,315,50,307,106,331,50,307,54,294,106,331,54,294,55,275,106,331,55,275,76,275,106,331,76,275,203,0,106,331,203,0,222,80,76,75,76,275,55,275,76,75,55,275,78,48,78,48,55,275,55,75,78,48,55,75,82,29,82,29,55,75,54,47,82,29,54,47,90,18,90,18,54,47,49,29,90,18,49,29,123,0,432,0,432,9,413,12,432,0,413,12,401,17,432,0,401,17,336,40,432,0,336,40,333,26,103,12,90,18,123,0,103,12,123,0,123,9,123,0,6,9,6,0,432,0,292,9,292,0,336,40,401,17,337,61,28,319,7,331,7,321,389,294,337,286,388,275, +353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269, +49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299, +344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164, +149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19, +8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,350,-88,350,-78,318,-74,288,-65,261,-51,236,-30,213,-2,232,1,248,6,263,12,277,21,290,32,309,54,324,77,335,104,342,133,344,166,336,224,314,272,279,308,234,330,180,338,127,330,82,308,47,272,25,224,17,166,18,140,23,115,31,92,42,70,55,50,67,36,79,25,94,16,111,7,132,0,153,-25,177,-48,206,-66,241,-78,282,-85,326,-88,16383,16383,287,169,285,139,281,111,275,85,266,64,255,47,243,35,230,25,215,18,198,13,180,11,163,13,146,18,129,26,115,37,103,50,93,68,85,89,79,113,75,139,74,167,76,196, +111,312,118,312,118,313,137,331,118,313,155,310,137,331,155,310,166,329,166,329,155,310,182,302,166,329,182,302,191,325,191,325,182,302,202,288,191,325,202,288,213,319,213,319,202,288,213,266,213,319,213,266,231,310,231,310,213,266,217,238,231,310,217,238,225,161,225,161,213,213,208,153,208,153,213,213,202,192,208,153,202,192,188,147,188,147,202,192,185,177,188,147,185,177,164,145,164,145,185,177,162,167,164,145,162,167,136,144,136,144,162,167,132,164,136,144,132,164,128,144,128,144,132,164,126,164,128,144,126,164,122,144,122,144,126,164,120,164,122,144,120,164,115,145,115,145,120,164,114,165,115,145,114,165,109,145,109,145,114,165,108,165,109,145,108,165,101,166,101,56,101,166,50,276,101,56,50,276,102,37,102,37,50,276,50,61,101,166,101,146,109,145,271,240,270,254,270,225,270,225,270,254,267,268,270,225,267,268,266,210,266,210,267,268,262,280,266,210,262,280,260,197,260,197,262,280,255,291,260,197,255,291,253,185,253,185,255,291,246,300,253,185,246,300,243,175,243,175,246,300,231,310,243,175,231,310,225,161,137,331,8,331,27,319,137,331,27,319,39,315,137,331,39,315,46,307,137,331,46,307,49,294,137,331,49,294,50,276,137,331,50,276,106,310,137,331,106,310,111,312,137,331,111,312,118,313,101,295,101,302,50,276,101,295,50,276,101,166,103,307,106,310,50,276,103,307,50,276,101,302,148,0,148,9,128,12,148,0,128,12,114,16,148,0,114,16,50,39,148,0,50,39,47,25,148,0,47,25,40,16,148,0,40,16,27,12,148,0,27,12,8,9,148,0,8,9,8,0,50,61,50,39,114,16,50,61,114,16,106,24,50,61,106,24,102,37,27,319,8,331,8,321,213,213,225,161,217,238,155,310,118,313,118,312, +350,-88,350,-78,318,-74,288,-65,261,-51,236,-30,213,-2,232,1,248,6,263,12,277,21,290,32,309,54,324,77,335,104,342,133,344,166,336,224,314,272,279,308,234,330,180,338,127,330,82,308,47,272,25,224,17,166,18,140,23,115,31,92,42,70,55,50,67,36,79,25,94,16,111,7,132,0,153,-25,177,-48,206,-66,241,-78,282,-85,326,-88,16383,16383,287,169,285,139,281,111,275,85,266,64,255,47,243,35,230,25,215,18,198,13,180,11,163,13,146,18,129,26,115,37,103,50,93,68,85,89,79,113,75,139,74,167,76,196,80,222,87,247,96,268,107,285,119,297,133,307,147,314,163,318,179,320,193,319,206,316,219,312,231,306,242,297,257,280,270,258,279,232,285,202,287,169,330,0,330,9,318,11,308,13,299,17,291,24,283,33,183,160,216,168,242,180,260,197,270,217,273,242,272,255,270,268,265,281,258,292,249,301,234,311,217,319,196,326,172,330,145,331,8,331,8,321,28,319,40,315,47,307,50,294,51,276,51,62,50,40,47,25,39,16,27,12,8,9,8,0,147,0,147,9,127,12,114,16,107,24,103,37,102,56,102,153,130,154,249,0,16383,16383,102,291,103,300,106,306,111,310,118,312,127,313,161,310,186,302,205,289,215,270,219,246,218,231,214,218,208,206,200,196,190,189,177,182,163,177,147,174,128,172,102,171,234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338, +79,113,79,25,85,89,85,89,79,25,94,16,85,89,94,16,93,68,93,68,94,16,103,50,115,37,103,50,111,7,115,37,111,7,132,0,79,113,75,139,79,25,79,25,75,139,74,167,67,36,74,167,76,196,67,36,76,196,55,50,55,50,76,196,82,308,55,50,82,308,47,272,147,314,180,338,133,307,133,307,180,338,127,330,133,307,127,330,119,297,119,297,127,330,107,285,96,268,107,285,127,330,96,268,127,330,82,308,129,26,132,0,146,18,146,18,132,0,153,-25,146,18,153,-25,163,13,163,13,153,-25,177,-48,163,13,177,-48,180,11,180,11,177,-48,206,-66,180,11,206,-66,198,13,234,330,180,338,193,319,193,319,180,338,179,320,163,318,179,320,180,338,163,318,180,338,147,314,206,316,219,312,234,330,234,330,219,312,231,306,234,330,231,306,242,297,242,297,257,280,279,308,279,308,257,280,270,258,279,308,270,258,279,232,232,1,248,6,243,35,243,35,248,6,255,47,266,64,255,47,263,12,266,64,263,12,277,21,236,-30,213,-2,241,-78,215,18,213,-2,232,1,215,18,232,1,230,25,230,25,232,1,243,35,206,-66,241,-78,213,-2,206,-66,213,-2,215,18,206,-66,215,18,198,13,336,224,314,272,324,77,336,224,324,77,335,104,336,224,335,104,342,133,336,224,342,133,344,166,285,139,290,32,287,169,287,169,290,32,314,272,314,272,290,32,309,54,314,272,309,54,324,77,285,202,287,169,314,272,285,202,314,272,279,308,285,202,279,308,279,232,279,308,234,330,242,297,281,111,275,85,277,21,281,111,277,21,290,32,281,111,290,32,285,139,255,47,248,6,263,12,326,-88,350,-88,350,-78,326,-88,350,-78,318,-74,326,-88,318,-74,288,-65,326,-88,288,-65,282,-85,261,-51,236,-30,241,-78,261,-51,241,-78,282,-85,261,-51,282,-85,288,-65,82,308,76,196,80,222,82,308,80,222,87,247,82,308,87,247,96,268,18,140,23,115,25,224,25,224,23,115,31,92,25,224,31,92,47,272,47,272,31,92,42,70,47,272,42,70,55,50,103,50,94,16,111,7,18,140,25,224,17,166,266,64,277,21,275,85,234,330,193,319,206,316,115,37,132,0,129,26,79,25,74,167,67,36, +330,0,330,9,318,11,308,13,299,17,291,24,283,33,183,160,216,168,242,180,260,197,270,217,273,242,272,255,270,268,265,281,258,292,249,301,234,311,217,319,196,326,172,330,145,331,8,331,8,321,28,319,40,315,47,307,50,294,51,276,51,62,50,40,47,25,39,16,27,12,8,9,8,0,147,0,147,9,127,12,114,16,107,24,103,37,102,56,102,153,130,154,249,0,16383,16383,102,291,103,300,106,306,111,310,118,312,127,313,161,310,186,302,205,289,215,270,219,246,218,231,214,218,208,206,200,196,190,189,177,182,163,177,147,174,128,172,102,171,234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,95,334,71,323,52,305,40,281,36,251,38,232,44,214,56,196,73,180,97,165,116,154,135,142,152,130,168,118,180,107,185,100,189,93,192,85,194,77,195,67,192,49,184,33,172,21,155,14,136,11,109,15,85,25,65,42,47,67,32,99,22,99,36,-6,47,-6,48,0,50,4,53,7,57,9,61,10,64,10,79,7,84,4,96,0,107,-2,131,-6,143,-6,176,-2,204,10,226,29,240,55,246,86,243,108,233,128,218,148, +118,312,127,312,127,313,145,331,127,313,161,310,145,331,161,310,172,330,172,330,161,310,186,302,172,330,186,302,196,326,196,326,186,302,205,289,196,326,205,289,217,319,217,319,205,289,215,270,217,319,215,270,219,246,214,218,208,206,216,168,216,168,208,206,200,196,216,168,200,196,190,189,190,189,177,182,183,160,183,160,177,182,163,177,183,160,163,177,249,0,249,0,163,177,147,174,249,0,147,174,130,154,130,154,147,174,128,172,130,154,128,172,102,171,265,281,258,292,260,197,260,197,258,292,249,301,260,197,249,301,242,180,242,180,249,301,234,311,242,180,234,311,219,246,219,246,234,311,217,319,214,218,216,168,218,231,218,231,216,168,242,180,218,231,242,180,219,246,270,217,273,242,272,255,270,217,272,255,270,268,270,217,270,268,265,281,270,217,265,281,260,197,190,189,183,160,216,168,318,11,308,13,330,0,330,0,308,13,299,17,330,0,299,17,249,0,249,0,299,17,291,24,249,0,291,24,283,33,102,56,102,171,51,276,102,56,51,276,103,37,103,37,51,276,51,62,102,171,102,153,130,154,145,331,8,331,28,319,145,331,28,319,40,315,145,331,40,315,47,307,145,331,47,307,50,294,145,331,50,294,51,276,145,331,51,276,111,310,145,331,111,310,118,312,145,331,118,312,127,313,102,291,103,300,51,276,102,291,51,276,102,171,106,306,111,310,51,276,106,306,51,276,103,300,147,0,147,9,127,12,147,0,127,12,114,16,147,0,114,16,50,40,147,0,50,40,47,25,147,0,47,25,39,16,147,0,39,16,27,12,147,0,27,12,8,9,147,0,8,9,8,0,51,62,50,40,114,16,51,62,114,16,107,24,51,62,107,24,103,37,28,319,8,331,8,321,183,160,249,0,283,33,318,11,330,0,330,9,161,310,127,313,127,312, +234,232,224,338,213,338,211,332,209,327,206,324,202,322,197,321,194,321,190,322,185,323,175,327,164,331,154,334,134,338,123,338,95,334,71,323,52,305,40,281,36,251,38,232,44,214,56,196,73,180,97,165,116,154,135,142,152,130,168,118,180,107,185,100,189,93,192,85,194,77,195,67,192,49,184,33,172,21,155,14,136,11,109,15,85,25,65,42,47,67,32,99,22,99,36,-6,47,-6,48,0,50,4,53,7,57,9,61,10,64,10,79,7,84,4,96,0,107,-2,131,-6,143,-6,176,-2,204,10,226,29,240,55,246,86,243,108,233,128,218,148,196,166,168,185,139,202,114,218,95,234,83,251,79,270,81,286,88,299,98,309,112,315,129,318,146,316,162,310,177,302,190,291,201,278,206,271,211,263,215,254,218,244,222,232,296,246,293,331,12,331,8,246,21,246,27,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,285,246,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45, +50,4,53,7,65,42,65,42,53,7,57,9,65,42,57,9,61,10,61,10,64,10,65,42,65,42,64,10,69,9,65,42,69,9,85,25,85,25,69,9,74,8,85,25,74,8,79,7,95,234,83,251,97,165,97,165,83,251,79,270,73,180,79,270,71,323,73,180,71,323,56,196,56,196,71,323,52,305,56,196,52,305,44,214,44,214,52,305,40,281,44,214,40,281,38,232,38,232,40,281,36,251,81,286,88,299,95,334,95,334,88,299,98,309,95,334,98,309,123,338,123,338,98,309,112,315,123,338,112,315,129,318,129,318,146,316,134,338,134,338,146,316,144,336,81,286,95,334,71,323,81,286,71,323,79,270,134,338,123,338,129,318,144,336,146,316,154,334,154,334,146,316,162,310,154,334,162,310,164,331,164,331,162,310,177,302,164,331,177,302,175,327,175,327,177,302,180,325,95,234,97,165,114,218,114,218,97,165,116,154,114,218,116,154,139,202,139,202,116,154,135,142,139,202,135,142,152,130,136,11,119,-4,131,-6,136,11,131,-6,143,-6,136,11,109,15,119,-4,79,7,84,4,85,25,85,25,84,4,96,0,85,25,96,0,109,15,109,15,96,0,107,-2,109,15,107,-2,119,-4,36,-6,47,-6,47,67,47,67,47,-6,48,0,47,67,48,0,65,42,65,42,48,0,50,4,32,99,22,99,36,-6,32,99,36,-6,47,67,139,202,152,130,168,185,168,185,152,130,168,118,168,185,168,118,180,107,180,107,185,100,196,166,196,166,185,100,189,93,196,166,189,93,192,85,246,86,243,108,240,55,240,55,243,108,233,128,240,55,233,128,226,29,226,29,233,128,218,148,226,29,218,148,204,10,204,10,218,148,196,166,204,10,196,166,195,67,195,67,192,49,204,10,204,10,192,49,184,33,204,10,184,33,176,-2,176,-2,184,33,172,21,176,-2,172,21,155,14,196,166,192,85,194,77,196,166,194,77,195,67,196,166,168,185,180,107,155,14,136,11,143,-6,155,14,143,-6,176,-2,190,291,201,278,194,321,194,321,201,278,197,321,202,322,197,321,201,278,190,291,194,321,190,322,190,291,190,322,185,323,190,291,185,323,180,325,190,291,180,325,177,302,224,338,213,338,215,254,224,338,215,254,218,244,224,338,218,244,222,232,224,338,222,232,234,232,206,324,206,271,209,327,209,327,206,271,211,263,209,327,211,263,211,332,211,332,211,263,215,254,211,332,215,254,213,338,202,322,201,278,206,271,202,322,206,271,206,324,97,165,79,270,73,180, +296,246,293,331,12,331,8,246,21,246,27,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,285,246,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314, +293,331,12,331,70,309,293,331,70,309,97,310,293,331,97,310,127,310,293,331,127,310,178,310,293,331,178,310,208,310,293,331,208,310,235,309,293,331,235,309,254,303,293,331,254,303,268,292,293,331,268,292,277,274,293,331,277,274,285,246,293,331,285,246,296,246,192,16,183,23,127,61,127,61,183,23,179,36,127,61,179,36,127,310,127,310,179,36,178,55,127,310,178,55,178,310,12,331,8,246,21,246,12,331,21,246,27,274,12,331,27,274,37,292,12,331,37,292,50,303,12,331,50,303,70,309,226,0,226,9,205,11,226,0,205,11,192,16,226,0,192,16,126,39,226,0,126,39,123,25,226,0,123,25,115,16,226,0,115,16,101,12,226,0,101,12,80,9,226,0,80,9,80,0,126,39,192,16,127,61, +353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,349,331,247,331,247,321,258,321,268,319,276,316,281,310,282,301,282,295,281,289,279,282,276,274,273,265,200,80,123,252,116,269,110,283,106,292,104,300,104,305,105,310,107,314,112,317,118,319,127,320,141,321,141,331,8,331,8,321,21,320,31,316,41,307,50,291,62,267,184,-5,191,-5,302,276,311,295,319,308,328,316,338,320,349,321,466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331, +105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20, +349,331,247,331,247,321,258,321,268,319,276,316,281,310,282,301,282,295,281,289,279,282,276,274,273,265,200,80,123,252,116,269,110,283,106,292,104,300,104,305,105,310,107,314,112,317,118,319,127,320,141,321,141,331,8,331,8,321,21,320,31,316,41,307,50,291,62,267,184,-5,191,-5,302,276,311,295,319,308,328,316,338,320,349,321,466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,157,321,171,320,182,317,191,309,199,295,208,273,222,236,170,94,98,282,96,288,95,293,93,298,93,311,96,316,102,319,111,321, +62,267,184,-5,62,267,62,267,184,-5,104,300,62,267,104,300,104,305,104,305,105,310,62,267,62,267,105,310,107,314,62,267,107,314,50,291,141,331,8,331,21,320,141,331,21,320,31,316,141,331,31,316,41,307,141,331,41,307,50,291,141,331,50,291,112,317,141,331,112,317,118,319,141,331,118,319,127,320,141,331,127,320,141,321,281,289,279,282,302,276,302,276,279,282,276,274,302,276,276,274,273,265,273,265,200,80,302,276,302,276,200,80,191,-5,349,331,247,331,258,321,349,331,258,321,268,319,349,331,268,319,276,316,349,331,276,316,281,310,349,331,281,310,282,301,349,331,282,301,328,316,349,331,328,316,338,320,349,331,338,320,349,321,282,301,302,276,311,295,282,301,311,295,319,308,282,301,319,308,328,316,282,295,281,289,302,276,282,295,302,276,282,301,184,-5,191,-5,200,80,184,-5,200,80,123,252,184,-5,123,252,116,269,184,-5,116,269,110,283,184,-5,110,283,106,292,184,-5,106,292,104,300,258,321,247,331,247,321,21,320,8,331,8,321,112,317,50,291,107,314, +466,331,368,331,368,321,381,320,391,318,397,314,401,308,402,301,402,294,401,287,399,280,397,271,394,262,331,93,259,275,255,289,253,295,252,300,251,304,253,310,257,315,265,318,276,320,290,321,290,331,157,331,157,321,171,320,182,317,191,309,199,295,208,273,222,236,170,94,98,282,96,288,95,293,93,298,93,311,96,316,102,319,111,321,124,321,124,331,2,331,2,321,16,320,27,314,36,303,45,286,55,262,73,210,92,157,132,49,151,-5,158,-5,235,206,251,165,267,123,299,37,315,-5,323,-5,344,61,361,111,377,158,397,212,425,286,430,299,436,308,443,314,453,318,466,321,352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48, +16,320,27,314,124,331,124,331,27,314,36,303,124,331,36,303,96,316,96,316,36,303,45,286,96,316,45,286,55,262,55,262,73,210,93,311,93,311,73,210,93,306,93,302,93,306,92,157,93,302,92,157,112,103,111,321,124,321,124,331,111,321,124,331,102,319,102,319,124,331,96,316,93,306,73,210,92,157,96,316,55,262,93,311,2,331,2,321,16,320,2,331,16,320,124,331,251,165,267,123,251,304,251,304,253,310,222,236,222,236,253,310,208,273,199,295,208,273,257,315,199,295,257,315,290,331,290,331,257,315,265,318,290,331,265,318,276,320,276,320,290,321,290,331,251,304,222,236,235,206,251,304,235,206,251,165,257,315,208,273,253,310,290,331,157,331,171,320,290,331,171,320,182,317,290,331,182,317,191,309,290,331,191,309,199,295,394,262,361,111,377,158,394,262,377,158,397,212,394,262,331,93,344,61,394,262,344,61,361,111,331,93,259,275,267,123,331,93,267,123,283,80,331,93,283,80,299,37,331,93,299,37,315,-5,331,93,315,-5,323,-5,331,93,323,-5,344,61,267,123,259,275,257,282,267,123,257,282,255,289,267,123,255,289,253,295,267,123,253,295,252,300,267,123,252,300,251,304,402,294,401,287,425,286,425,286,401,287,399,280,425,286,399,280,397,212,397,212,399,280,397,271,397,212,397,271,394,262,402,301,425,286,430,299,402,301,430,299,436,308,402,301,436,308,443,314,402,301,443,314,466,331,402,301,466,331,401,308,402,294,425,286,402,301,453,318,466,321,466,331,453,318,466,331,443,314,466,331,368,331,381,320,466,331,381,320,391,318,466,331,391,318,397,314,466,331,397,314,401,308,170,94,98,282,112,103,170,94,112,103,132,49,170,94,132,49,151,-5,170,94,151,-5,158,-5,170,94,158,-5,235,206,170,94,235,206,222,236,112,103,98,282,96,288,112,103,96,288,95,293,112,103,95,293,93,298,112,103,93,298,93,302,381,320,368,331,368,321,171,320,157,331,157,321, +352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311, +31,17,121,0,43,26,43,26,121,0,88,17,43,26,88,17,58,42,58,42,88,17,84,21,58,42,84,21,83,26,83,26,84,31,78,66,78,66,84,31,87,38,78,66,87,38,156,164,156,164,87,38,92,46,156,164,92,46,100,57,103,242,156,164,126,297,103,242,126,297,124,306,124,306,125,312,103,242,156,164,100,57,109,70,109,70,169,145,156,164,156,164,169,145,166,234,156,164,166,234,151,255,78,66,58,42,83,26,103,242,125,312,78,276,78,276,125,312,128,316,78,276,128,316,59,299,59,299,128,316,133,319,59,299,133,319,161,331,161,331,133,319,139,320,161,331,139,320,147,321,147,321,161,321,161,331,161,331,11,331,29,319,161,331,29,319,44,312,161,331,44,312,59,299,260,296,257,290,272,272,272,272,257,290,251,282,272,272,251,282,243,272,243,272,188,202,200,184,200,184,188,202,217,74,200,184,217,74,296,46,296,46,217,74,226,60,296,46,226,60,233,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,331,319,348,331,331,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,263,301,260,296,272,272,263,301,272,272,263,305,243,272,200,184,272,272,238,16,233,14,352,0,352,0,233,14,226,12,352,0,226,12,217,11,242,25,352,0,327,16,242,25,327,16,317,22,242,25,317,22,307,32,242,25,307,32,296,46,242,25,296,46,241,31,296,46,233,48,238,38,296,46,238,38,241,31,188,202,166,234,169,145,188,202,169,145,217,74,338,12,327,16,352,0,338,12,352,0,352,9,241,20,238,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,156,164,151,255,139,272,156,164,139,272,131,286,156,164,131,286,126,297,121,0,121,9,106,11,121,0,106,11,95,13,121,0,95,13,88,17,19,12,5,9,121,0,19,12,121,0,31,17,121,0,5,9,5,0,243,320,229,331,229,321,29,319,11,331,11,321, +352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77, +121,289,118,294,157,147,157,147,118,294,116,299,157,147,116,299,92,243,92,243,116,299,115,304,92,243,115,304,115,308,115,308,116,312,92,243,151,331,11,331,24,319,151,331,24,319,37,313,151,331,37,313,50,299,151,331,50,299,123,318,151,331,123,318,130,320,151,331,130,320,138,321,151,331,138,321,151,321,123,318,50,299,119,316,119,316,50,299,68,277,119,316,68,277,116,312,116,312,68,277,92,243,209,55,209,151,197,174,209,55,197,174,210,36,210,36,197,174,157,147,210,36,157,147,215,23,215,23,157,147,157,61,215,23,157,61,224,15,224,15,157,61,156,39,224,15,156,39,260,0,260,0,156,39,152,25,260,0,152,25,144,16,275,298,274,294,282,266,282,266,274,294,272,290,282,266,272,290,270,285,270,285,197,174,209,151,352,331,243,331,256,321,352,331,256,321,266,319,352,331,266,319,272,316,352,331,272,316,275,312,352,331,275,312,276,306,352,331,276,306,322,313,352,331,322,313,336,319,352,331,336,319,352,321,276,306,282,266,297,288,276,306,297,288,310,303,276,306,310,303,322,313,282,266,276,306,276,302,282,266,276,302,275,298,270,285,209,151,282,266,239,11,224,15,260,0,239,11,260,0,260,9,129,12,107,9,260,0,129,12,260,0,144,16,124,285,121,289,157,147,124,285,157,147,197,174,260,0,107,9,107,0,256,321,243,331,243,321,24,319,11,331,11,321, +299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291, +35,271,38,279,26,331,26,331,38,279,43,287,26,331,43,287,50,295,50,295,58,301,26,331,26,331,58,301,68,306,26,331,68,306,81,309,73,19,289,324,224,312,224,312,289,324,289,331,224,312,289,331,117,312,97,311,117,312,289,331,97,311,289,331,26,331,26,331,16,246,29,246,26,331,29,246,32,260,26,331,32,260,35,271,224,312,5,7,73,19,73,19,5,7,286,0,73,19,286,0,199,19,199,19,286,0,215,20,278,59,273,49,286,0,286,0,273,49,266,40,286,0,266,40,257,33,257,33,249,28,286,0,286,0,249,28,240,24,286,0,240,24,228,21,286,0,299,88,287,88,286,0,287,88,282,72,286,0,282,72,278,59,286,0,5,7,5,0,215,20,286,0,228,21,26,331,81,309,97,311, +150,-77,150,-64,108,-64,99,-63,92,-61,86,-56,83,-48,82,-38,82,295,83,304,86,311,92,315,99,318,108,319,150,319,150,331,44,331,44,-77,143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,84,-50,81,-56,77,-61,70,-63, +86,311,92,315,44,331,44,331,92,315,99,318,44,331,99,318,150,331,150,331,99,318,108,319,82,-38,82,295,44,331,82,-38,44,331,44,-77,82,-38,44,-77,83,-48,83,304,86,311,44,331,83,304,44,331,82,295,150,-64,108,-64,150,-77,150,-77,108,-64,99,-63,150,-77,99,-63,44,-77,44,-77,99,-63,92,-61,44,-77,92,-61,86,-56,83,-48,44,-77,86,-56,150,331,108,319,150,319, +143,-6,29,338,-3,338,109,-6,123,-77,123,331,17,331,17,319, +143,-6,29,338,-3,338,143,-6,-3,338,109,-6, +123,-77,123,331,17,331,17,319,59,319,69,318,76,314,81,309,83,301,84,291,84,-50,81,-56,77,-61,70,-63,61,-64,17,-64,17,-77,223,148,132,331,103,331,12,148,46,148,118,293,189,148,250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,40,335,35,337,27,339, +123,-77,123,331,84,291,123,-77,84,291,84,-41,123,-77,84,-41,84,-50,123,-77,84,-50,81,-56,123,-77,81,-56,77,-61,123,-77,77,-61,70,-63,123,-77,70,-63,61,-64,123,-77,61,-64,17,-64,123,-77,17,-64,17,-77,76,314,81,309,123,331,123,331,81,309,83,301,123,331,83,301,84,291,123,331,17,331,59,319,123,331,59,319,69,318,123,331,69,318,76,314,59,319,17,331,17,319, +223,148,132,331,103,331,12,148,46,148,118,293,189,148,250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332, +12,148,46,148,103,331,103,331,46,148,118,293,103,331,118,293,132,331,132,331,118,293,189,148,132,331,189,148,223,148, +250,-62,250,-36,0,-36,0,-62,121,253,49,328,44,332,40,335, +250,-62,250,-36,0,-36,250,-62,0,-36,0,-62, +121,253,49,328,44,332,40,335,35,337,27,339,21,338,16,336,12,333,10,329,9,323,10,318,12,314,15,309,19,305,24,301,101,253,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226, +101,253,121,253,49,328,101,253,49,328,44,332,101,253,44,332,40,335,101,253,40,335,35,337,101,253,35,337,31,338,101,253,31,338,27,339,101,253,27,339,24,301,9,323,10,318,10,329,10,329,10,318,12,314,10,329,12,314,12,333,12,333,12,314,15,309,12,333,15,309,16,336,16,336,15,309,19,305,16,336,19,305,21,338,21,338,19,305,24,301,21,338,24,301,27,339, +221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,76,340,74,342,62,338,51,334,41,331,29,328,17,324,2,320,2,311,5,311,6,312,10,312,21,311,28,309,32,304,34,296,35,283,35,28,39,18,52,9,71,2,93,-2,117,-4,155,1,187,18,212,44,228,78,234,120,230,155,218,185,199,209,174,224,144,230,126,228,110,223,96,214,85,202,76,188,16383,16383,76,159,79,171,86,182,97,191,111,197,126,199,137,198,146,195,155,190,164,183,171,175,177,163,183,149,186,133,189,116,190,99,189,82,187,67,183,54,178,42,171,32,164,25,156,19,147,15,136,12,125,11,110,12,97,16,86,21,79,28,76,37,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204, +37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175, +76,340,74,342,62,338,51,334,41,331,29,328,17,324,2,320,2,311,5,311,6,312,10,312,21,311,28,309,32,304,34,296,35,283,35,28,39,18,52,9,71,2,93,-2,117,-4,155,1,187,18,212,44,228,78,234,120,230,155,218,185,199,209,174,224,144,230,126,228,110,223,96,214,85,202,76,188,16383,16383,76,159,79,171,86,182,97,191,111,197,126,199,137,198,146,195,155,190,164,183,171,175,177,163,183,149,186,133,189,116,190,99,189,82,187,67,183,54,178,42,171,32,164,25,156,19,147,15,136,12,125,11,110,12,97,16,86,21,79,28,76,37,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,40,189,28,172,19,152,14,130,12,106,17,70,30,39,50,15,76,0,108,-4,120,-3,132,-1,144,3,155,9,165,16,174,24,181,32,189,43,197,57,206,74,246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37, +5,311,6,312,17,324,17,324,6,312,8,312,17,324,8,312,10,312,10,312,21,311,17,324,17,324,21,311,29,328,97,16,86,21,93,-2,93,-2,86,21,79,28,93,-2,79,28,71,2,71,2,79,28,76,37,71,2,76,37,74,342,74,342,76,37,76,188,74,342,76,188,76,340,62,338,51,334,52,9,52,9,51,334,41,331,52,9,41,331,39,18,39,18,41,331,35,283,39,18,35,283,35,28,3,311,5,311,17,324,3,311,17,324,2,320,3,311,2,320,2,311,156,19,147,15,155,1,155,1,147,15,136,12,155,1,136,12,125,11,125,11,110,12,117,-4,117,-4,110,12,97,16,117,-4,97,16,93,-2,62,338,52,9,71,2,62,338,71,2,74,342,21,311,28,309,29,328,29,328,28,309,32,304,29,328,32,304,41,331,41,331,32,304,34,296,41,331,34,296,35,283,126,228,126,199,137,198,126,228,137,198,144,230,144,230,137,198,146,195,144,230,146,195,174,224,174,224,146,195,155,190,174,224,155,190,164,183,76,159,79,171,85,202,85,202,79,171,86,182,85,202,86,182,96,214,96,214,86,182,97,191,96,214,97,191,110,223,110,223,97,191,111,197,110,223,111,197,126,228,126,228,111,197,126,199,76,159,85,202,76,188,76,159,76,188,76,37,174,224,171,175,177,163,174,224,177,163,199,209,199,209,177,163,183,149,199,209,183,149,186,133,187,67,183,54,187,18,187,18,183,54,178,42,187,18,178,42,171,32,171,32,164,25,187,18,187,18,164,25,156,19,187,18,156,19,155,1,234,120,230,155,228,78,228,78,230,155,218,185,228,78,218,185,212,44,212,44,218,185,199,209,212,44,199,209,190,99,190,99,199,209,189,116,187,67,187,18,189,82,189,82,187,18,212,44,189,82,212,44,190,99,125,11,117,-4,155,1,199,209,186,133,189,116,174,224,164,183,171,175, +199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,221,67,213,55,204,40,189,28,172,19,152,14,130,12,106,17,70,30,39,50,15,76,0,108,-4,120,-3,132,-1,144,3,155,9,165,16,174,24,181,32,189,43,197,57,206,74,246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,213,45,212,57,212,340,209,342,195,337,169,329,154,324,136,320,136,311,138,312,147,312,156,311,163,309,167,304,170,297,170,209,159,217,149,223,139,227,129,229,118,230,85,223,56,206,34,178,19,143,13,103,18,67,30,37,49,14,75,0,106,-4,122,-3,136,0,148,7,160,16,170,28,170,-2,172,-4,16383,16383,170,51,170,49,169,46,165,40,162,37,157,31,150,27,143,24,135,22,126,21,102,26,83,39,69,60,60,88,56,123, +81,49,65,69,76,0,76,0,65,69,54,96,76,0,54,96,50,15,50,15,54,96,51,128,55,204,51,128,54,157,55,204,54,157,63,181,128,31,108,-4,120,-3,128,31,120,-3,132,-1,128,31,103,36,108,-4,81,49,76,0,108,-4,81,49,108,-4,103,36,136,212,141,208,146,227,146,227,141,208,145,201,146,227,145,201,148,191,148,191,151,180,167,220,167,220,151,180,154,172,167,220,154,172,159,166,122,230,119,215,128,215,122,230,128,215,146,227,146,227,128,215,136,212,195,195,184,209,189,161,195,195,189,161,195,166,195,195,195,166,198,172,195,195,198,172,199,179,184,209,167,220,169,158,184,209,169,158,175,157,184,209,175,157,183,158,184,209,183,158,189,161,167,220,159,166,163,161,167,220,163,161,169,158,167,220,146,227,148,191,174,24,181,32,185,60,185,60,181,32,189,43,185,60,189,43,199,78,199,78,189,43,197,57,199,78,197,57,206,74,132,-1,144,3,144,33,144,33,144,3,155,9,144,33,155,9,159,38,159,38,155,9,165,16,159,38,165,16,172,46,172,46,165,16,174,24,172,46,174,24,185,60,144,33,128,31,132,-1,96,211,119,215,108,229,96,211,108,229,94,226,96,211,94,226,80,221,96,211,80,221,78,200,67,213,55,204,63,181,67,213,63,181,78,200,67,213,78,200,80,221,40,189,28,172,30,39,40,189,30,39,50,15,40,189,50,15,51,128,40,189,51,128,55,204,19,152,14,130,17,70,19,152,17,70,30,39,19,152,30,39,28,172,119,215,122,230,108,229,17,70,14,130,12,106, +246,21,246,29,239,29,237,28,234,28,225,29,218,32,215,37,213,45,212,57,212,340,209,342,195,337,169,329,154,324,136,320,136,311,138,312,147,312,156,311,163,309,167,304,170,297,170,209,159,217,149,223,139,227,129,229,118,230,85,223,56,206,34,178,19,143,13,103,18,67,30,37,49,14,75,0,106,-4,122,-3,136,0,148,7,160,16,170,28,170,-2,172,-4,16383,16383,170,51,170,49,169,46,165,40,162,37,157,31,150,27,143,24,135,22,126,21,102,26,83,39,69,60,60,88,56,123,59,154,67,180,80,199,98,212,119,216,135,213,149,206,160,195,167,181,170,166,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209, +170,209,159,217,160,195,160,195,159,217,149,223,160,195,149,223,149,206,149,206,149,223,139,227,149,206,139,227,135,213,135,213,139,227,129,229,135,213,129,229,119,216,67,180,80,199,85,223,85,223,80,199,98,212,85,223,98,212,118,230,118,230,98,212,119,216,118,230,119,216,129,229,13,103,18,67,19,143,19,143,18,67,30,37,19,143,30,37,34,178,34,178,30,37,49,14,34,178,49,14,56,206,56,206,49,14,56,123,56,206,56,123,59,154,56,206,59,154,67,180,56,206,67,180,85,223,126,21,106,-4,122,-3,126,21,122,-3,136,0,126,21,102,26,106,-4,83,39,69,60,75,0,83,39,75,0,106,-4,83,39,106,-4,102,26,60,88,56,123,49,14,60,88,49,14,75,0,60,88,75,0,69,60,169,46,167,43,170,28,170,28,167,43,165,40,170,28,165,40,162,37,162,37,157,31,160,16,160,16,157,31,150,27,160,16,150,27,148,7,148,7,150,27,143,24,148,7,143,24,136,0,136,0,143,24,135,22,136,0,135,22,126,21,140,312,142,312,154,324,154,324,142,312,145,312,154,324,145,312,147,312,147,312,156,311,154,324,154,324,156,311,169,329,154,324,136,320,138,312,154,324,138,312,140,312,170,209,170,166,170,28,170,209,170,28,170,286,170,297,170,286,182,333,170,297,182,333,169,329,170,209,160,195,167,181,170,209,167,181,170,166,172,-4,246,21,225,29,172,-4,225,29,218,32,172,-4,218,32,215,37,172,-4,215,37,213,45,172,-4,213,45,182,333,172,-4,182,333,170,28,172,-4,170,28,170,-2,170,28,170,166,170,51,170,28,170,51,170,49,170,28,170,49,169,46,162,37,160,16,170,28,212,57,212,340,209,342,212,57,209,342,195,337,212,57,195,337,213,45,239,29,237,28,246,21,246,21,237,28,235,28,246,21,235,28,234,28,234,28,225,29,246,21,241,29,239,29,246,21,241,29,246,21,246,29,169,329,156,311,163,309,169,329,163,309,167,304,169,329,167,304,170,297,138,312,136,320,136,311,182,333,170,286,170,28,182,333,213,45,195,337, +204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,155,225,94,225,94,283,95,299,98,311,104,320,111,326,122,328,128,327,133,325,138,321,143,316,148,308,153,301,157,296,161,293,166,291,171,290,177,291,183,294,188,298,190,304,191,310,189,321,182,329,171,336,156,340,140,342,121,340,105,335,90,328,78,318,69,305,62,292, +52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15, +11,225,11,209,51,209,51,52,50,34,47,21,40,13,28,9,10,7,10,0,140,0,140,7,119,9,106,13,98,21,95,33,94,52,94,209,155,209,155,225,94,225,94,283,95,299,98,311,104,320,111,326,122,328,128,327,133,325,138,321,143,316,148,308,153,301,157,296,161,293,166,291,171,290,177,291,183,294,188,298,190,304,191,310,189,321,182,329,171,336,156,340,140,342,121,340,105,335,90,328,78,318,69,305,62,292,57,279,54,264,52,247,51,225,235,194,235,214,185,214,180,215,175,217,169,219,158,223,134,229,126,230,118,230,91,226,68,214,51,197,39,174,35,148,36,131,41,116,50,103,63,92,81,81,77,77,72,73,60,61,51,53,44,46,40,39,37,33,36,27,37,21,40,16,44,11,52,6,63,1,44,-13,30,-26,21,-37,16,-48,14,-59,18,-75,31,-88,49,-98,73,-105,100,-108,122,-106,144,-102,165,-96,184,-87,200,-76,211,-66,220,-56,226,-46,229,-35,230,-24,228,-6,220,7,207,18,190,26, +57,279,54,264,95,33,95,33,54,264,52,247,95,33,52,247,51,209,51,209,52,247,51,225,51,209,51,225,11,225,78,318,95,33,94,52,94,225,94,209,155,209,94,225,155,209,155,225,133,325,140,342,128,327,128,327,140,342,122,328,111,326,122,328,121,340,111,326,121,340,105,335,94,283,95,299,90,328,90,328,95,299,98,311,90,328,98,311,105,335,105,335,98,311,104,320,105,335,104,320,111,326,90,328,78,318,94,52,90,328,94,52,94,283,189,321,182,329,183,294,189,321,183,294,188,298,189,321,188,298,190,304,189,321,190,304,191,310,166,291,171,290,171,336,171,336,171,290,177,291,171,336,177,291,182,329,182,329,177,291,183,294,148,308,153,301,156,340,156,340,153,301,157,296,156,340,157,296,171,336,171,336,157,296,161,293,171,336,161,293,166,291,143,316,148,308,156,340,143,316,156,340,140,342,143,316,140,342,138,321,140,342,121,340,122,328,140,0,140,7,119,9,140,0,119,9,106,13,140,0,106,13,50,34,140,0,50,34,47,21,140,0,47,21,40,13,140,0,40,13,28,9,140,0,28,9,10,7,140,0,10,7,10,0,95,33,78,318,69,305,95,33,69,305,62,292,95,33,62,292,57,279,51,52,50,34,106,13,51,52,106,13,98,21,51,52,98,21,95,33,51,52,95,33,51,209,51,209,11,225,11,209,140,342,133,325,138,321, +235,194,235,214,185,214,180,215,175,217,169,219,158,223,134,229,126,230,118,230,91,226,68,214,51,197,39,174,35,148,36,131,41,116,50,103,63,92,81,81,77,77,72,73,60,61,51,53,44,46,40,39,37,33,36,27,37,21,40,16,44,11,52,6,63,1,44,-13,30,-26,21,-37,16,-48,14,-59,18,-75,31,-88,49,-98,73,-105,100,-108,122,-106,144,-102,165,-96,184,-87,200,-76,211,-66,220,-56,226,-46,229,-35,230,-24,228,-6,220,7,207,18,190,26,170,29,105,32,91,33,80,35,72,38,68,41,66,46,68,52,73,60,80,67,88,73,97,77,106,76,111,75,125,75,136,76,146,78,157,82,167,87,177,94,186,103,194,113,199,124,202,137,203,152,203,160,202,168,200,176,194,194,16383,16383,76,169,78,185,82,198,90,208,100,214,113,216,122,215,130,212,137,207,144,201,150,193,155,181,159,169,162,157,164,145,165,132,163,117,158,104,150,95,140,89,127,87,110,91,96,102,85,118,78,141,76,167,16383,16383,217,-31,212,-47,200,-60,180,-71,153,-77,122,-79,97,-78,77,-73,62,-65,52,-55,49,-43,50,-36,52,-30,56,-22,63,-13,74,0,86,-2,102,-4,138,-6,155,-6,178,-7,196,-10,208,-14,214,-21,217,-31,243,0,243,7,230,10,221,15,216,22,214,34,214,151,211,179,204,201,191,217,174,227,152,230,135,228,120,224,106,216,92,204,79,188,79,340,76,342,66,338,46,332,34,328,18,324,5,320,5,311,6,312,11,312,22,311,29,309,34,305,36,297,36,33,33,22,28,15,19,10,4,7,4,0,113,0,113,7,98,10,88,14,82,22,79,34,79,171,90,184,101,193,112,199,123,202,134,203,148,201,158,195,165,184,170,169,171,150,171,34,168,22,162,14,152,10,137,7,137,0,90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197, +85,118,81,81,88,73,88,73,81,81,80,67,80,67,81,81,77,77,80,67,77,77,73,60,73,60,77,77,72,73,73,60,72,73,68,52,68,52,72,73,68,69,68,52,68,69,66,46,66,46,64,65,63,-13,63,-13,64,65,63,1,116,75,127,87,111,75,111,75,127,87,110,91,111,75,110,91,106,76,106,76,110,91,97,77,88,73,97,77,96,102,88,73,96,102,85,118,118,230,113,216,122,215,118,230,122,215,126,230,126,230,122,215,130,212,126,230,130,212,134,229,134,229,130,212,137,207,134,229,137,207,142,227,142,227,137,207,144,201,142,227,144,201,150,225,150,225,144,201,150,193,127,87,116,75,120,75,127,87,120,75,123,75,127,87,123,75,125,75,127,87,125,75,136,76,110,91,96,102,97,77,169,219,158,223,159,169,169,219,159,169,162,157,169,219,162,157,164,145,169,219,164,145,165,132,169,219,165,132,167,87,169,219,167,87,177,94,169,219,177,94,175,217,167,87,165,132,163,117,167,87,163,117,158,104,167,87,158,104,157,82,127,87,136,76,140,89,140,89,136,76,146,78,140,89,146,78,150,95,150,95,146,78,157,82,150,95,157,82,158,104,82,198,90,208,91,226,91,226,90,208,100,214,91,226,100,214,118,230,118,230,100,214,113,216,76,167,76,169,68,214,68,214,76,169,78,185,68,214,78,185,91,226,91,226,78,185,82,198,81,81,85,118,78,141,81,81,78,141,76,167,81,81,76,167,68,214,81,81,68,214,63,92,51,197,39,174,41,116,51,197,41,116,50,103,51,197,50,103,63,92,51,197,63,92,68,214,39,174,35,148,36,131,39,174,36,131,41,116,51,53,44,46,44,11,51,53,44,11,52,6,51,53,52,6,60,61,36,27,37,21,37,33,37,33,37,21,40,16,37,33,40,16,40,39,40,39,40,16,44,11,40,39,44,11,44,46,30,-26,31,-88,44,-13,44,-13,31,-88,49,-98,44,-13,49,-98,49,-43,49,-43,50,-36,44,-13,44,-13,50,-36,52,-30,44,-13,52,-30,63,1,63,1,52,-30,56,-22,63,1,56,-22,63,-13,74,0,72,38,68,41,74,0,68,41,66,46,74,0,66,46,63,-13,74,0,80,35,72,38,60,61,52,6,63,1,60,61,63,1,64,65,62,-65,73,-105,77,-73,77,-73,73,-105,100,-108,77,-73,100,-108,97,-78,97,-78,100,-108,122,-79,153,-77,122,-79,122,-106,153,-77,122,-106,144,-102,52,-55,49,-43,49,-98,52,-55,49,-98,73,-105,52,-55,73,-105,62,-65,21,-37,16,-48,18,-75,21,-37,18,-75,31,-88,21,-37,31,-88,30,-26,196,214,191,214,194,194,196,214,194,194,235,194,196,214,235,194,235,214,202,137,203,152,203,160,202,137,203,160,202,168,202,137,202,168,200,176,202,137,200,176,199,124,197,185,194,194,194,113,197,185,194,113,199,124,197,185,199,124,200,176,191,214,185,214,186,103,191,214,186,103,194,113,191,214,194,113,194,194,180,215,175,217,177,94,180,215,177,94,186,103,180,215,186,103,185,214,155,181,159,169,158,223,155,181,158,223,150,225,155,181,150,225,150,193,208,-14,214,-21,220,7,220,7,214,-21,217,-31,220,-56,217,-31,212,-47,138,-6,155,-6,170,29,170,29,155,-6,178,-7,170,29,178,-7,190,26,190,26,178,-7,196,-10,190,26,196,-10,207,18,207,18,196,-10,208,-14,207,18,208,-14,220,7,228,-6,220,7,220,-56,228,-6,220,-56,226,-46,228,-6,226,-46,229,-35,228,-6,229,-35,230,-24,153,-77,165,-96,180,-71,180,-71,165,-96,184,-87,180,-71,184,-87,200,-60,200,-60,184,-87,200,-76,200,-60,200,-76,212,-47,212,-47,200,-76,211,-66,212,-47,211,-66,220,-56,138,-6,170,29,120,-5,120,-5,170,29,105,32,120,-5,105,32,102,-4,102,-4,105,32,91,33,102,-4,91,33,86,-2,86,-2,91,33,80,35,86,-2,80,35,74,0,122,-79,100,-108,122,-106,153,-77,144,-102,165,-96,217,-31,220,-56,220,7,18,-75,16,-48,14,-59,64,65,66,46,68,69, +243,0,243,7,230,10,221,15,216,22,214,34,214,151,211,179,204,201,191,217,174,227,152,230,135,228,120,224,106,216,92,204,79,188,79,340,76,342,66,338,46,332,34,328,18,324,5,320,5,311,6,312,11,312,22,311,29,309,34,305,36,297,36,33,33,22,28,15,19,10,4,7,4,0,113,0,113,7,98,10,88,14,82,22,79,34,79,171,90,184,101,193,112,199,123,202,134,203,148,201,158,195,165,184,170,169,171,150,171,34,168,22,162,14,152,10,137,7,137,0,90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292, +33,22,28,15,113,0,113,0,28,15,19,10,113,0,19,10,4,7,7,312,9,312,18,324,18,324,9,312,10,312,18,324,10,312,11,312,11,312,22,311,18,324,18,324,22,311,34,328,18,324,5,320,6,312,18,324,6,312,7,312,88,14,82,22,36,51,36,51,82,22,79,34,36,51,79,34,36,286,36,297,36,286,46,332,36,297,46,332,34,328,34,328,22,311,29,309,34,328,29,309,34,305,34,328,34,305,36,297,79,188,79,340,76,342,79,188,76,342,79,51,79,51,76,342,66,338,79,51,66,338,79,34,79,34,66,338,56,335,79,34,56,335,46,332,135,228,134,203,148,201,135,228,148,201,152,230,152,230,148,201,158,195,152,230,158,195,174,227,174,227,158,195,165,184,174,227,165,184,170,169,79,171,90,184,92,204,92,204,90,184,101,193,92,204,101,193,106,216,106,216,101,193,112,199,106,216,112,199,120,224,120,224,112,199,123,202,120,224,123,202,135,228,135,228,123,202,134,203,79,51,79,171,79,188,79,188,79,171,92,204,168,22,162,14,243,0,243,0,162,14,152,10,243,0,152,10,137,7,174,227,170,169,171,150,216,22,171,150,171,51,216,22,171,51,221,15,221,15,171,51,171,34,221,15,171,34,243,0,243,0,171,34,168,22,214,51,214,151,211,179,214,51,211,179,204,201,214,51,204,201,214,34,230,10,221,15,243,0,230,10,243,0,243,7,171,150,216,22,174,227,174,227,216,22,214,34,174,227,214,34,191,217,191,217,214,34,204,201,113,0,113,7,98,10,113,0,98,10,88,14,113,0,88,14,36,33,113,0,36,33,33,22,113,0,4,7,4,0,36,33,88,14,36,51,36,286,79,34,46,332,243,0,137,7,137,0,6,312,5,320,5,311, +90,316,89,324,85,331,80,337,73,340,65,342,56,340,49,336,44,331,40,324,39,316,40,308,44,301,49,295,56,292,64,291,73,292,80,295,85,301,89,308,90,316,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,88,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,45,196,49,193,52,187,54,178,55,167,55,-21,54,-41,54,-56,52,-67,50,-76,47,-82, +39,316,40,308,40,324,40,324,40,308,44,301,40,324,44,301,44,331,44,331,44,301,49,295,44,331,49,295,49,336,49,336,49,295,56,292,49,336,56,292,56,340,56,340,56,292,64,291,56,340,64,291,65,342,65,342,64,291,73,292,65,342,73,292,73,340,73,340,73,292,80,295,73,340,80,295,80,337,80,337,80,295,85,301,80,337,85,301,85,331,85,331,85,301,89,308,85,331,89,308,89,324,89,324,89,308,90,316,43,20,37,13,127,0,127,0,37,13,25,9,127,0,25,9,8,7,20,197,24,197,88,230,88,230,24,197,28,197,88,230,28,197,31,197,31,197,38,196,88,230,88,230,38,196,42,193,88,230,42,193,45,187,43,20,127,0,47,33,47,33,127,0,99,14,47,33,99,14,47,52,47,52,99,14,93,21,47,52,93,21,47,166,47,178,47,166,88,230,47,178,88,230,45,187,15,196,20,197,88,230,15,196,88,230,10,203,15,196,10,203,10,195,89,52,89,228,88,230,89,52,88,230,47,166,89,52,47,166,90,34,110,9,99,14,127,0,110,9,127,0,127,7,127,0,8,7,8,0,47,166,93,21,90,34, +97,316,96,324,92,331,86,337,79,340,71,342,63,340,56,336,51,331,47,324,46,316,47,308,51,301,56,295,63,292,71,291,79,292,87,295,92,301,96,308,97,316,16383,16383,97,228,94,230,77,224,62,218,48,213,33,208,16,203,16,195,18,195,23,196,27,197,39,197,45,196,49,193,52,187,54,178,55,167,55,-21,54,-41,54,-56,52,-67,50,-76,47,-82,45,-85,39,-89,35,-91,26,-91,18,-87,14,-83,4,-71,0,-66,-4,-63,-9,-61,-14,-61,-20,-62,-26,-65,-30,-69,-33,-74,-34,-80,-32,-90,-26,-97,-16,-103,-3,-107,12,-108,42,-103,65,-90,83,-68,93,-38,97,0,252,0,252,7,240,9,228,13,217,20,206,30,194,44,118,141,132,155,164,183,188,201,206,212,222,217,240,218,240,225,138,225,138,218,148,218,155,217,160,215,162,212,163,209,161,203,155,195,151,191,83,131,83,340,81,342,70,338,48,332,35,328,18,324,3,320,3,311,7,312,17,312,20,313,28,312,34,309,38,303,40,294,41,282,41,41,40,28,38,20,32,14,21,11,3,7,3,0,121,0,121,7,110,8,100,9,92,12,87,17,84,24,83,33,83,126,158,26,160,24,162,21,163,19,163,17,164,15,163,13,162,10,153,7,143,7,143,0,128,0,128,7, +86,337,87,295,92,331,92,331,87,295,92,301,92,331,92,301,96,324,96,324,92,301,96,308,96,324,96,308,97,316,46,316,47,308,47,324,47,324,47,308,51,301,47,324,51,301,51,331,51,331,51,301,56,295,51,331,56,295,56,336,56,336,56,295,63,292,56,336,63,292,63,340,63,340,63,292,71,291,63,340,71,291,71,342,71,342,71,291,79,292,71,342,79,292,79,340,79,340,79,292,87,295,79,340,87,295,86,337,18,195,23,196,33,208,18,195,33,208,16,203,18,195,16,203,16,195,42,-87,39,-89,42,-103,42,-103,39,-89,35,-91,42,-103,35,-91,31,-91,31,-91,26,-91,42,-103,42,-103,26,-91,22,-89,42,-103,22,-89,18,-87,52,187,62,218,49,193,49,193,62,218,48,213,49,193,48,213,45,196,45,196,48,213,39,197,35,197,39,197,48,213,35,197,48,213,33,208,54,-56,52,-67,65,-90,65,-90,52,-67,50,-76,65,-90,50,-76,47,-82,47,-82,45,-85,65,-90,65,-90,45,-85,42,-87,65,-90,42,-87,42,-103,93,-38,94,230,83,-68,83,-68,94,230,77,224,83,-68,77,224,65,-90,65,-90,77,224,62,218,65,-90,62,218,55,167,55,167,62,218,54,178,33,208,23,196,27,197,33,208,27,197,32,197,33,208,32,197,35,197,97,0,97,228,94,230,97,0,94,230,93,-38,65,-90,55,167,55,-21,65,-90,55,-21,54,-41,65,-90,54,-41,54,-56,12,-108,42,-103,18,-87,12,-108,18,-87,14,-83,12,-108,14,-83,9,-77,12,-108,9,-77,4,-71,12,-108,4,-71,0,-66,12,-108,0,-66,-3,-107,-3,-107,0,-66,-4,-63,-3,-107,-4,-63,-9,-61,-3,-107,-9,-61,-14,-61,-3,-107,-14,-61,-16,-103,-20,-62,-26,-65,-26,-97,-20,-62,-26,-97,-16,-103,-20,-62,-16,-103,-14,-61,-30,-69,-33,-74,-32,-90,-30,-69,-32,-90,-26,-97,-30,-69,-26,-97,-26,-65,-32,-90,-33,-74,-34,-80,62,218,52,187,54,178, +252,0,252,7,240,9,228,13,217,20,206,30,194,44,118,141,132,155,164,183,188,201,206,212,222,217,240,218,240,225,138,225,138,218,148,218,155,217,160,215,162,212,163,209,161,203,155,195,151,191,83,131,83,340,81,342,70,338,48,332,35,328,18,324,3,320,3,311,7,312,17,312,20,313,28,312,34,309,38,303,40,294,41,282,41,41,40,28,38,20,32,14,21,11,3,7,3,0,121,0,121,7,110,8,100,9,92,12,87,17,84,24,83,33,83,126,158,26,160,24,162,21,163,19,163,17,164,15,163,13,162,10,153,7,143,7,143,0,128,0,128,7,112,9,101,13,95,20,92,29,91,44,91,339,89,342,74,337,59,333,45,329,28,324,9,320,9,311,14,312,25,312,28,313,36,311,42,308,46,302,48,293,49,281,49,46,48,32,45,21,38,14,27,10,11,7,11,0,387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,83,228,79,230,51,220,25,212,9,208,9,199,13,200,16,200,19,201, +38,20,32,14,121,0,121,0,32,14,21,11,121,0,21,11,3,7,10,312,14,312,18,324,18,324,14,312,17,312,18,324,17,312,20,313,20,313,28,312,35,328,35,328,28,312,34,309,35,328,34,309,38,303,7,312,10,312,18,324,7,312,18,324,3,320,7,312,3,320,3,311,194,44,118,141,158,26,158,26,118,141,83,131,158,26,83,131,83,126,84,24,83,33,48,332,84,24,48,332,41,282,41,282,48,332,40,294,48,332,35,328,38,303,48,332,38,303,40,294,35,328,18,324,20,313,83,33,83,340,81,342,83,33,81,342,70,338,83,33,70,338,59,335,83,33,59,335,48,332,151,191,118,141,132,155,151,191,132,155,164,183,151,191,83,131,118,141,161,203,158,199,164,183,164,183,158,199,155,195,164,183,155,195,151,191,240,225,138,225,148,218,240,225,148,218,155,217,240,225,155,217,160,215,240,225,160,215,162,212,240,225,162,212,163,209,240,225,163,209,206,212,240,225,206,212,222,217,240,225,222,217,240,218,163,209,164,183,188,201,163,209,188,201,206,212,164,183,163,209,162,206,164,183,162,206,161,203,162,10,159,9,252,0,252,0,159,9,156,8,252,0,156,8,153,7,164,15,252,0,228,13,164,15,228,13,217,20,164,15,217,20,206,30,164,15,206,30,194,44,164,15,194,44,163,17,194,44,158,26,160,24,194,44,160,24,162,21,194,44,162,21,163,19,194,44,163,19,163,17,240,9,228,13,252,0,240,9,252,0,252,7,163,13,162,10,252,0,163,13,252,0,164,15,143,7,143,0,252,0,143,7,252,0,153,7,121,0,121,7,110,8,121,0,110,8,100,9,121,0,100,9,92,12,121,0,92,12,40,28,121,0,40,28,38,20,92,12,87,17,41,41,41,41,87,17,84,24,41,41,84,24,41,282,121,0,3,7,3,0,40,28,92,12,41,41,148,218,138,225,138,218, +128,0,128,7,112,9,101,13,95,20,92,29,91,44,91,339,89,342,74,337,59,333,45,329,28,324,9,320,9,311,14,312,25,312,28,313,36,311,42,308,46,302,48,293,49,281,49,46,48,32,45,21,38,14,27,10,11,7,11,0,387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191, +45,21,38,14,128,0,128,0,38,14,27,10,128,0,27,10,11,7,18,312,22,312,28,324,28,324,22,312,25,312,28,324,25,312,28,313,28,313,36,311,28,324,28,324,36,311,45,329,28,324,9,320,14,312,28,324,14,312,18,312,36,311,42,308,45,329,45,329,42,308,46,302,45,329,46,302,59,333,59,333,46,302,48,293,59,333,48,293,49,281,92,29,49,281,49,46,92,29,49,46,95,20,95,20,49,46,101,13,91,44,91,339,89,342,91,44,89,342,74,337,91,44,74,337,59,333,91,44,59,333,92,29,128,0,128,7,112,9,128,0,112,9,101,13,128,0,101,13,48,32,128,0,48,32,45,21,14,312,9,320,9,311,128,0,11,7,11,0,48,32,101,13,49,46,49,281,92,29,59,333, +387,0,387,7,374,8,366,10,360,13,356,19,354,27,353,39,353,140,351,172,344,197,333,215,317,226,295,230,278,228,262,224,246,215,230,204,214,188,207,203,199,215,188,223,176,228,161,230,147,229,133,226,119,220,103,208,84,191,83,191,83,228,79,230,51,220,25,212,9,208,9,199,13,200,16,200,19,201,26,201,32,200,37,196,41,190,42,181,43,168,43,44,42,29,39,19,32,12,22,9,8,7,8,0,119,0,119,7,105,8,96,11,89,16,86,24,85,35,85,175,99,189,109,195,121,200,133,203,145,204,156,202,165,195,172,183,176,168,177,148,177,43,176,28,173,18,167,12,157,9,143,7,143,0,255,0,255,7,240,9,230,12,223,19,220,31,219,47,219,174,228,185,237,194,248,200,259,203,272,204,287,202,298,196,305,185,310,169,311,148,311,45,310,30,307,20,302,14,293,10,278,7,278,0,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91, +16,200,19,201,25,212,25,212,19,201,22,201,25,212,22,201,26,201,26,201,32,200,38,216,38,216,32,200,37,196,38,216,37,196,41,190,25,212,9,208,13,200,25,212,13,200,16,200,38,216,41,190,51,220,51,220,41,190,42,181,51,220,42,181,43,168,86,24,43,168,43,44,86,24,43,44,89,16,89,16,43,44,96,11,38,216,25,212,26,201,83,228,79,230,83,191,83,191,79,230,85,35,83,191,85,35,84,191,84,191,85,35,85,174,84,191,85,174,85,175,173,18,167,12,255,0,255,0,167,12,157,9,255,0,157,9,143,7,161,230,147,229,156,202,156,202,147,229,145,204,133,203,145,204,133,226,133,203,133,226,121,200,121,200,133,226,119,220,121,200,119,220,109,195,109,195,119,220,103,208,109,195,103,208,99,189,99,189,103,208,92,182,103,208,84,191,85,175,103,208,85,175,86,176,103,208,86,176,88,178,103,208,88,178,90,180,103,208,90,180,92,182,85,35,79,230,65,225,85,35,65,225,86,24,147,229,133,226,145,204,173,18,255,0,176,28,176,28,255,0,230,12,176,28,230,12,177,43,177,43,230,12,223,19,177,43,223,19,177,148,176,228,177,148,188,223,176,228,161,230,165,195,176,228,165,195,172,183,176,228,172,183,176,168,176,228,176,168,177,148,207,203,199,215,220,31,207,203,220,31,219,47,207,203,219,47,214,188,219,174,228,185,230,204,230,204,228,185,237,194,230,204,237,194,246,215,246,215,237,194,248,200,246,215,248,200,262,224,262,224,248,200,259,203,262,224,259,203,272,204,272,204,287,202,278,228,278,228,287,202,295,230,219,47,219,174,214,188,214,188,219,174,230,204,278,228,262,224,272,204,307,20,302,14,387,0,387,0,302,14,293,10,387,0,293,10,278,7,298,196,305,185,317,226,317,226,305,185,310,169,317,226,310,169,311,148,356,19,311,148,311,45,356,19,311,45,360,13,360,13,311,45,310,30,360,13,310,30,366,10,366,10,310,30,387,0,366,10,387,0,374,8,374,8,387,0,387,7,295,230,287,202,298,196,295,230,298,196,317,226,353,39,353,140,351,172,353,39,351,172,344,197,353,39,344,197,333,215,353,39,333,215,354,27,354,27,333,215,317,226,354,27,317,226,311,148,354,27,311,148,356,19,240,9,230,12,255,0,240,9,255,0,255,7,220,31,199,215,188,223,220,31,188,223,177,148,220,31,177,148,223,19,119,0,119,7,105,8,119,0,105,8,96,11,119,0,96,11,42,29,119,0,42,29,39,19,119,0,39,19,32,12,119,0,32,12,22,9,119,0,22,9,8,7,119,0,8,7,8,0,51,220,43,168,86,24,51,220,86,24,65,225,13,200,9,208,9,199,42,29,96,11,43,44,255,0,143,7,143,0,387,0,278,7,278,0,307,20,387,0,310,30,161,230,156,202,165,195, +243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78, +37,21,31,14,114,0,114,0,31,14,22,9,114,0,22,9,9,7,13,200,16,201,23,212,23,212,16,201,19,201,23,212,19,201,22,201,22,201,30,200,23,212,23,212,30,200,37,216,23,212,8,208,10,200,23,212,10,200,13,200,30,200,35,197,37,216,37,216,35,197,38,191,37,216,38,191,50,220,50,220,38,191,40,181,50,220,40,181,40,169,83,26,40,169,40,47,83,26,40,47,86,18,86,18,40,47,92,13,80,228,76,230,80,190,80,190,76,230,82,36,80,190,82,36,81,190,81,190,82,36,82,174,81,190,82,174,96,205,96,205,82,174,95,186,96,205,95,186,105,194,96,205,105,194,111,216,111,216,105,194,115,199,111,216,115,199,125,224,125,224,115,199,124,202,125,224,124,202,133,203,133,203,147,201,139,229,139,229,147,201,153,230,82,36,76,230,63,225,82,36,63,225,83,26,139,229,125,224,133,203,166,23,161,15,243,0,243,0,161,15,152,10,243,0,152,10,139,7,157,195,164,185,174,227,174,227,164,185,169,171,174,227,169,171,170,152,216,19,170,152,170,52,216,19,170,52,221,13,221,13,170,52,169,35,221,13,169,35,243,0,243,0,169,35,166,23,153,230,147,201,157,195,153,230,157,195,174,227,212,42,212,153,210,180,212,42,210,180,202,201,212,42,202,201,213,29,230,9,221,13,243,0,230,9,243,0,243,7,213,29,202,201,190,217,213,29,190,217,174,227,213,29,174,227,170,152,213,29,170,152,216,19,114,0,114,7,101,9,114,0,101,9,92,13,114,0,92,13,39,32,114,0,39,32,37,21,50,220,40,169,83,26,50,220,83,26,63,225,10,200,8,208,8,199,114,0,9,7,9,0,39,32,92,13,40,47,243,0,139,7,138,0, +235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,34,-87,27,-93,17,-97,2,-99,2,-107,123,-107,123,-98,104,-97,92,-94,84,-88,80,-77,79,-61,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,158,219,188,202,210,179,225,151,230,135,228,120,224,106,216,93,205,79,190,16383,16383,79,167,82,176,91,185,103,193,116,198,131,200, +64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18, +79,229,76,230,62,224,20,209,4,204,4,196,7,197,17,197,26,196,31,194,35,189,37,180,37,-78,34,-87,27,-93,17,-97,2,-99,2,-107,123,-107,123,-98,104,-97,92,-94,84,-88,80,-77,79,-61,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,158,219,188,202,210,179,225,151,230,135,228,120,224,106,216,93,205,79,190,16383,16383,79,167,82,176,91,185,103,193,116,198,131,200,151,195,168,183,181,163,189,136,192,103,189,73,181,47,168,28,152,15,132,11,117,13,103,18,91,26,82,35,79,44,244,-107,244,-99,231,-97,222,-93,216,-88,213,-80,213,228,207,228,180,213,167,220,155,224,144,228,122,230,87,224,57,206,33,179,18,144,12,103,16,67,27,38,44,15,66,0,92,-4,109,-2,126,1,142,8,157,19,171,32,171,-61,169,-75,165,-86,157,-93,144,-97,126,-99,126,-107,16383,16383,171,64,170,57,170,52,168,47,167,44,165,41,149,31,140,28,130,26,112,26,96,30,89,34,83,39,74,50,66,64,60,81,56,100,55,121,58,153,67,179,81,199,100,211,124,215,141,214,154,208,163,198,169,184,171,166,80,229,78,230,62,224,48,219, +34,-87,27,-93,123,-107,123,-107,27,-93,17,-97,123,-107,17,-97,2,-99,9,197,12,197,20,209,20,209,12,197,14,197,20,209,14,197,17,197,17,197,26,196,20,209,20,209,26,196,34,214,20,209,4,204,7,197,20,209,7,197,9,197,82,35,79,44,90,8,90,8,79,44,79,17,80,-77,79,-61,48,219,80,-77,48,219,37,169,37,169,48,219,37,180,26,196,31,194,34,214,34,214,31,194,35,189,34,214,35,189,48,219,48,219,35,189,37,180,79,190,79,229,76,230,79,190,76,230,79,-61,79,190,79,-61,79,167,79,190,79,167,82,176,79,190,82,176,93,205,235,123,231,158,230,82,230,82,231,158,219,188,230,82,219,188,215,47,215,47,219,188,202,210,215,47,202,210,193,19,193,19,202,210,192,103,193,19,192,103,189,73,193,19,189,73,181,47,202,210,179,225,181,163,202,210,181,163,189,136,202,210,189,136,192,103,135,228,131,200,151,195,135,228,151,195,151,230,151,230,151,195,168,183,151,230,168,183,179,225,179,225,168,183,181,163,108,-1,118,-3,117,13,117,13,118,-3,132,11,152,15,132,11,164,1,152,15,164,1,168,28,168,28,164,1,193,19,168,28,193,19,181,47,132,11,118,-3,130,-4,132,11,130,-4,164,1,123,-107,123,-98,104,-97,123,-107,104,-97,92,-94,123,-107,92,-94,37,-78,123,-107,37,-78,34,-87,62,224,48,219,79,-61,62,224,79,-61,76,230,92,-94,84,-88,37,-64,37,-64,84,-88,80,-77,37,-64,80,-77,37,169,82,176,91,185,93,205,93,205,91,185,103,193,93,205,103,193,106,216,106,216,103,193,116,198,106,216,116,198,120,224,120,224,116,198,131,200,120,224,131,200,135,228,82,35,90,8,91,26,91,26,90,8,99,2,91,26,99,2,103,18,103,18,99,2,108,-1,103,18,108,-1,117,13,7,197,4,204,4,196,123,-107,2,-99,2,-107,37,-78,92,-94,37,-64, +244,-107,244,-99,231,-97,222,-93,216,-88,213,-80,213,228,207,228,180,213,167,220,155,224,144,228,122,230,87,224,57,206,33,179,18,144,12,103,16,67,27,38,44,15,66,0,92,-4,109,-2,126,1,142,8,157,19,171,32,171,-61,169,-75,165,-86,157,-93,144,-97,126,-99,126,-107,16383,16383,171,64,170,57,170,52,168,47,167,44,165,41,149,31,140,28,130,26,112,26,96,30,89,34,83,39,74,50,66,64,60,81,56,100,55,121,58,153,67,179,81,199,100,211,124,215,141,214,154,208,163,198,169,184,171,166,80,229,78,230,62,224,48,219,35,214,20,209,3,203,3,195,7,196,11,196,14,197,21,197,28,196,32,193,36,187,37,179,38,167,38,42,37,29,35,21,29,15,18,11,2,7,2,0,123,0,123,7,105,9,93,13,85,20,81,30,80,45,80,157,82,168,88,179,97,189,106,196,115,199,119,197,122,196,125,194,128,191,133,187,137,184,141,182,144,181,148,181,155,182,160,185,164,190,167,196,167,204,166,213,163,220,157,225,149,229,140,230,128,228,117,224,106,215,94,202,80,183,78,151,71,156,64,163, +112,26,104,28,109,-2,109,-2,104,28,96,30,109,-2,96,30,92,-4,92,-4,96,30,89,34,92,-4,89,34,83,39,83,39,74,50,92,-4,92,-4,74,50,66,64,92,-4,66,64,66,0,66,0,66,64,60,81,66,0,60,81,56,100,109,-2,126,1,112,26,112,26,126,1,121,26,130,26,121,26,126,1,130,26,126,1,142,8,133,229,124,215,141,214,133,229,141,214,144,228,144,228,141,214,154,208,144,228,154,208,155,224,155,224,154,208,163,198,155,224,163,198,167,220,167,220,163,198,169,184,167,220,169,184,180,213,180,213,169,184,171,166,180,213,171,166,171,32,171,32,171,166,171,64,67,179,81,199,87,224,87,224,81,199,100,211,87,224,100,211,122,230,122,230,100,211,124,215,122,230,124,215,133,229,57,206,33,179,44,15,57,206,44,15,55,121,57,206,55,121,58,153,57,206,58,153,67,179,57,206,67,179,87,224,55,121,44,15,56,100,12,103,16,67,18,144,18,144,16,67,27,38,18,144,27,38,33,179,33,179,27,38,44,15,165,-86,157,-93,244,-107,244,-107,157,-93,144,-97,244,-107,144,-97,126,-99,170,52,168,47,171,32,171,32,168,47,167,44,171,32,167,44,165,41,165,41,157,36,171,32,171,32,157,36,157,19,170,57,170,52,171,32,170,57,171,32,171,64,149,31,140,28,142,8,149,31,142,8,157,19,149,31,157,19,157,36,213,-69,213,228,207,228,213,-69,207,228,180,213,213,-69,180,213,213,-80,244,-107,244,-99,231,-97,244,-107,231,-97,222,-93,244,-107,222,-93,169,-75,244,-107,169,-75,165,-86,171,32,216,-88,213,-80,171,32,213,-80,180,213,171,-61,169,-75,222,-93,171,-61,222,-93,216,-88,171,-61,216,-88,171,32,244,-107,126,-99,126,-107,56,100,44,15,66,0,130,26,142,8,140,28, +80,229,78,230,62,224,48,219,35,214,20,209,3,203,3,195,7,196,11,196,14,197,21,197,28,196,32,193,36,187,37,179,38,167,38,42,37,29,35,21,29,15,18,11,2,7,2,0,123,0,123,7,105,9,93,13,85,20,81,30,80,45,80,157,82,168,88,179,97,189,106,196,115,199,119,197,122,196,125,194,128,191,133,187,137,184,141,182,144,181,148,181,155,182,160,185,164,190,167,196,167,204,166,213,163,220,157,225,149,229,140,230,128,228,117,224,106,215,94,202,80,183,78,151,71,156,64,163,60,170,57,178,56,185,58,197,63,207,71,214,82,217,94,219,110,217,123,210,134,198,143,181,151,157,158,157,156,225,150,225,145,220,140,220,137,221,134,221,131,223,122,226,115,228,109,229,94,229,72,227,53,219,38,207,29,190,26,168,28,153,35,138,47,123,63,109,85,95,113,80,129,68,134,60,138,52,139,43,137,31,132,21,123,13,112,8,98,6,79,9,63,17,51,31,41,50,34,76,26,76,26,-1,32,-1,34,0,36,2,39,3,41,4,48,4, +11,196,14,197,20,209,20,209,14,197,18,197,20,209,18,197,21,197,21,197,28,196,35,214,35,214,28,196,32,193,35,214,32,193,36,187,20,209,3,203,7,196,20,209,7,196,11,196,80,183,80,229,78,230,80,183,78,230,80,45,80,45,78,230,62,224,80,45,62,224,81,30,81,30,62,224,48,219,81,30,48,219,38,167,38,167,48,219,37,179,48,219,35,214,36,187,48,219,36,187,37,179,35,214,20,209,21,197,122,196,128,228,119,197,119,197,128,228,117,224,119,197,117,224,117,198,117,198,117,224,115,199,106,196,115,199,117,224,106,196,117,224,106,215,137,184,140,230,133,187,133,187,140,230,128,228,133,187,128,228,128,191,128,191,128,228,125,194,144,181,148,181,149,229,149,229,148,181,155,182,149,229,155,182,157,225,157,225,155,182,160,185,157,225,160,185,163,220,163,220,160,185,164,190,163,220,164,190,166,213,166,213,164,190,167,196,166,213,167,196,167,204,141,182,144,181,149,229,141,182,149,229,140,230,141,182,140,230,137,184,82,168,88,179,94,202,94,202,88,179,97,189,94,202,97,189,106,215,106,215,97,189,106,196,80,45,80,157,80,183,80,183,80,157,82,168,80,183,82,168,94,202,123,0,123,7,105,9,123,0,105,9,93,13,123,0,93,13,37,29,123,0,37,29,35,21,123,0,35,21,29,15,123,0,29,15,18,11,123,0,18,11,2,7,123,0,2,7,2,0,93,13,85,20,38,42,38,42,85,20,81,30,38,42,81,30,38,167,7,196,3,203,3,195,37,29,93,13,38,42,128,228,122,196,125,194, +78,151,71,156,64,163,60,170,57,178,56,185,58,197,63,207,71,214,82,217,94,219,110,217,123,210,134,198,143,181,151,157,158,157,156,225,150,225,145,220,140,220,137,221,134,221,131,223,122,226,115,228,109,229,94,229,72,227,53,219,38,207,29,190,26,168,28,153,35,138,47,123,63,109,85,95,113,80,129,68,134,60,138,52,139,43,137,31,132,21,123,13,112,8,98,6,79,9,63,17,51,31,41,50,34,76,26,76,26,-1,32,-1,34,0,36,2,39,3,41,4,48,4,52,3,56,3,61,1,68,0,75,-2,82,-3,90,-4,104,-4,126,-1,145,7,160,21,170,38,174,57,173,73,168,86,159,97,147,108,130,119,133,39,127,32,121,27,115,24,109,22,103,21,93,23,86,28,81,36,78,49,77,66,77,209,127,209,127,225,77,225,77,286,76,287,76,289,75,289,74,290,72,287,69,284,65,278,64,276,53,260,42,247,32,236,23,228,15,222,12,220,8,216,7,214,7,210,8,210,8,209,35,209,35,59,37,36,42,18,51,5,64,-1,79,-4,93,-3,106,1,118,8,129,19,140,33,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216, +36,2,39,3,41,50,41,50,39,3,41,4,41,50,41,4,45,4,45,4,48,4,51,31,51,31,48,4,52,3,51,31,52,3,63,17,63,17,52,3,56,3,63,17,56,3,61,1,36,2,41,50,34,0,34,0,41,50,34,76,34,0,34,76,32,-1,32,-1,34,76,26,76,32,-1,26,76,26,-1,72,227,53,219,58,197,58,197,53,219,56,185,63,109,56,185,53,219,63,109,53,219,47,123,47,123,53,219,38,207,47,123,38,207,35,138,35,138,38,207,29,190,35,138,29,190,28,153,28,153,29,190,26,168,102,229,94,229,110,217,110,217,94,229,94,219,82,217,94,219,94,229,82,217,94,229,72,227,137,221,134,221,134,198,134,198,134,221,131,223,134,198,131,223,128,224,128,224,122,226,123,210,123,210,122,226,115,228,123,210,115,228,110,217,110,217,115,228,109,229,110,217,109,229,102,229,148,223,146,221,151,157,151,157,146,221,145,220,151,157,145,220,143,181,143,181,145,220,143,220,143,181,143,220,142,220,142,220,140,220,143,181,143,181,140,220,137,221,143,181,137,221,134,198,151,157,158,157,156,225,151,157,156,225,150,225,151,157,150,225,148,223,128,224,123,210,134,198,174,57,173,73,170,38,170,38,173,73,168,86,170,38,168,86,160,21,160,21,168,86,159,97,160,21,159,97,147,108,123,13,126,-1,132,21,132,21,126,-1,145,7,132,21,145,7,137,31,137,31,145,7,139,43,147,108,139,43,145,7,147,108,145,7,160,21,121,74,129,68,130,119,130,119,129,68,134,60,130,119,134,60,147,108,147,108,134,60,138,52,147,108,138,52,139,43,130,119,78,151,85,95,130,119,85,95,113,80,130,119,113,80,121,74,78,151,71,156,85,95,85,95,71,156,64,163,85,95,64,163,63,109,63,109,64,163,60,170,63,109,60,170,57,178,98,6,104,-4,112,8,112,8,104,-4,126,-1,112,8,126,-1,123,13,72,227,58,197,63,207,72,227,63,207,71,214,72,227,71,214,82,217,98,6,79,9,82,-3,98,6,82,-3,90,-4,98,6,90,-4,97,-4,98,6,97,-4,104,-4,79,9,63,17,68,0,79,9,68,0,75,-2,79,9,75,-2,82,-3,68,0,63,17,61,1,51,31,41,50,45,4,56,185,63,109,57,178, +133,39,127,32,121,27,115,24,109,22,103,21,93,23,86,28,81,36,78,49,77,66,77,209,127,209,127,225,77,225,77,286,76,287,76,289,75,289,74,290,72,287,69,284,65,278,64,276,53,260,42,247,32,236,23,228,15,222,12,220,8,216,7,214,7,210,8,210,8,209,35,209,35,59,37,36,42,18,51,5,64,-1,79,-4,93,-3,106,1,118,8,129,19,140,33,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38, +42,247,32,236,35,209,35,209,32,236,23,228,35,209,23,228,15,222,53,260,42,247,42,18,53,260,42,18,51,5,53,260,51,5,64,-1,53,260,64,-1,64,276,37,36,42,18,42,247,37,36,42,247,35,209,37,36,35,209,35,59,7,210,8,210,8,216,8,216,8,210,8,209,8,216,8,209,10,218,10,218,8,209,35,209,10,218,35,209,12,220,12,220,35,209,15,222,7,214,7,213,7,212,7,214,7,212,7,211,7,214,7,211,7,210,7,214,7,210,8,216,69,284,79,-4,77,66,77,225,77,209,127,209,77,225,127,209,127,225,77,66,77,283,77,286,77,66,77,286,76,287,77,66,76,287,76,289,77,66,76,289,75,289,77,66,75,289,74,290,77,66,74,290,72,287,77,66,72,287,69,284,86,28,93,-3,93,23,93,23,93,-3,103,21,109,22,103,21,106,1,109,22,106,1,118,8,81,36,78,49,79,-4,81,36,79,-4,93,-3,81,36,93,-3,86,28,79,-4,69,284,67,281,79,-4,67,281,65,278,79,-4,65,278,64,276,79,-4,64,276,64,-1,129,19,140,33,133,39,129,19,133,39,127,32,129,19,127,32,121,27,129,19,121,27,118,8,115,24,109,22,118,8,115,24,118,8,121,27,103,21,93,-3,106,1,77,66,79,-4,78,49, +240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,238,225,169,225,169,218,178,216,184,214,189,211,192,207,193,201,192,198,192,195,191,192,191,189,190,186,140,57,89,185,87,190,86,194,85,197,84,201,84,204,85,209,88,212,92,215,99,216,108,218,108,225,9,225,9,218,19,216,27,212,35,202,44,186,55,160,115,17,116,14,118,10,118,8,119,6,121,1,123,-1,125,-4,126,-6,128,-6,130,-5,132,-3,135,1,138,8,142,18,206,179,213,195,219,206,224,213,231,216,238,218, +78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,184,168,38,209,225,209,225,168,38,169,38,209,225,169,38,171,-3,171,-3,169,38,169,-2,168,38,166,184,166,69,168,38,166,69,166,59,168,38,166,59,164,53,155,40,153,21,168,38,225,26,217,29,225,14,225,14,217,29,212,34,225,14,212,34,212,10,212,10,212,34,209,42,212,10,209,42,199,6,199,6,209,42,209,54,199,6,209,54,209,225,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,38,38,36,185,36,59,145,215,129,225,129,217,17,216,4,225,4,218, +238,225,169,225,169,218,178,216,184,214,189,211,192,207,193,201,192,198,192,195,191,192,191,189,190,186,140,57,89,185,87,190,86,194,85,197,84,201,84,204,85,209,88,212,92,215,99,216,108,218,108,225,9,225,9,218,19,216,27,212,35,202,44,186,55,160,115,17,116,14,118,10,118,8,119,6,121,1,123,-1,125,-4,126,-6,128,-6,130,-5,132,-3,135,1,138,8,142,18,206,179,213,195,219,206,224,213,231,216,238,218,347,225,286,225,286,218,294,215,301,213,305,210,307,207,307,197,306,191,302,177,299,169,254,58,209,178,206,185,204,195,204,205,207,210,212,213,221,215,233,218,233,225,131,225,131,218,141,216,148,212,155,206,160,196,166,183,175,155,130,55,80,186,79,189,79,192,78,195,78,206,81,211,85,214,91,216,100,218,100,225,11,225,11,218,17,216,22,214,26,208,31,199,37,186,104,15,108,7,111,0,113,-3,116,-5,118,-6,121,-3, +87,190,86,194,115,17,115,17,86,194,85,197,115,17,85,197,55,160,55,160,85,197,84,201,55,160,84,201,84,204,84,204,85,209,55,160,108,225,9,225,19,216,108,225,19,216,27,212,108,225,27,212,35,202,108,225,35,202,44,186,108,225,44,186,88,212,108,225,88,212,92,215,108,225,92,215,99,216,108,225,99,216,108,218,85,209,88,212,44,186,85,209,44,186,55,160,140,57,89,185,115,17,140,57,115,17,116,14,140,57,116,14,117,12,140,57,117,12,118,10,140,57,118,10,118,8,140,57,118,8,119,6,140,57,119,6,121,1,140,57,121,1,123,-1,140,57,123,-1,125,-4,140,57,125,-4,126,-6,140,57,126,-6,128,-6,140,57,128,-6,130,-5,140,57,130,-5,132,-3,140,57,132,-3,135,1,140,57,135,1,138,8,140,57,138,8,142,18,140,57,142,18,190,186,206,179,190,186,142,18,238,225,169,225,178,216,238,225,178,216,184,214,238,225,184,214,189,211,238,225,189,211,192,207,238,225,192,207,193,201,238,225,193,201,224,213,238,225,224,213,231,216,238,225,231,216,238,218,206,179,213,195,193,201,206,179,193,201,192,198,206,179,192,198,192,195,206,179,192,195,191,192,206,179,191,192,191,189,206,179,191,189,190,186,219,206,224,213,193,201,219,206,193,201,213,195,178,216,169,225,169,218,87,190,115,17,89,185,19,216,9,225,9,218, +347,225,286,225,286,218,294,215,301,213,305,210,307,207,307,197,306,191,302,177,299,169,254,58,209,178,206,185,204,195,204,205,207,210,212,213,221,215,233,218,233,225,131,225,131,218,141,216,148,212,155,206,160,196,166,183,175,155,130,55,80,186,79,189,79,192,78,195,78,206,81,211,85,214,91,216,100,218,100,225,11,225,11,218,17,216,22,214,26,208,31,199,37,186,104,15,108,7,111,0,113,-3,116,-5,118,-6,121,-3,123,0,126,5,130,12,186,132,232,15,235,5,238,0,241,-6,246,-6,250,0,253,7,257,17,326,190,331,200,334,207,338,212,342,215,347,218,239,0,239,7,230,8,222,12,215,18,207,26,199,37,134,136,176,195,182,203,190,209,198,214,207,216,217,218,217,225,137,225,137,218,145,217,151,215,155,213,157,210,157,202,154,197,150,191,145,184,136,169,133,165,130,160,124,152,123,154,121,156,119,160,117,162,109,174,103,185,98,194,95,201,94,206,95,210,97,213,101,216,107,217,116,218,116,225,12,225,12,218,17,218,25,217,32,214,39,208,47,200,55,187,55,188,102,116,45,33,37,22,31,15,24,11,17,9,8,7,8,0,81,0,81,7,73,8,68,9,64,11,62,13,61,17,61,19,62,22,64,26,67,31, +22,214,26,208,100,225,100,225,26,208,31,199,100,225,31,199,37,186,37,186,104,15,78,195,78,195,104,15,79,192,37,186,78,198,78,201,78,201,78,206,37,186,37,186,78,206,81,211,37,186,81,211,85,214,100,225,37,186,85,214,100,225,85,214,91,216,100,225,91,216,100,218,17,216,22,214,100,225,17,216,100,225,11,225,17,216,11,225,11,218,186,132,204,200,204,205,186,132,204,205,175,155,175,155,204,205,166,183,160,196,166,183,207,210,160,196,207,210,212,213,233,225,131,225,141,216,233,225,141,216,148,212,233,225,148,212,155,206,233,225,155,206,160,196,233,225,160,196,212,213,233,225,212,213,221,215,233,225,221,215,233,218,207,210,166,183,204,205,254,58,212,170,232,15,254,58,232,15,235,5,254,58,235,5,238,0,254,58,238,0,240,-4,254,58,240,-4,241,-6,254,58,241,-6,243,-6,254,58,243,-6,246,-6,254,58,246,-6,248,-3,254,58,248,-3,250,0,254,58,250,0,253,7,254,58,253,7,257,17,254,58,257,17,299,169,232,15,212,170,209,178,232,15,209,178,206,185,232,15,206,185,205,190,232,15,205,190,204,195,232,15,204,195,186,132,326,190,299,169,257,17,347,225,286,225,294,215,347,225,294,215,301,213,347,225,301,213,305,210,347,225,305,210,307,207,347,225,307,207,307,203,347,225,307,203,334,207,347,225,334,207,338,212,347,225,338,212,342,215,347,225,342,215,347,218,326,190,331,200,307,203,326,190,307,203,307,197,326,190,307,197,306,191,326,190,306,191,304,184,326,190,304,184,302,177,326,190,302,177,299,169,123,0,126,5,130,55,130,55,126,5,130,12,130,55,130,12,175,155,175,155,130,12,186,132,130,55,80,186,104,15,130,55,104,15,108,7,130,55,108,7,111,0,130,55,111,0,113,-3,130,55,113,-3,116,-5,130,55,116,-5,118,-6,130,55,118,-6,119,-5,130,55,119,-5,121,-3,130,55,121,-3,123,0,79,189,79,192,104,15,79,189,104,15,80,186,37,186,78,195,78,198,294,215,286,225,286,218,334,207,307,203,331,200,186,132,204,195,204,200,141,216,131,225,131,218, +239,0,239,7,230,8,222,12,215,18,207,26,199,37,134,136,176,195,182,203,190,209,198,214,207,216,217,218,217,225,137,225,137,218,145,217,151,215,155,213,157,210,157,202,154,197,150,191,145,184,136,169,133,165,130,160,124,152,123,154,121,156,119,160,117,162,109,174,103,185,98,194,95,201,94,206,95,210,97,213,101,216,107,217,116,218,116,225,12,225,12,218,17,218,25,217,32,214,39,208,47,200,55,187,55,188,102,116,45,33,37,22,31,15,24,11,17,9,8,7,8,0,81,0,81,7,73,8,68,9,64,11,62,13,61,17,61,19,62,22,64,26,67,31,71,37,110,99,156,28,157,27,159,23,159,15,157,12,153,9,147,8,139,7,139,0,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20, +31,15,24,11,81,0,81,0,24,11,17,9,81,0,17,9,8,7,32,214,39,208,116,225,116,225,39,208,47,200,116,225,47,200,55,188,55,187,55,188,102,116,55,187,102,116,94,206,94,206,95,210,55,187,55,187,95,210,97,213,55,187,97,213,116,225,116,225,97,213,101,216,116,225,101,216,107,217,31,15,81,0,37,22,37,22,81,0,64,11,37,22,64,11,45,33,45,33,64,11,62,13,45,33,62,13,61,17,61,17,61,19,45,33,45,33,61,19,62,22,45,33,62,22,102,116,102,116,62,22,64,26,102,116,64,26,67,31,102,116,67,31,71,37,71,37,110,99,102,116,102,116,110,99,103,185,102,116,103,185,98,194,107,217,116,218,116,225,116,225,12,225,17,218,116,225,17,218,25,217,116,225,25,217,32,214,95,201,94,206,102,116,95,201,102,116,98,194,121,156,120,158,156,28,156,28,120,158,119,160,156,28,119,160,117,162,117,162,109,174,110,99,110,99,109,174,103,185,222,12,215,18,159,20,159,20,215,18,207,26,159,20,207,26,199,37,199,37,134,136,156,28,156,28,134,136,127,156,156,28,127,156,124,152,124,152,123,154,156,28,156,28,123,154,121,156,217,225,137,225,145,217,217,225,145,217,151,215,217,225,151,215,155,213,217,225,155,213,157,210,217,225,157,210,157,206,217,225,157,206,190,209,217,225,190,209,198,214,217,225,198,214,207,216,217,225,207,216,217,218,176,195,182,203,157,206,176,195,157,206,157,202,176,195,157,202,154,197,176,195,154,197,150,191,176,195,150,191,145,184,176,195,145,184,139,174,176,195,139,174,136,169,176,195,136,169,134,136,134,136,136,169,133,165,134,136,133,165,130,160,134,136,130,160,127,156,157,12,153,9,239,0,239,0,153,9,147,8,239,0,147,8,139,7,158,25,159,23,199,37,199,37,159,23,159,21,199,37,159,21,159,20,159,20,159,15,239,0,239,0,159,15,157,12,199,37,156,28,157,27,199,37,157,27,158,25,117,162,110,99,156,28,239,0,239,7,230,8,239,0,230,8,222,12,239,0,222,12,159,20,81,0,81,7,73,8,81,0,73,8,68,9,81,0,68,9,64,11,81,0,8,7,8,0,239,0,139,7,139,0,145,217,137,225,137,218,190,209,157,206,182,203,17,218,12,225,12,218,116,225,55,188,55,187, +238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,163,17,149,16,133,15,67,15,201,218,201,225,28,225,26,166,36,166,39,184,44,197,51,205,63,209,79,210,147,210,13,7,13,0,201,0,175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,114,328,107,321,100,312,96,300,94,287,93,271,93,181,91,163,87,149,80,139,67,131,50,125,67,118,80,110,87,100,91,86,93,68,93,-20,94,-35,96,-49, +90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218, +209,68,200,70,197,57,195,47,193,40,190,34,186,28,181,24,173,20,163,17,149,16,133,15,67,15,201,218,201,225,28,225,26,166,36,166,39,184,44,197,51,205,63,209,79,210,147,210,13,7,13,0,201,0,175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336, +67,15,201,218,147,210,147,210,201,218,201,225,147,210,201,225,79,210,63,209,79,210,201,225,63,209,201,225,28,225,28,225,26,166,36,166,28,225,36,166,39,184,28,225,39,184,44,197,28,225,44,197,51,205,28,225,51,205,63,209,147,210,13,7,67,15,67,15,13,7,201,0,67,15,201,0,133,15,133,15,201,0,149,16,195,47,193,40,201,0,201,0,193,40,190,34,201,0,190,34,186,28,186,28,181,24,201,0,201,0,181,24,173,20,201,0,173,20,163,17,201,0,209,68,200,70,201,0,200,70,197,57,201,0,197,57,195,47,201,0,13,7,13,0,149,16,201,0,163,17, +175,-84,157,-78,144,-69,136,-58,131,-42,129,-22,129,60,128,82,124,98,115,110,102,118,83,124,102,131,115,140,124,151,128,167,129,189,129,273,131,293,136,308,144,320,157,328,175,334,175,340,157,339,144,338,132,336,114,328,107,321,100,312,96,300,94,287,93,271,93,181,91,163,87,149,80,139,67,131,50,125,67,118,80,110,87,100,91,86,93,68,93,-20,94,-35,96,-49,101,-61,107,-70,114,-77,123,-82,132,-85,143,-87,157,-89,175,-89,66,-6,66,338,33,338,33,-6,147,270,146,286,144,300,139,312,133,321,126,328,108,336,97,338,83,339,65,340,65,334,83,328,96,320,104,308,109,293,110,273,110,189,112,167,116,151,125,139,138,131,157,125,138,118,125,110,116,98,112,82,110,60,110,-22,109,-42,104,-58,96,-69,83,-78,65,-84,65,-89,83,-89,96,-87,108,-85,117,-82,126,-77,133,-71,139,-61,144,-50,146,-36,147,-20,147,68,149,86,153,100,160,111,172,118,190,125,172,131, +107,-70,114,-77,115,110,115,110,114,-77,123,-82,115,110,123,-82,124,98,124,98,123,-82,132,-85,124,98,132,-85,129,-22,129,-22,129,60,128,82,129,-22,128,82,124,98,157,-89,175,-89,175,-84,157,-89,175,-84,157,-78,157,-89,157,-78,144,-69,157,-89,144,-69,143,-87,136,-58,131,-42,132,-85,136,-58,132,-85,143,-87,136,-58,143,-87,144,-69,102,118,83,124,87,100,102,118,87,100,91,86,102,118,91,86,93,68,102,118,93,68,94,-35,102,118,94,-35,96,-49,102,118,96,-49,101,-61,102,118,101,-61,107,-70,102,118,107,-70,115,110,93,68,93,-20,94,-35,80,110,87,100,83,124,80,110,83,124,87,149,80,110,87,149,80,139,80,110,80,139,67,118,157,339,144,338,144,320,157,339,144,320,157,328,157,339,157,328,175,334,157,339,175,334,175,340,129,273,131,293,132,336,132,336,131,293,136,308,132,336,136,308,144,338,144,338,136,308,144,320,114,328,115,140,123,332,123,332,115,140,124,151,123,332,124,151,129,273,129,273,124,151,128,167,129,273,128,167,129,189,107,321,100,312,102,131,107,321,102,131,115,140,107,321,115,140,114,328,102,131,100,312,96,300,102,131,96,300,94,287,102,131,94,287,93,271,102,131,93,271,93,181,102,131,93,181,91,163,102,131,91,163,87,149,102,131,87,149,83,124,67,131,50,125,67,118,67,131,67,118,80,139,123,332,129,273,132,336,129,-22,132,-85,131,-42, +66,-6,66,338,33,338,33,-6,147,270,146,286,144,300,139,312, +66,-6,66,338,33,338,66,-6,33,338,33,-6, +147,270,146,286,144,300,139,312,133,321,126,328,108,336,97,338,83,339,65,340,65,334,83,328,96,320,104,308,109,293,110,273,110,189,112,167,116,151,125,139,138,131,157,125,138,118,125,110,116,98,112,82,110,60,110,-22,109,-42,104,-58,96,-69,83,-78,65,-84,65,-89,83,-89,96,-87,108,-85,117,-82,126,-77,133,-71,139,-61,144,-50,146,-36,147,-20,147,68,149,86,153,100,160,111,172,118,190,125,172,131,160,139,153,149,149,163,147,181,233,162,227,151,219,141,211,133,201,128,189,126,179,127,157,135,148,140,141,143,124,150,111,155,100,158,92,160,83,160,69,159,56,154,43,146,31,134,20,117,38,92,44,104,51,114,60,122,70,126,80,128,92,127,103,125,114,122,122,119,128,116,143,107,155,101,166,97,176,95,189,94,202,95,214,100,226,108,238,120,251,137,101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186, +110,273,112,167,110,273,110,273,112,167,117,332,110,273,117,332,109,293,109,293,117,332,108,336,109,293,108,336,104,308,104,308,108,336,97,338,104,308,97,338,96,320,96,320,97,338,83,339,96,320,83,339,83,328,83,328,83,339,65,340,83,328,65,340,65,334,147,181,147,270,146,286,147,181,146,286,144,300,147,181,144,300,139,312,147,181,139,312,138,131,147,181,138,131,149,163,172,118,190,125,172,131,172,118,172,131,160,111,160,111,172,131,160,139,160,111,160,139,157,125,157,125,160,139,153,149,157,125,153,149,149,163,112,167,116,151,117,332,117,332,116,151,125,139,117,332,125,139,126,328,126,328,125,139,138,131,126,328,138,131,133,321,133,321,138,131,139,312,157,125,138,118,149,86,157,125,149,86,153,100,157,125,153,100,160,111,147,68,149,86,138,118,147,68,138,118,139,-61,147,68,139,-61,144,-50,147,68,144,-50,146,-36,147,68,146,-36,147,-20,116,98,117,-82,125,110,125,110,117,-82,126,-77,125,110,126,-77,138,118,138,118,126,-77,133,-71,138,118,133,-71,139,-61,117,-82,116,98,112,82,117,-82,112,82,110,60,117,-82,110,60,110,-22,117,-82,110,-22,109,-42,117,-82,109,-42,108,-85,104,-58,96,-69,96,-87,104,-58,96,-87,108,-85,104,-58,108,-85,109,-42,83,-78,65,-84,83,-89,83,-78,83,-89,96,-87,83,-78,96,-87,96,-69,83,-89,65,-84,65,-89,149,163,138,131,157,125,112,167,110,273,110,189, +233,162,227,151,219,141,211,133,201,128,189,126,179,127,157,135,148,140,141,143,124,150,111,155,100,158,92,160,83,160,69,159,56,154,43,146,31,134,20,117,38,92,44,104,51,114,60,122,70,126,80,128,92,127,103,125,114,122,122,119,128,116,143,107,155,101,166,97,176,95,189,94,202,95,214,100,226,108,238,120,251,137,101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,66,182,74,181,83,182,90,186,96,192,100,200,101,209,16383,16383,78,141,71,141,49,-49,49,-53,48,-57,48,-69,49,-82,52,-93,58,-101,65,-106,75,-108,84,-106,91,-100,96,-92,100,-81,101,-68,101,-57,100,-53,100,-49, +92,160,83,160,92,127,92,127,83,160,80,128,70,126,80,128,83,160,70,126,83,160,69,159,141,143,128,116,143,107,141,143,143,107,148,140,148,140,143,107,155,101,148,140,155,101,157,135,157,135,155,101,166,97,157,135,166,97,168,131,168,131,166,97,176,95,168,131,176,95,179,127,179,127,176,95,189,94,179,127,189,94,189,126,189,126,189,94,202,95,189,126,202,95,201,128,92,160,92,127,100,158,100,158,92,127,103,125,100,158,103,125,111,155,111,155,103,125,114,122,111,155,114,122,124,150,124,150,114,122,122,119,124,150,122,119,128,116,201,128,202,95,211,133,211,133,202,95,214,100,211,133,214,100,219,141,219,141,214,100,226,108,219,141,226,108,227,151,227,151,226,108,238,120,227,151,238,120,233,162,233,162,238,120,251,137,44,104,51,114,56,154,56,154,51,114,60,122,56,154,60,122,69,159,69,159,60,122,70,126,43,146,31,134,38,92,43,146,38,92,44,104,43,146,44,104,56,154,38,92,31,134,20,117,128,116,141,143,124,150, +101,209,100,217,96,224,90,229,83,233,75,234,66,233,59,229,53,224,49,217,48,209,49,200,53,192,58,186,66,182,74,181,83,182,90,186,96,192,100,200,101,209,16383,16383,78,141,71,141,49,-49,49,-53,48,-57,48,-69,49,-82,52,-93,58,-101,65,-106,75,-108,84,-106,91,-100,96,-92,100,-81,101,-68,101,-57,100,-53,100,-49,218,82,203,62,189,48,175,39,160,33,144,32,138,32,133,33,127,34,121,36,114,38,165,184,170,173,176,166,181,161,187,158,194,157,201,158,207,161,211,166,214,173,215,180,214,190,209,200,202,208,191,216,178,222,201,290,184,290,162,228,155,229,150,229,145,230,137,230,101,224,71,207,47,181,32,148,26,109,27,94,30,79, +48,209,49,200,49,217,49,217,49,200,53,192,49,217,53,192,53,224,53,224,53,192,58,186,53,224,58,186,59,229,59,229,58,186,66,182,59,229,66,182,66,233,66,233,66,182,74,181,66,233,74,181,75,234,75,234,74,181,83,182,75,234,83,182,83,233,83,233,83,182,90,186,83,233,90,186,90,229,90,229,90,186,96,192,90,229,96,192,96,224,96,224,96,192,100,200,96,224,100,200,100,217,100,217,100,200,101,209,100,-49,78,141,84,-106,100,-49,84,-106,91,-100,100,-49,91,-100,96,-92,100,-49,96,-92,100,-81,100,-49,100,-81,101,-68,100,-49,101,-68,100,-53,58,-101,65,-106,71,141,71,141,65,-106,75,-108,71,141,75,-108,78,141,78,141,75,-108,84,-106,71,141,49,-49,49,-82,71,141,49,-82,52,-93,71,141,52,-93,58,-101,49,-82,49,-49,49,-53,49,-82,49,-53,48,-57,49,-82,48,-57,48,-61,49,-82,48,-61,48,-65,49,-82,48,-65,48,-69,101,-68,101,-64,101,-61,101,-68,101,-61,101,-57,101,-68,101,-57,100,-53, +218,82,203,62,189,48,175,39,160,33,144,32,138,32,133,33,127,34,121,36,114,38,165,184,170,173,176,166,181,161,187,158,194,157,201,158,207,161,211,166,214,173,215,180,214,190,209,200,202,208,191,216,178,222,201,290,184,290,162,228,155,229,150,229,145,230,137,230,101,224,71,207,47,181,32,148,26,109,27,94,30,79,34,64,40,50,47,38,53,30,59,24,66,18,74,12,84,6,59,-68,76,-68,100,0,107,-1,119,-3,140,-3,151,0,161,3,171,8,180,15,190,24,198,33,206,45,214,59,224,78,16383,16383,99,49,86,63,76,77,70,92,66,110,65,130,68,158,77,182,91,200,110,211,133,215,138,215,142,214,147,213,151,212,156,210,172,164,172,186,109,186,107,205,106,220,105,233,104,245,104,256,106,280,112,299,122,313,135,322,151,325,161,324,169,321,175,315,178,308,180,299,180,285,182,275,186,269,191,266,199,265,207,266,214,270,219,276,223,283,224,291,221,306,212,319,198,329,180,336,159,338,126,333,99,317,79,293,66,261,61,221,62,214,62,208,64,194,65,186,12,186,12,164,65,164,68,147,71,127,73,109,75,93,76,81,76,69,75,67,75,63,69,64,64,64,60,65,51,65,36,63,24,58,14,50,8,40,6,27,8,16,12,8,19,1,28,-2,40,-3,50,-2,59,0,68,6,78,14,89,27,107,15,123,6,136,1,149,-1,161,-2,175,-1,188,1,201,7,212,15, +156,210,99,49,100,0,100,0,99,49,86,63,100,0,86,63,84,6,84,6,86,63,76,77,84,6,76,77,74,12,74,12,76,77,70,92,74,12,70,92,66,110,53,30,59,24,65,130,65,130,66,18,66,110,66,110,66,18,74,12,113,-2,119,-3,114,38,114,38,119,-3,121,36,121,36,119,-3,124,-3,121,36,124,-3,127,34,127,34,124,-3,129,-3,127,34,129,-3,133,33,133,33,129,-3,140,-3,133,33,140,-3,138,32,138,32,140,-3,144,32,160,33,144,32,151,0,160,33,151,0,161,3,114,38,165,184,156,210,156,210,162,228,155,229,156,210,155,229,151,212,151,212,155,229,150,229,151,212,150,229,147,213,147,213,150,229,145,230,147,213,145,230,142,214,142,214,145,230,141,230,142,214,141,230,138,215,138,215,141,230,137,230,138,215,137,230,133,215,184,290,162,228,165,184,184,290,165,184,170,173,184,290,170,173,178,222,184,290,178,222,201,290,170,173,176,166,178,222,178,222,176,166,181,161,178,222,181,161,191,216,191,216,181,161,187,158,191,216,187,158,194,157,114,38,156,210,100,0,114,38,100,0,107,-1,114,38,107,-1,113,-2,76,-68,100,0,84,6,76,-68,84,6,59,-68,194,157,201,158,202,208,202,208,201,158,207,161,202,208,207,161,209,200,209,200,207,161,211,166,209,200,211,166,214,190,214,190,211,166,214,173,214,190,214,173,215,180,77,182,91,200,101,224,101,224,91,200,110,211,101,224,110,211,137,230,137,230,110,211,133,215,71,207,47,181,47,38,71,207,47,38,53,30,71,207,53,30,65,130,71,207,65,130,68,158,71,207,68,158,77,182,71,207,77,182,101,224,27,94,30,79,32,148,32,148,30,79,34,64,32,148,34,64,47,181,47,181,34,64,40,50,47,181,40,50,47,38,190,24,198,33,203,62,203,62,198,33,206,45,203,62,206,45,218,82,218,82,206,45,214,59,218,82,214,59,224,78,161,3,171,8,175,39,175,39,171,8,180,15,175,39,180,15,189,48,189,48,180,15,190,24,189,48,190,24,203,62,144,32,140,-3,151,0,160,33,161,3,175,39,27,94,32,148,26,109,191,216,194,157,202,208,156,210,165,184,162,228,66,18,65,130,59,24, +172,164,172,186,109,186,107,205,106,220,105,233,104,245,104,256,106,280,112,299,122,313,135,322,151,325,161,324,169,321,175,315,178,308,180,299,180,285,182,275,186,269,191,266,199,265,207,266,214,270,219,276,223,283,224,291,221,306,212,319,198,329,180,336,159,338,126,333,99,317,79,293,66,261,61,221,62,214,62,208,64,194,65,186,12,186,12,164,65,164,68,147,71,127,73,109,75,93,76,81,76,69,75,67,75,63,69,64,64,64,60,65,51,65,36,63,24,58,14,50,8,40,6,27,8,16,12,8,19,1,28,-2,40,-3,50,-2,59,0,68,6,78,14,89,27,107,15,123,6,136,1,149,-1,161,-2,175,-1,188,1,201,7,212,15,223,24,229,32,235,42,240,52,244,61,245,68,245,69,244,70,240,70,238,69,236,67,233,65,230,62,230,63,221,54,210,47,199,42,187,39,174,38,160,38,147,40,133,43,117,48,99,55,109,105,111,117,112,125,112,164,16383,16383,71,38,71,35,68,29,66,26,64,22,59,18,55,14,50,12,46,10,40,10,33,11,27,13,23,17,20,22,19,28,20,35,23,40,28,44,35,46,44,47,52,46,59,45,65,43,69,41,71,38,261,20,213,68,221,81,226,93,230,105,232,118,233,132,232,146,230,158,226,170,221,182,213,194,261,243,237,267,188,219,176,226,165,232,153,235,140,238,112,238,99,236,87,232,75,226,62,219,14,267,-10,243,38,194,30,182,24,170,20,158,18,145,17,131,18,117,20,105,24,92,30,80,38,68,-10,20,14,-4,62,44,74,36,87,31,99,27,112,24,126,23,139,24,152,27,164,31,176,37,188,44,237,-4,16383,16383,199,132,195,108,185,86,169,70,149,59,126,55,102,59,82,70,66,86,55,107,51,132,55,155,66,176,81,192,101,203,124,206,148,203,168,192,184,176,195,156,199,132,256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156, +59,18,55,14,59,0,59,0,55,14,50,12,59,0,50,12,50,-2,50,-2,50,12,46,10,50,-2,46,10,40,-3,40,-3,46,10,40,10,69,64,64,64,65,43,65,43,64,64,60,65,65,43,60,65,59,45,59,45,60,65,56,65,59,45,56,65,52,46,52,46,56,65,51,65,52,46,51,65,44,47,20,35,23,40,24,58,24,58,23,40,28,44,24,58,28,44,36,63,36,63,28,44,35,46,36,63,35,46,44,47,20,22,19,28,19,1,19,1,19,28,14,50,14,50,19,28,24,58,24,58,19,28,20,35,71,35,70,33,78,14,78,14,70,33,68,29,78,14,68,29,68,6,68,6,68,29,66,26,68,6,66,26,64,22,64,22,59,18,68,6,68,6,59,18,59,0,75,67,75,65,78,14,78,14,75,65,75,62,78,14,75,62,71,38,71,38,75,62,75,63,71,38,75,63,69,41,69,41,75,63,69,64,69,41,69,64,65,43,78,14,71,38,71,35,89,27,107,15,99,55,99,55,107,15,117,48,117,48,107,15,123,6,117,48,123,6,133,43,133,43,123,6,136,1,133,43,136,1,147,40,147,40,136,1,149,-1,147,40,149,-1,160,38,160,38,149,-1,161,-2,160,38,161,-2,174,38,174,38,161,-2,175,-1,174,38,175,-1,187,39,99,55,105,85,104,256,104,256,106,280,99,317,99,317,106,280,112,299,99,317,112,299,126,333,126,333,112,299,122,313,126,333,122,313,135,322,180,336,159,338,161,324,161,324,159,338,151,325,135,322,151,325,159,338,135,322,159,338,126,333,221,306,212,319,214,270,221,306,214,270,219,276,221,306,219,276,223,283,221,306,223,283,224,291,186,269,191,266,198,329,198,329,191,266,199,265,198,329,199,265,212,319,212,319,199,265,207,266,212,319,207,266,214,270,178,308,180,299,180,336,180,336,180,299,180,285,180,336,180,285,198,329,198,329,180,285,182,275,198,329,182,275,186,269,180,336,161,324,169,321,180,336,169,321,175,315,180,336,175,315,178,308,76,71,78,14,76,73,76,73,78,14,79,293,79,293,78,14,89,27,79,293,89,27,99,317,99,317,89,27,99,55,99,317,99,55,104,256,109,105,111,117,109,186,109,186,111,117,112,164,109,186,112,164,172,186,172,186,112,164,172,164,109,186,107,205,109,105,109,105,107,205,106,220,109,105,106,220,105,85,105,85,106,220,105,233,105,85,105,233,104,245,112,139,112,146,112,133,112,133,112,146,112,152,112,133,112,152,112,125,112,125,112,152,112,158,112,125,112,158,112,164,229,32,230,62,223,24,223,24,230,62,221,54,223,24,221,54,212,15,212,15,221,54,210,47,212,15,210,47,201,7,201,7,210,47,199,42,201,7,199,42,188,1,188,1,199,42,187,39,188,1,187,39,175,-1,245,69,244,70,245,68,245,68,244,70,244,61,244,61,244,70,243,70,244,61,243,70,242,70,240,52,244,61,242,70,240,52,242,70,240,70,240,52,240,70,238,69,240,52,238,69,236,67,240,52,236,67,235,42,235,42,236,67,233,65,235,42,233,65,230,62,235,42,230,62,229,32,79,293,66,261,68,147,79,293,68,147,71,127,79,293,71,127,73,109,79,293,73,109,75,93,79,293,75,93,76,81,79,293,76,81,76,73,66,261,61,221,62,214,66,261,62,214,62,208,66,261,62,208,63,201,66,261,63,201,64,194,66,261,64,194,65,186,66,261,65,186,65,164,66,261,65,164,68,147,76,69,75,67,78,14,76,69,78,14,76,71,65,164,65,186,12,186,65,164,12,186,12,164,33,11,27,13,28,-2,33,11,28,-2,40,-3,33,11,40,-3,40,10,28,-2,27,13,23,17,28,-2,23,17,20,22,28,-2,20,22,19,1,6,27,8,16,8,40,8,40,8,16,12,8,8,40,12,8,14,50,14,50,12,8,19,1,221,54,230,62,230,63,112,125,112,164,111,117,104,256,105,85,104,245,44,47,51,65,36,63, +261,20,213,68,221,81,226,93,230,105,232,118,233,132,232,146,230,158,226,170,221,182,213,194,261,243,237,267,188,219,176,226,165,232,153,235,140,238,112,238,99,236,87,232,75,226,62,219,14,267,-10,243,38,194,30,182,24,170,20,158,18,145,17,131,18,117,20,105,24,92,30,80,38,68,-10,20,14,-4,62,44,74,36,87,31,99,27,112,24,126,23,139,24,152,27,164,31,176,37,188,44,237,-4,16383,16383,199,132,195,108,185,86,169,70,149,59,126,55,102,59,82,70,66,86,55,107,51,132,55,155,66,176,81,192,101,203,124,206,148,203,168,192,184,176,195,156,199,132,256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,224,156,224,176,151,176,197,268,207,286,218,300,229,310,242,317,256,321,66,200,66,338, +99,27,112,24,102,59,102,59,112,24,126,55,149,59,126,55,126,23,149,59,126,23,139,24,62,219,14,267,38,194,62,219,38,194,38,68,62,219,38,68,51,132,62,219,51,132,55,155,62,219,55,155,66,176,62,219,66,176,75,226,66,86,55,107,62,44,62,44,55,107,51,132,140,238,126,238,148,203,148,203,126,238,124,206,101,203,124,206,112,238,101,203,112,238,99,236,87,232,75,226,81,192,87,232,81,192,101,203,87,232,101,203,99,236,261,20,213,68,237,-4,237,-4,213,68,195,108,237,-4,195,108,188,44,188,44,195,108,185,86,188,44,185,86,176,37,176,37,185,86,169,70,176,37,169,70,164,31,164,31,169,70,152,27,149,59,139,24,152,27,149,59,152,27,169,70,195,156,199,132,213,194,195,156,213,194,237,267,237,267,213,194,261,243,165,232,168,192,176,226,176,226,168,192,184,176,176,226,184,176,188,219,188,219,184,176,195,156,188,219,195,156,237,267,153,235,140,238,148,203,153,235,148,203,168,192,153,235,168,192,165,232,213,194,213,68,221,182,221,182,213,68,221,81,221,182,221,81,226,170,226,170,221,81,226,93,226,170,226,93,230,158,230,158,226,93,230,105,230,158,230,105,232,146,232,146,230,105,232,118,232,146,232,118,233,132,213,68,213,194,199,132,213,68,199,132,195,108,126,55,112,24,126,23,126,238,112,238,124,206,99,27,102,59,87,31,87,31,102,59,82,70,87,31,82,70,74,36,74,36,82,70,66,86,74,36,66,86,62,44,38,68,14,-4,62,44,38,68,62,44,51,132,38,68,38,194,30,80,30,80,38,194,30,182,30,80,30,182,24,92,24,92,30,182,24,170,24,92,24,170,20,105,20,105,24,170,20,158,20,105,20,158,18,117,18,117,20,158,18,145,18,117,18,145,17,131,14,-4,38,68,-10,20,75,226,66,176,81,192,38,194,14,267,-10,243, +256,331,158,331,158,321,174,321,181,319,186,315,190,311,191,306,191,303,190,299,188,294,187,289,184,284,128,174,69,285,67,289,65,294,64,299,63,303,63,307,64,313,67,317,73,319,83,321,95,321,95,331,-25,331,-25,321,-13,319,-3,314,7,304,18,287,32,262,80,176,8,176,8,156,92,156,95,149,95,111,8,111,8,91,95,91,95,60,94,39,91,25,84,16,72,11,55,9,55,0,177,0,177,9,161,11,150,16,142,24,138,37,137,55,137,91,224,91,224,111,137,111,137,149,141,156,224,156,224,176,151,176,197,268,207,286,218,300,229,310,242,317,256,321,66,200,66,338,33,338,33,200,16383,16383,66,-6,66,131,33,131,33,-6,100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,126,328,135,327,144,324,150,321,155,316,156,311,156,310,155,309,154,307,152,306,144,298,142,293,140,289,140,284,141,277,144,271,149,266,155,263,163,262,172,263,179,267,184,272,188,280,189,289,185,305,177,318,163,329,145,336,124,338,101,335,82,327,68,314,58,297,55,277,57,262,61,248,70,235,84,220,105,202,99,202,97,203,92,203,74,200,58,191,46,179,38,162,35,143,38,121,48,100,64,79,88,57,121,32,137,20, +32,262,80,176,32,262,32,262,80,176,63,303,32,262,63,303,63,307,63,307,64,313,32,262,91,25,84,16,177,0,177,0,84,16,72,11,177,0,72,11,55,9,95,331,-25,331,-13,319,95,331,-13,319,-3,314,95,331,-3,314,7,304,95,331,7,304,67,317,95,331,67,317,73,319,95,331,73,319,83,321,95,331,83,321,95,321,18,287,32,262,64,313,18,287,64,313,67,317,18,287,67,317,7,304,184,284,128,174,137,149,184,284,137,149,141,156,184,284,141,156,151,176,184,284,151,176,197,268,184,284,197,268,187,289,256,331,158,331,166,321,256,331,166,321,174,321,256,331,174,321,181,319,256,331,181,319,186,315,256,331,186,315,190,311,256,331,190,311,191,306,256,331,191,306,229,310,256,331,229,310,242,317,256,331,242,317,256,321,197,268,207,286,191,306,197,268,191,306,191,303,197,268,191,303,190,299,197,268,190,299,188,294,197,268,188,294,187,289,218,300,229,310,191,306,218,300,191,306,207,286,92,156,95,149,128,174,128,174,95,149,138,37,128,174,138,37,137,55,137,111,137,91,224,91,137,111,224,91,224,111,151,176,141,156,224,156,151,176,224,156,224,176,177,0,177,9,161,11,177,0,161,11,150,16,177,0,150,16,94,39,177,0,94,39,91,25,142,24,138,37,95,149,142,24,95,149,95,111,142,24,95,111,95,91,142,24,95,91,95,60,142,24,95,60,150,16,8,111,8,91,95,91,8,111,95,91,95,111,80,176,8,176,92,156,80,176,92,156,128,174,80,176,128,174,69,285,80,176,69,285,67,289,80,176,67,289,65,294,80,176,65,294,64,299,80,176,64,299,63,303,92,156,8,176,8,156,177,0,55,9,55,0,94,39,150,16,95,60,137,149,128,174,137,55,166,321,158,331,158,321,-13,319,-25,331,-25,321, +66,200,66,338,33,338,33,200,16383,16383,66,-6,66,131,33,131,33,-6,100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326, +33,338,33,200,66,200,33,338,66,200,66,338,33,131,33,-6,66,-6,33,131,66,-6,66,131, +100,257,94,262,86,276,84,284,83,292,85,304,91,314,100,321,111,326,126,328,135,327,144,324,150,321,155,316,156,311,156,310,155,309,154,307,152,306,144,298,142,293,140,289,140,284,141,277,144,271,149,266,155,263,163,262,172,263,179,267,184,272,188,280,189,289,185,305,177,318,163,329,145,336,124,338,101,335,82,327,68,314,58,297,55,277,57,262,61,248,70,235,84,220,105,202,99,202,97,203,92,203,74,200,58,191,46,179,38,162,35,143,38,121,48,100,64,79,88,57,121,32,137,20,150,8,159,-2,164,-13,165,-24,163,-37,157,-48,148,-56,136,-61,122,-63,111,-62,101,-59,93,-55,88,-50,86,-45,86,-44,87,-42,90,-39,92,-38,96,-33,99,-29,103,-21,103,-17,102,-10,99,-5,93,0,87,2,79,3,70,2,63,-1,57,-7,53,-14,52,-23,55,-39,65,-53,80,-64,99,-71,121,-73,145,-70,165,-62,180,-48,190,-31,193,-10,192,4,187,17,179,30,165,45,146,63,152,63,173,65,190,73,202,86,210,102,213,123,211,139,206,154,197,170,184,185,169,200,16383,16383,187,105,185,96,180,87,172,80,163,75,152,73,141,75,129,79,116,87,101,99,84,114,75,124,69,133,65,141,62,149,61,158,63,169,68,178,75,185,84,190,95,191,106,190,118,184,132,176,146,165,161,152,170,142,177,132,183,123,186,114,187,105,158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,210,71,230,74,247,78,260,82,265,86,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,329,89,305,52,268,28,220,19,165,28,110,52,63,89,26,136,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,167,326,119,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,144,309,189,317,234,309,274,288,305,255,326,214,334,167,135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332, +101,335,82,327,85,304,85,304,82,327,83,292,84,220,83,292,82,327,84,220,82,327,70,235,70,235,82,327,68,314,70,235,68,314,61,248,61,248,68,314,58,297,61,248,58,297,57,262,57,262,58,297,55,277,69,133,88,57,75,124,75,124,88,57,84,114,101,99,84,114,88,57,101,99,88,57,121,32,95,191,94,203,92,203,95,191,92,203,84,190,95,191,97,203,94,203,63,169,68,178,74,200,74,200,68,178,75,185,74,200,75,185,92,203,92,203,75,185,84,190,74,200,58,191,63,169,63,169,58,191,61,158,64,79,61,158,58,191,64,79,58,191,48,100,48,100,58,191,46,179,48,100,46,179,38,121,38,121,46,179,38,162,38,121,38,162,35,143,165,45,146,63,150,8,150,8,146,63,141,75,150,8,141,75,137,20,137,20,141,75,129,79,137,20,129,79,121,32,121,32,129,79,116,87,121,32,116,87,101,99,163,-37,157,-48,165,-62,165,-62,157,-48,148,-56,165,-62,148,-56,145,-70,145,-70,148,-56,136,-61,145,-70,136,-61,122,-63,122,-63,111,-62,121,-73,121,-73,111,-62,101,-59,121,-73,101,-59,99,-71,99,-71,101,-59,93,-55,99,-71,93,-55,88,-50,79,3,80,-64,87,2,87,2,80,-64,86,-45,88,-50,86,-45,80,-64,88,-50,80,-64,99,-71,144,324,145,336,135,327,135,327,145,336,126,328,111,326,126,328,124,338,111,326,124,338,101,335,101,335,85,304,91,314,101,335,91,314,100,321,101,335,100,321,111,326,152,73,146,63,152,63,152,73,152,63,173,65,152,73,141,75,146,63,180,87,172,80,173,65,173,65,172,80,163,75,173,65,163,75,152,73,118,184,132,176,169,200,169,200,132,176,146,165,169,200,146,165,161,152,161,152,170,142,169,200,169,200,170,142,184,185,213,123,211,139,210,102,210,102,211,139,206,154,210,102,206,154,202,86,202,86,206,154,197,170,202,86,197,170,190,73,190,73,197,170,187,105,190,73,187,105,185,96,190,73,185,96,180,87,177,132,183,123,184,185,184,185,183,123,186,114,184,185,186,114,197,170,197,170,186,114,187,105,106,190,118,184,169,200,106,190,169,200,105,202,106,190,105,202,102,202,106,190,102,202,99,202,106,190,99,202,97,203,106,190,97,203,95,191,100,257,94,262,105,202,100,257,105,202,169,200,94,262,90,269,105,202,105,202,90,269,86,276,105,202,86,276,84,220,84,220,86,276,84,284,84,220,84,284,83,292,193,-10,192,4,190,-31,190,-31,192,4,187,17,190,-31,187,17,180,-48,180,-48,187,17,179,30,180,-48,179,30,165,45,165,45,150,8,159,-2,165,45,159,-2,164,-13,165,45,164,-13,165,-24,165,45,165,-24,165,-62,165,45,165,-62,180,-48,163,-37,165,-62,165,-24,122,-63,121,-73,145,-70,156,311,156,310,163,262,163,262,156,310,155,309,163,262,155,309,155,263,155,263,155,309,154,307,155,263,154,307,152,306,163,329,156,311,163,262,155,316,156,311,163,329,155,316,163,329,150,321,150,321,163,329,145,336,150,321,145,336,144,324,145,336,124,338,126,328,185,305,177,318,179,267,185,305,179,267,184,272,185,305,184,272,188,280,185,305,188,280,189,289,177,318,163,329,163,262,177,318,163,262,172,263,177,318,172,263,179,267,149,266,155,263,152,306,149,266,152,306,148,302,149,266,148,302,144,298,149,266,144,298,144,271,142,293,140,289,141,277,142,293,141,277,144,271,142,293,144,271,144,298,102,-10,99,-5,99,-29,102,-10,99,-29,101,-25,102,-10,101,-25,103,-21,102,-10,103,-21,103,-17,99,-29,99,-5,96,-33,96,-33,99,-5,93,0,96,-33,93,0,92,-38,92,-38,93,0,90,-39,86,-45,86,-44,87,2,87,2,86,-44,87,-42,87,2,87,-42,93,0,93,0,87,-42,88,-41,93,0,88,-41,90,-39,70,2,63,-1,65,-53,70,2,65,-53,80,-64,70,2,80,-64,79,3,57,-7,53,-14,55,-39,57,-7,55,-39,65,-53,57,-7,65,-53,63,-1,65,141,62,149,64,79,65,141,64,79,88,57,65,141,88,57,69,133,61,158,64,79,62,149,55,-39,53,-14,52,-23,141,277,140,289,140,284,180,87,173,65,190,73,184,185,170,142,177,132, +158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70, +108,286,109,278,110,294,110,294,109,278,113,272,110,294,113,272,113,301,113,301,113,272,118,266,113,301,118,266,118,306,118,306,118,266,125,263,118,306,125,263,125,310,125,310,125,263,132,262,125,310,132,262,133,311,133,311,132,262,140,263,133,311,140,263,141,310,141,310,140,263,148,266,141,310,148,266,148,306,148,306,148,266,153,272,148,306,153,272,153,301,153,301,153,272,157,278,153,301,157,278,157,294,157,294,157,278,158,286,9,286,10,278,10,294,10,294,10,278,14,272,10,294,14,272,14,301,14,301,14,272,19,266,14,301,19,266,19,306,19,306,19,266,25,263,19,306,25,263,26,310,26,310,25,263,33,262,26,310,33,262,33,311,33,311,33,262,41,263,33,311,41,263,41,310,41,310,41,263,48,266,41,310,48,266,48,306,48,306,48,266,54,272,48,306,54,272,54,301,54,301,54,272,57,278,54,301,57,278,57,294,57,294,57,278,59,286, +273,124,266,124,257,108,247,95,236,87,223,82,208,80,183,84,162,95,147,113,137,138,133,169,137,197,146,221,161,240,180,252,205,256,221,254,234,249,245,240,253,227,257,211,266,211,266,247,265,249,264,250,263,252,261,254,259,255,249,259,238,262,216,266,205,266,169,262,138,248,115,227,100,199,95,165,99,133,112,107,132,87,158,75,191,70,210,71,230,74,247,78,260,82,265,86,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,329,89,305,52,268,28,220,19,165,28,110,52,63,89,26,136,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,167,326,119,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,144,309,189,317,234,309,274,288,305,255,326,214,334,167,135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,18,325,10,316,8,305,9,300,11,295,14,292,19,290,24,289,29,290,37,294,39,298,40,301,40,303,39,304,39,307,38,309,38,313,39,316,43,319,48,322,54,324,60,324,67,323,72,321,76,316,78,310,79,303,79,288,56,279,40,273,29,268,20,263,13,257,9,253,6,248,4,243,2,231,4,220,9,210,16,203,26,199,37,197,46,198,55,200,64,205,73,211,83,219,85,210,88,204,93,200,98,198,105,197,112,197,117,199,123,202,128,206,135,212,16383,16383,79,237,79,235,78,233,77,230,76,228,74,226,64,222,60,221,56,221,52,220,46,222,41,225,37,230,34,236,33,243,35,250,39,256, +162,95,147,113,158,75,158,75,147,113,137,138,158,75,137,138,132,87,132,87,137,138,133,169,138,248,133,169,137,197,138,248,137,197,146,221,216,266,205,266,221,254,221,254,205,266,205,256,180,252,205,256,205,266,180,252,205,266,169,262,263,252,261,254,266,211,266,211,261,254,259,255,266,211,259,255,257,211,257,211,259,255,253,227,169,262,138,248,146,221,169,262,146,221,161,240,169,262,161,240,180,252,115,227,100,199,112,107,115,227,112,107,132,87,115,227,132,87,133,169,115,227,133,169,138,248,100,199,95,165,99,133,100,199,99,133,112,107,266,124,257,108,260,82,260,82,257,108,247,95,260,82,247,95,247,78,247,78,247,95,236,87,247,78,236,87,230,74,230,74,236,87,223,82,230,74,223,82,210,71,210,71,223,82,208,80,191,70,210,71,208,80,191,70,208,80,183,84,191,70,183,84,162,95,191,70,162,95,158,75,266,211,266,247,265,249,266,211,265,249,264,250,266,211,264,250,263,252,216,266,221,254,227,264,227,264,221,254,234,249,227,264,234,249,238,262,238,262,234,249,245,240,238,262,245,240,249,259,249,259,245,240,253,227,249,259,253,227,259,255,266,124,260,82,265,86,266,124,265,86,273,124,193,338,189,317,234,309,193,338,234,309,246,329,246,329,234,309,274,288,246,329,274,288,292,305,292,305,274,288,305,255,292,305,305,255,329,267,329,267,305,255,326,214,329,267,326,214,334,167,334,167,352,220,329,267,334,167,353,110,352,220,329,63,353,110,334,167,329,63,334,167,326,119,329,63,326,119,306,77,329,63,306,77,292,26,190,14,190,-6,235,22,235,22,190,-6,245,1,235,22,245,1,275,44,275,44,245,1,292,26,275,44,292,26,306,77,54,213,74,254,89,305,89,305,74,254,106,287,89,305,106,287,137,329,137,329,106,287,144,309,137,329,144,309,193,338,193,338,144,309,189,317,28,110,52,63,28,220,28,220,52,63,46,166,52,268,46,166,54,213,52,268,54,213,89,305,145,22,106,43,136,1,145,22,136,1,190,-6,145,22,190,-6,190,14,89,26,136,1,106,43,89,26,106,43,74,76,89,26,74,76,54,118,89,26,54,118,52,63,46,166,52,63,54,118,28,110,28,220,19,165,28,220,46,166,52,268,352,220,353,110,361,165, +135,221,129,217,127,216,124,215,118,215,116,217,115,220,115,225,114,233,114,290,112,307,106,321,96,330,81,336,62,338,44,337,29,332,18,325,10,316,8,305,9,300,11,295,14,292,19,290,24,289,29,290,37,294,39,298,40,301,40,303,39,304,39,307,38,309,38,313,39,316,43,319,48,322,54,324,60,324,67,323,72,321,76,316,78,310,79,303,79,288,56,279,40,273,29,268,20,263,13,257,9,253,6,248,4,243,2,231,4,220,9,210,16,203,26,199,37,197,46,198,55,200,64,205,73,211,83,219,85,210,88,204,93,200,98,198,105,197,112,197,117,199,123,202,128,206,135,212,16383,16383,79,237,79,235,78,233,77,230,76,228,74,226,64,222,60,221,56,221,52,220,46,222,41,225,37,230,34,236,33,243,35,250,39,256,48,262,61,269,79,276,117,113,157,77,172,64,203,33,216,21,222,17,224,17,225,18,227,19,228,20,228,22,227,26,224,31,219,39,212,49,203,60,196,70,188,80,180,91,171,102,161,113,203,166,212,178,219,187,224,194,227,199,228,203,228,205,227,207,225,208,223,208,216,204,204,193,172,163,157,150,16383,16383,21,113,61,77,76,64,107,33,120,21,126,17,128,17,129,18,131,19,132,20,132,22,131,26,128,31,123,39,116,49,107,60,100,70,92,80,65,113,107,166,116,178,123,187,128,194,131,199,132,203,132,205,131,207,129,208,127,208,120,204,108,193,76,163,61,150,276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258, +38,309,38,310,39,298,39,298,38,310,38,311,39,298,38,311,37,294,37,294,38,311,38,313,44,337,38,313,39,316,44,337,39,316,43,319,39,305,39,307,39,298,39,305,39,298,40,301,40,301,40,302,40,303,40,301,40,303,39,304,40,301,39,304,39,305,46,198,55,200,46,222,46,222,55,200,52,220,56,221,52,220,55,200,56,221,55,200,64,205,81,336,62,338,67,323,67,323,62,338,60,324,54,324,60,324,62,338,54,324,62,338,48,322,48,322,62,338,44,337,48,322,44,337,43,319,78,233,77,230,83,219,83,219,77,230,76,228,83,219,76,228,74,226,74,226,69,224,73,211,73,211,69,224,64,222,73,211,64,222,64,205,64,205,64,222,60,221,64,205,60,221,56,221,24,289,29,290,29,332,29,332,29,290,33,292,29,332,33,292,38,313,38,313,33,292,37,294,11,295,14,292,18,325,18,325,14,292,19,290,18,325,19,290,29,332,29,332,19,290,24,289,10,316,8,305,9,300,10,316,9,300,11,295,10,316,11,295,18,325,81,336,79,276,83,219,81,336,83,219,96,330,96,330,83,219,85,210,96,330,85,210,88,204,81,336,67,323,72,321,81,336,72,321,76,316,81,336,76,316,78,310,81,336,78,310,79,303,81,336,79,303,79,276,98,198,105,197,106,321,106,321,105,197,112,197,106,321,112,197,112,307,112,307,112,197,115,225,112,307,115,225,114,233,117,199,123,202,118,215,118,215,123,202,121,215,124,215,121,215,123,202,124,215,123,202,128,206,135,221,132,219,135,212,135,212,132,219,129,217,135,212,129,217,128,206,128,206,129,217,127,216,128,206,127,216,124,215,117,199,118,215,116,217,117,199,116,217,115,220,117,199,115,220,115,225,117,199,115,225,112,197,96,330,88,204,93,200,96,330,93,200,98,198,96,330,98,198,106,321,83,219,79,276,79,237,83,219,79,237,79,235,83,219,79,235,78,233,74,226,73,211,83,219,35,250,39,256,40,273,40,273,39,256,48,262,40,273,48,262,56,279,56,279,48,262,61,269,56,279,61,269,79,288,79,288,61,269,79,276,79,288,79,276,79,303,40,273,29,268,35,250,35,250,29,268,33,243,37,197,33,243,29,268,37,197,29,268,26,199,26,199,29,268,20,263,26,199,20,263,16,203,16,203,20,263,13,257,16,203,13,257,9,253,41,225,37,230,37,197,41,225,37,197,46,198,41,225,46,198,46,222,34,236,33,243,37,197,34,236,37,197,37,230,9,210,16,203,9,253,9,210,9,253,6,248,9,210,6,248,4,243,9,210,4,243,4,220,3,237,2,231,4,220,3,237,4,220,4,243,114,233,114,290,112,307,29,332,38,313,44,337,38,309,39,298,39,307, +117,113,157,77,172,64,203,33,216,21,222,17,224,17,225,18,227,19,228,20,228,22,227,26,224,31,219,39,212,49,203,60,196,70,188,80,180,91,171,102,161,113,203,166,212,178,219,187,224,194,227,199,228,203,228,205,227,207,225,208,223,208,216,204,204,193,172,163,157,150,16383,16383,21,113,61,77,76,64,107,33,120,21,126,17,128,17,129,18,131,19,132,20,132,22,131,26,128,31,123,39,116,49,107,60,100,70,92,80,65,113,107,166,116,178,123,187,128,194,131,199,132,203,132,205,131,207,129,208,127,208,120,204,108,193,76,163,61,150,276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,196,260,110,260,110,252,122,251,128,248,132,244,134,237,134,98,132,91,129,87,121,85,110,84,109,76,190,76,190,84,178,85,171,87,168,92,166,100,166,157,190,157,199,143,206,133,210,127,213,121,216,116,224,101,232,90,239,82,246,77,252,76,16383,16383,166,166,166,251,185,251,199,248,210,243,217,234,221,222,222,209,221,196,216,184,209,175, +203,60,196,70,203,60,203,60,196,70,203,33,203,60,203,33,212,49,212,49,203,33,216,21,212,49,216,21,219,39,219,39,216,21,222,17,219,39,222,17,224,31,224,31,222,17,224,17,224,31,224,17,225,18,227,26,224,31,225,18,227,26,225,18,227,19,227,26,227,19,228,20,227,26,228,20,228,22,171,102,172,64,180,91,180,91,172,64,188,48,180,91,188,48,188,80,188,80,188,48,203,33,188,80,203,33,196,70,161,113,172,163,157,150,161,113,157,150,157,77,161,113,157,77,172,64,161,113,172,64,171,102,228,205,227,207,227,199,228,205,227,199,228,203,228,205,228,203,228,204,188,178,203,166,204,193,204,193,203,166,212,178,204,193,212,178,216,204,216,204,212,178,219,187,216,204,219,187,223,208,223,208,219,187,224,194,223,208,224,194,225,208,225,208,224,194,227,199,225,208,227,199,227,207,172,163,161,113,203,166,172,163,203,166,188,178,107,60,100,70,107,33,107,60,107,33,116,49,116,49,107,33,120,21,116,49,120,21,123,39,123,39,120,21,126,17,123,39,126,17,128,31,128,31,126,17,128,17,128,31,128,17,129,18,131,26,128,31,129,18,131,26,129,18,131,19,131,26,131,19,132,20,131,26,132,20,132,22,74,102,76,64,83,91,83,91,76,64,92,48,83,91,92,48,92,80,92,80,92,48,107,33,92,80,107,33,100,70,65,113,76,163,61,150,65,113,61,150,61,77,65,113,61,77,76,64,65,113,76,64,74,102,132,205,131,207,131,199,132,205,131,199,132,203,132,205,132,203,132,204,92,178,107,166,108,193,108,193,107,166,116,178,108,193,116,178,120,204,120,204,116,178,123,187,120,204,123,187,127,208,127,208,123,187,128,194,127,208,128,194,129,208,129,208,128,194,131,199,129,208,131,199,131,207,76,163,65,113,107,166,76,163,107,166,92,178,61,77,61,150,21,113,157,77,157,150,117,113, +276,57,276,196,24,196,24,164,243,164,243,57,142,97,142,128,20,128,20,97,283,76,283,80, +243,164,243,57,276,57,243,164,276,57,276,196,243,164,276,196,24,196,243,164,24,196,24,164, +142,97,142,128,20,128,20,97,283,76,283,80,276,86,268,94, +142,97,142,128,20,128,142,97,20,128,20,97, +283,76,283,80,276,86,268,94,252,112,244,123,216,162,230,168,241,177,249,188,254,199,256,211,253,228,246,241,233,251,217,258,196,260,110,260,110,252,122,251,128,248,132,244,134,237,134,98,132,91,129,87,121,85,110,84,109,76,190,76,190,84,178,85,171,87,168,92,166,100,166,157,190,157,199,143,206,133,210,127,213,121,216,116,224,101,232,90,239,82,246,77,252,76,16383,16383,166,166,166,251,185,251,199,248,210,243,217,234,221,222,222,209,221,196,216,184,209,175,199,168,187,166,188,166,16383,16383,361,165,352,220,329,267,292,305,246,329,193,338,137,330,89,305,52,268,28,221,19,166,28,111,51,63,88,26,135,1,190,-6,245,1,292,26,329,63,353,110,361,165,16383,16383,334,165,326,118,306,77,275,44,235,22,190,14,145,22,106,43,74,76,54,118,46,166,54,213,74,254,106,287,145,309,189,317,235,309,275,288,306,255,326,213,334,165,161,273,161,300,6,300,6,273,171,267,168,289,158,309,143,324,123,334,101,338,78,335,58,325,42,309,32,290,28,267,32,244,42,224,57,209,77,198,100,195,123,198,142,209,158,224,168,244,171,267,16383,16383,152,267,149,250,142,235,130,223,116,215,100,212,84,215,69,223,58,234,51,249,48,267,51,284,58,298,69,310,83,318,99,321,115,318,130,310,141,299,149,284,152,267,319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,46,307,57,308,68,306,78,301,86,292,91,282,93,270,91,260,86,247,78,233,67,217,54,201,3,147,3,135,128,135,102,256, +222,209,222,209,222,209,222,209,230,168,233,251,233,251,230,168,241,177,233,251,241,177,246,241,246,241,241,177,249,188,246,241,249,188,253,228,253,228,249,188,254,199,253,228,254,199,256,211,221,222,222,209,233,251,221,222,233,251,217,258,221,222,217,258,217,234,166,251,185,251,196,260,196,260,185,251,199,248,196,260,199,248,217,258,217,258,199,248,210,243,217,258,210,243,217,234,134,226,168,92,166,100,134,226,166,100,166,111,166,166,166,157,190,157,166,166,190,157,187,166,187,166,190,157,188,166,187,166,188,166,199,168,199,168,188,166,190,157,199,168,190,157,199,143,166,251,196,260,132,244,166,251,132,244,134,237,166,251,134,237,134,226,166,251,134,226,166,111,196,260,110,260,122,251,196,260,122,251,128,248,196,260,128,248,132,244,213,121,216,162,216,184,216,184,216,162,230,168,216,184,230,168,221,196,221,196,230,168,222,209,213,121,216,184,210,127,210,127,216,184,209,175,210,127,209,175,206,133,206,133,209,175,199,168,206,133,199,168,199,143,232,90,239,82,244,123,244,123,239,82,246,77,244,123,246,77,252,112,252,112,246,77,252,76,252,112,252,76,260,103,260,103,252,76,283,76,260,103,283,76,268,94,268,94,283,76,276,86,244,123,216,162,216,116,244,123,216,116,224,101,244,123,224,101,232,90,190,76,190,84,178,85,190,76,178,85,171,87,190,76,171,87,134,108,190,76,134,108,134,98,190,76,134,98,132,91,190,76,132,91,129,87,190,76,129,87,121,85,190,76,121,85,110,84,190,76,110,84,109,76,134,111,134,108,171,87,134,111,171,87,168,92,134,111,168,92,134,226,193,338,189,317,235,309,193,338,235,309,246,329,246,329,235,309,275,288,246,329,275,288,292,305,292,305,275,288,306,255,292,305,306,255,329,267,329,267,306,255,326,213,329,267,326,213,334,165,334,165,352,220,329,267,334,165,353,110,352,220,329,63,353,110,334,165,329,63,334,165,326,118,329,63,326,118,306,77,329,63,306,77,292,26,190,14,190,-6,235,22,235,22,190,-6,245,1,235,22,245,1,275,44,275,44,245,1,292,26,275,44,292,26,306,77,54,213,74,254,89,305,89,305,74,254,106,287,89,305,106,287,137,330,137,330,106,287,145,309,137,330,145,309,193,338,193,338,145,309,189,317,28,111,51,63,28,221,28,221,51,63,46,166,52,268,46,166,54,213,52,268,54,213,89,305,145,22,106,43,135,1,145,22,135,1,190,-6,145,22,190,-6,190,14,88,26,135,1,106,43,88,26,106,43,74,76,88,26,74,76,54,118,88,26,54,118,51,63,46,166,51,63,54,118,28,111,28,221,19,166,28,221,46,166,52,268,352,220,353,110,361,165,216,116,216,162,213,121,276,86,283,76,283,80,122,251,110,260,110,252, +161,273,161,300,6,300,6,273,171,267,168,289,158,309,143,324, +161,273,161,300,6,300,161,273,6,300,6,273, +171,267,168,289,158,309,143,324,123,334,101,338,78,335,58,325,42,309,32,290,28,267,32,244,42,224,57,209,77,198,100,195,123,198,142,209,158,224,168,244,171,267,16383,16383,152,267,149,250,142,235,130,223,116,215,100,212,84,215,69,223,58,234,51,249,48,267,51,284,58,298,69,310,83,318,99,321,115,318,130,310,141,299,149,284,152,267,319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302, +83,318,99,321,99,321,101,338,99,321,115,318,101,338,115,318,123,334,123,334,115,318,130,310,123,334,130,310,143,324,143,324,130,310,141,299,143,324,141,299,149,284,171,267,168,289,168,244,168,244,168,289,158,309,168,244,158,309,158,224,158,224,158,309,152,267,158,224,152,267,149,250,158,224,149,250,142,209,142,209,149,250,142,235,142,209,142,235,130,223,158,309,143,324,149,284,158,309,149,284,152,267,142,209,130,223,123,198,123,198,130,223,116,215,123,198,116,215,100,195,100,195,116,215,100,212,58,298,69,310,78,335,78,335,69,310,83,318,78,335,83,318,101,338,101,338,83,318,99,321,42,309,48,267,51,284,42,309,51,284,58,325,58,325,51,284,58,298,58,325,58,298,78,335,84,215,69,223,77,198,84,215,77,198,100,195,84,215,100,195,100,212,48,267,42,224,51,249,51,249,42,224,57,209,51,249,57,209,58,234,58,234,57,209,77,198,58,234,77,198,69,223,28,267,32,244,32,290,32,290,32,244,42,224,32,290,42,224,42,309,42,309,42,224,48,267, +319,121,319,154,188,154,188,251,155,251,155,154,24,154,24,121,155,121,155,17,188,17,188,121,16383,16383,319,-43,319,-10,24,-10,24,-43,148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338, +188,251,155,251,188,17,188,17,155,251,155,154,188,17,155,154,155,121,155,121,155,154,24,154,155,121,24,154,24,121,188,121,319,121,188,154,24,-10,24,-43,319,-43,24,-10,319,-43,319,-10,188,154,319,121,319,154,188,17,155,121,155,17, +148,177,139,181,134,175,124,169,110,167,54,167,95,208,112,226,125,241,133,255,137,269,138,283,136,301,127,316,114,328,97,335,75,338,53,336,35,329,21,317,10,301,1,278,13,271,20,284,28,295,37,302,46,307,57,308,68,306,78,301,86,292,91,282,93,270,91,260,86,247,78,233,67,217,54,201,3,147,3,135,128,135,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190, +54,201,3,147,54,167,54,201,54,167,95,208,54,201,95,208,67,217,13,271,20,284,21,317,21,317,20,284,28,295,21,317,28,295,35,329,35,329,28,295,37,302,35,329,37,302,53,336,53,336,37,302,46,307,53,336,46,307,57,308,57,308,68,306,75,338,75,338,68,306,78,301,75,338,78,301,97,335,97,335,78,301,86,292,97,335,86,292,91,282,10,301,1,278,13,271,10,301,13,271,21,317,91,260,95,208,93,270,93,270,95,208,97,335,97,335,95,208,112,226,97,335,112,226,114,328,114,328,112,226,125,241,114,328,125,241,127,316,127,316,125,241,133,255,127,316,133,255,136,301,136,301,133,255,137,269,136,301,137,269,138,283,97,335,91,282,93,270,75,338,53,336,57,308,95,208,91,260,86,247,95,208,86,247,78,233,95,208,78,233,67,217,129,172,124,169,128,135,128,135,124,169,117,168,128,135,117,168,110,167,128,135,110,167,54,167,128,135,54,167,3,147,148,177,139,181,134,175,148,177,134,175,129,172,148,177,129,172,128,135,128,135,3,147,3,135, +102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,46,253,66,253,143,302,149,306,153,310,156,314,158,318,158,329,155,333,152,336,147,338,141,339,133,337,129,335,125,332,120,328,215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,29,14,26,-5,22,-28,19,-51,18,-69,19,-82,22,-93,26,-101,32,-106,40,-108,48,-106,55,-102,60,-94,63,-83,64,-69,62,-51,58,-29,52,-6,48,14,46,32,55,18,66,8,77,1,91,-3,107,-4,123,-2,137,2,150,11,162,24,172,40,174,40,176,24,182,11,191,2,201,-2,211,-4,222,-3,231,0,239,4,247,12,256,23,256,28, +66,155,61,156,83,134,83,134,61,156,57,158,83,134,57,158,52,131,52,131,57,158,52,161,52,131,52,161,46,165,56,231,59,231,65,252,65,252,59,231,60,232,60,232,76,230,65,252,65,252,76,230,78,259,65,252,46,244,52,231,65,252,52,231,56,231,23,281,31,293,33,322,33,322,31,293,39,301,33,322,39,301,46,331,46,331,39,301,47,306,46,331,47,306,61,336,61,336,47,306,56,309,61,336,56,309,66,310,66,310,76,309,78,338,78,338,76,309,83,306,78,338,83,306,95,336,95,336,83,306,89,301,95,336,89,301,93,295,22,309,11,291,23,281,22,309,23,281,33,322,103,179,99,169,109,144,109,144,99,169,92,162,109,144,92,162,83,134,83,134,92,162,82,157,83,134,82,157,71,155,71,155,66,155,83,134,95,336,94,286,97,216,95,336,97,216,110,330,110,330,97,216,102,256,110,330,102,256,114,263,78,338,61,336,66,310,130,310,122,321,123,271,130,310,123,271,129,279,130,310,129,279,131,288,130,310,131,288,132,296,122,321,110,330,114,263,122,321,114,263,123,271,102,254,102,256,97,216,102,254,97,216,103,205,102,254,103,205,118,248,92,276,87,267,88,225,92,276,88,225,97,216,92,276,97,216,94,286,78,259,76,230,88,225,78,259,88,225,87,267,141,177,146,200,144,214,141,177,144,214,139,227,141,177,139,227,130,239,141,177,130,239,129,159,103,179,109,144,105,190,105,190,109,144,118,248,118,248,109,144,129,159,118,248,129,159,130,239,105,190,118,248,103,205,40,169,36,171,37,132,40,169,37,132,52,131,40,169,52,131,46,165,37,132,36,171,32,173,37,132,32,173,28,174,37,132,28,174,25,175,37,132,25,175,25,136,19,174,14,172,15,142,19,174,15,142,25,136,19,174,25,136,25,175,10,169,8,165,9,150,10,169,9,150,15,142,10,169,15,142,14,172,52,231,46,244,46,230,9,150,8,165,7,159,95,336,93,295,94,286, +46,253,66,253,143,302,149,306,153,310,156,314,158,318,158,329,155,333,152,336,147,338,141,339,133,337,129,335,125,332,120,328,215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27, +141,339,143,302,147,338,147,338,143,302,149,306,147,338,149,306,152,336,152,336,149,306,153,310,152,336,153,310,155,333,155,333,153,310,156,314,155,333,156,314,158,329,158,329,156,314,158,318,158,329,158,318,158,323,143,302,141,339,137,338,143,302,137,338,133,337,143,302,133,337,129,335,143,302,129,335,125,332,143,302,125,332,120,328,143,302,120,328,66,253,66,253,120,328,46,253, +215,225,171,225,171,57,164,46,155,38,144,31,131,27,116,26,102,28,90,34,81,45,76,59,74,78,74,225,30,225,30,27,29,14,26,-5,22,-28,19,-51,18,-69,19,-82,22,-93,26,-101,32,-106,40,-108,48,-106,55,-102,60,-94,63,-83,64,-69,62,-51,58,-29,52,-6,48,14,46,32,55,18,66,8,77,1,91,-3,107,-4,123,-2,137,2,150,11,162,24,172,40,174,40,176,24,182,11,191,2,201,-2,211,-4,222,-3,231,0,239,4,247,12,256,23,256,28,249,22,244,18,239,15,235,14,230,13,224,15,220,19,217,26,215,36,215,48,266,-76,266,-65,247,-62,234,-58,227,-50,223,-38,222,-20,222,271,223,290,227,304,234,313,247,318,266,321,266,331,134,331,95,327,66,316,46,297,34,270,30,235,34,199,46,172,66,154,93,142,127,137,127,-14,126,-35,123,-49,115,-58,102,-63,83,-65,83,-76,160,-76,160,320,189,320,189,-76,16383,16383,127,147,105,153,88,164,77,182,70,206,68,237,70,266,75,289,86,305,103,315,127,320,90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118, +46,32,46,32,46,32,46,32,74,225,30,225,46,32,30,225,32,-106,46,32,32,-106,40,-108,46,32,40,-108,48,-106,76,59,74,78,77,1,77,1,74,78,66,8,66,8,74,78,74,225,66,8,74,225,55,18,55,18,74,225,46,32,30,225,30,27,32,-106,32,-106,30,27,29,14,32,-106,29,14,26,-101,26,-101,29,14,26,-5,26,-101,26,-5,22,-28,18,-69,19,-82,19,-51,19,-51,19,-82,22,-93,19,-51,22,-93,22,-28,22,-28,22,-93,26,-101,171,225,171,57,172,40,172,40,171,57,164,46,172,40,164,46,162,24,162,24,164,46,155,38,162,24,155,38,150,11,150,11,155,38,144,31,150,11,144,31,137,2,137,2,144,31,131,27,137,2,131,27,123,-2,123,-2,131,27,116,26,123,-2,116,26,107,-4,107,-4,116,26,102,28,107,-4,102,28,91,-3,91,-3,102,28,90,34,91,-3,90,34,81,45,81,45,76,59,77,1,81,45,77,1,91,-3,215,225,171,225,172,40,215,225,172,40,174,40,215,225,174,40,176,24,215,225,176,24,182,11,215,225,182,11,191,2,215,225,191,2,201,-2,215,225,201,-2,211,-4,215,225,211,-4,215,48,249,22,244,18,247,12,247,12,244,18,239,15,247,12,239,15,239,4,239,4,239,15,235,14,239,4,235,14,231,0,231,0,235,14,230,13,249,22,247,12,256,23,249,22,256,23,256,28,224,15,220,19,222,-3,224,15,222,-3,231,0,224,15,231,0,230,13,215,48,211,-4,215,36,215,36,211,-4,222,-3,215,36,222,-3,217,26,217,26,222,-3,220,19,48,14,48,-106,52,-6,52,-6,48,-106,55,-102,52,-6,55,-102,58,-29,58,-29,55,-102,60,-94,58,-29,60,-94,62,-51,62,-51,60,-94,63,-83,62,-51,63,-83,64,-69,46,32,48,-106,48,14, +266,-76,266,-65,247,-62,234,-58,227,-50,223,-38,222,-20,222,271,223,290,227,304,234,313,247,318,266,321,266,331,134,331,95,327,66,316,46,297,34,270,30,235,34,199,46,172,66,154,93,142,127,137,127,-14,126,-35,123,-49,115,-58,102,-63,83,-65,83,-76,160,-76,160,320,189,320,189,-76,16383,16383,127,147,105,153,88,164,77,182,70,206,68,237,70,266,75,289,86,305,103,315,127,320,90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,90,127,87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,33,-83,26,-98,35,-102,51,-106,59,-106,68,-107, +123,-49,115,-58,160,-76,160,-76,115,-58,102,-63,160,-76,102,-63,83,-65,134,331,95,327,103,315,134,331,103,315,127,320,134,331,127,320,127,137,134,331,127,137,160,-76,134,331,160,-76,160,320,134,331,160,320,266,331,127,320,127,147,127,137,105,153,88,164,93,142,93,142,88,164,77,182,93,142,77,182,66,154,66,154,77,182,70,206,66,154,70,206,68,237,68,237,70,266,66,316,66,316,70,266,75,289,66,316,75,289,95,327,95,327,75,289,86,305,95,327,86,305,103,315,66,316,46,297,46,172,66,316,46,172,66,154,66,316,66,154,68,237,247,318,266,321,266,331,247,318,266,331,234,313,234,313,266,331,189,320,234,313,189,320,227,304,227,304,189,320,223,290,234,-58,227,-50,189,-76,189,-76,227,-50,223,-38,189,-76,223,-38,189,320,189,320,223,-38,222,-20,189,320,222,-20,222,271,160,-76,127,137,127,-14,160,-76,127,-14,126,-35,160,-76,126,-35,123,-49,266,-76,266,-65,247,-62,266,-76,247,-62,234,-58,266,-76,234,-58,189,-76,105,153,93,142,127,137,105,153,127,137,127,147,34,199,46,172,46,297,34,199,46,297,34,270,34,199,34,270,30,235,160,-76,83,-65,83,-76,266,331,160,320,189,320,223,290,189,320,222,271, +90,127,89,135,85,143,79,149,71,154,63,155,54,154,46,150,40,144,37,136,35,127,37,118,40,111,46,105,54,101,63,99,71,101,79,105,85,111,89,118,90,127,87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86, +35,127,37,118,37,136,37,136,37,118,40,111,37,136,40,111,40,144,40,144,40,111,46,105,40,144,46,105,46,150,46,150,46,105,54,101,46,150,54,101,54,154,54,154,54,101,62,99,54,154,62,99,63,155,63,155,62,99,71,101,63,155,71,101,71,154,71,154,71,101,79,105,71,154,79,105,79,149,79,149,79,105,85,111,79,149,85,111,85,143,85,143,85,111,89,118,85,143,89,118,89,135,89,135,89,118,90,127, +87,0,70,0,49,-49,52,-51,55,-50,57,-50,60,-49,66,-49,76,-50,84,-52,89,-55,92,-60,93,-67,92,-74,88,-81,83,-85,75,-88,65,-89,59,-89,47,-87,40,-86,33,-83,26,-98,35,-102,51,-106,59,-106,68,-107,89,-105,107,-99,120,-91,128,-79,131,-64,129,-52,123,-43,114,-36,102,-32,88,-30,80,-30,77,-31,75,-31,124,135,124,147,113,148,105,150,99,154,96,159,95,166,95,336,89,338,30,310,30,299,36,302,41,304,45,305,52,305,54,301,55,297,55,157,52,153,47,150,40,148,28,147,28,135,152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201, +59,-106,68,-107,59,-89,59,-89,68,-107,65,-89,75,-88,65,-89,68,-107,75,-88,68,-107,89,-105,57,-50,60,-49,70,0,70,0,60,-49,63,-49,70,0,63,-49,66,-49,66,-49,76,-50,70,0,70,0,76,-50,75,-31,70,0,75,-31,87,0,70,0,49,-49,52,-51,70,0,52,-51,55,-50,70,0,55,-50,57,-50,131,-64,129,-52,128,-79,128,-79,129,-52,123,-43,128,-79,123,-43,120,-91,120,-91,123,-43,114,-36,120,-91,114,-36,107,-99,107,-99,114,-36,102,-32,107,-99,102,-32,93,-67,93,-67,102,-32,92,-60,89,-55,92,-60,102,-32,89,-55,102,-32,88,-30,89,-55,88,-30,85,-30,89,-55,85,-30,84,-52,84,-52,85,-30,82,-30,84,-52,82,-30,80,-30,84,-52,80,-30,77,-31,84,-52,77,-31,76,-50,107,-99,93,-67,92,-74,107,-99,92,-74,89,-105,89,-105,92,-74,88,-81,89,-105,88,-81,83,-85,33,-83,35,-102,40,-86,40,-86,35,-102,43,-104,40,-86,43,-104,47,-87,47,-87,43,-104,51,-106,47,-87,51,-106,53,-88,53,-88,51,-106,59,-106,53,-88,59,-106,59,-89,35,-102,33,-83,26,-98,75,-88,89,-105,83,-85,75,-31,76,-50,77,-31, +124,135,124,147,113,148,105,150,99,154,96,159,95,166,95,336,89,338,30,310,30,299,36,302,41,304,45,305,52,305,54,301,55,297,55,157,52,153,47,150,40,148,28,147,28,135,152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,121,211,138,227,148,247,152,271,16383,16383,116,258, +52,153,47,150,124,135,124,135,47,150,40,148,124,135,40,148,28,147,41,304,45,305,89,338,89,338,45,305,48,305,89,338,48,305,50,305,50,305,52,305,89,338,89,338,52,305,53,303,89,338,53,303,54,301,113,148,105,150,124,135,124,135,105,150,99,154,124,135,99,154,55,164,55,164,99,154,96,159,55,164,96,159,55,291,55,297,55,291,89,338,55,297,89,338,54,301,36,302,41,304,89,338,36,302,89,338,30,310,36,302,30,310,30,299,95,166,95,336,89,338,95,166,89,338,55,291,95,166,55,291,96,159,55,157,52,153,124,135,55,157,124,135,55,164,124,135,28,147,28,135,113,148,124,135,124,147, +152,271,148,293,139,312,123,326,103,335,79,338,54,335,33,325,17,310,6,291,3,267,6,244,16,225,32,210,52,200,75,197,100,201,121,211,138,227,148,247,152,271,16383,16383,116,258,114,242,110,230,102,221,93,216,80,214,73,214,66,216,56,224,52,230,44,250,42,261,40,273,40,285,41,297,46,307,53,315,63,320,74,321,88,318,99,310,108,297,114,279,116,258,229,111,189,147,174,161,143,192,130,204,124,208,122,208,121,207,119,206,118,204,118,203,119,199,122,193,127,185,134,176,143,165,150,155,158,145,167,134,176,122,185,111,143,58,134,47,127,38,122,31,119,25,118,22,118,19,119,18,121,17,123,17,130,21,142,32,158,46,174,61,189,75,16383,16383,132,111,92,147,62,177,46,192,34,204,27,208,26,208,24,207,23,206, +44,250,52,200,48,240,48,240,52,200,52,230,56,224,52,230,52,200,56,224,52,200,75,197,42,261,40,273,33,325,42,261,33,325,32,210,42,261,32,210,52,200,42,261,52,200,44,250,33,325,40,285,41,297,33,325,41,297,54,335,54,335,41,297,46,307,54,335,46,307,53,315,3,267,6,244,6,291,6,291,6,244,16,225,6,291,16,225,17,310,17,310,16,225,32,210,17,310,32,210,33,325,103,335,79,338,88,318,88,318,79,338,74,321,63,320,74,321,79,338,63,320,79,338,54,335,114,242,110,230,121,211,121,211,110,230,102,221,121,211,102,221,100,201,100,201,102,221,93,216,100,201,93,216,80,214,80,214,73,214,75,197,75,197,73,214,66,216,75,197,66,216,61,220,152,271,148,293,148,247,148,247,148,293,139,312,148,247,139,312,138,227,138,227,139,312,123,326,138,227,123,326,121,211,121,211,123,326,116,258,88,318,99,310,103,335,103,335,99,310,108,297,103,335,108,297,123,326,123,326,108,297,114,279,123,326,114,279,116,258,80,214,75,197,100,201,54,335,53,315,63,320,114,242,121,211,116,258,56,224,75,197,61,220,33,325,40,273,40,285, +229,111,189,147,174,161,143,192,130,204,124,208,122,208,121,207,119,206,118,204,118,203,119,199,122,193,127,185,134,176,143,165,150,155,158,145,167,134,176,122,185,111,143,58,134,47,127,38,122,31,119,25,118,22,118,19,119,18,121,17,123,17,130,21,142,32,158,46,174,61,189,75,16383,16383,132,111,92,147,62,177,46,192,34,204,27,208,26,208,24,207,23,206,22,204,22,203,23,199,26,193,31,185,38,176,46,165,53,155,61,145,70,134,79,122,89,111,46,58,38,47,31,38,26,31,23,25,22,22,22,19,23,18,25,17,27,17,33,21,45,32,61,46,77,61,92,75,357,45,357,74,329,74,329,203,305,203,204,70,204,45,294,45,294,0,329,0,329,45,16383,16383,294,74,227,74,294,163,16383,16383,316,338,293,338,66,-6,91,-6,16383,16383,112,135,112,147,100,148,92,150,87,154,84,159,83,166,83,336,76,338,22,310,22,299,29,302,34,304,38,305,45,305,47,301,47,157,44,153,40,150,32,148,21,147,21,135,371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173, +92,75,132,111,92,147,92,75,92,147,89,111,92,75,89,111,77,61,53,155,61,145,62,177,62,177,61,145,70,134,62,177,70,134,78,161,78,161,70,134,79,122,78,161,79,122,92,147,92,147,79,122,89,111,53,155,62,177,46,165,46,165,62,177,46,192,46,165,46,192,38,176,38,176,46,192,34,204,38,176,34,204,31,185,31,185,34,204,27,208,31,185,27,208,26,193,26,193,27,208,26,208,26,193,26,208,24,207,23,206,22,204,23,199,23,206,23,199,26,193,23,206,26,193,24,207,189,75,229,111,189,147,189,75,189,147,185,111,189,75,185,111,174,61,150,155,158,145,158,177,158,177,158,145,167,134,158,177,167,134,174,161,174,161,167,134,176,122,174,161,176,122,189,147,189,147,176,122,185,111,150,155,158,177,143,165,143,165,158,177,143,192,143,165,143,192,134,176,134,176,143,192,130,204,134,176,130,204,127,185,127,185,130,204,124,208,127,185,124,208,122,208,122,193,127,185,122,208,122,193,122,208,121,207,122,193,121,207,119,206,122,193,119,206,119,199,118,204,118,203,119,199,118,204,119,199,119,206,119,18,121,17,122,31,122,31,121,17,123,17,122,31,123,17,127,38,127,38,123,17,130,21,127,38,130,21,134,47,134,47,130,21,142,32,134,47,142,32,143,58,143,58,142,32,158,46,143,58,158,46,185,111,185,111,158,46,174,61,119,25,118,22,118,20,119,25,118,20,118,19,119,25,118,19,119,18,119,25,119,18,122,31,23,18,25,17,26,31,26,31,25,17,27,17,26,31,27,17,31,38,31,38,27,17,33,21,31,38,33,21,38,47,38,47,33,21,45,32,38,47,45,32,46,58,46,58,45,32,61,46,46,58,61,46,89,111,89,111,61,46,77,61,23,25,22,22,22,20,23,25,22,20,22,19,23,25,22,19,23,18,23,25,23,18,26,31,23,199,22,204,22,203, +357,45,357,74,329,74,329,203,305,203,204,70,204,45,294,45,294,0,329,0,329,45,16383,16383,294,74,227,74,294,163,16383,16383,316,338,293,338,66,-6,91,-6,16383,16383,112,135,112,147,100,148,92,150,87,154,84,159,83,166,83,336,76,338,22,310,22,299,29,302,34,304,38,305,45,305,47,301,47,157,44,153,40,150,32,148,21,147,21,135,371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,291,171,301,166,308,158,313,147,315,135,313,125,308,112,301,98,290,82,276,66,225,12,225,0,351,0, +204,45,294,45,204,70,204,70,294,45,227,74,204,70,227,74,305,203,305,203,227,74,294,163,305,203,294,163,329,0,329,0,294,163,294,74,329,0,294,74,294,45,294,45,294,74,227,74,305,203,329,0,329,203,329,74,329,45,357,45,329,74,357,45,357,74,293,338,66,-6,91,-6,293,338,91,-6,316,338,44,153,40,150,112,135,112,135,40,150,32,148,112,135,32,148,21,147,34,304,38,305,76,338,76,338,38,305,41,305,76,338,41,305,43,305,43,305,45,305,76,338,76,338,45,305,46,303,76,338,46,303,47,301,100,148,92,150,112,135,112,135,92,150,87,154,112,135,87,154,47,164,47,164,87,154,84,159,47,164,84,159,47,291,47,297,47,291,76,338,47,297,76,338,47,301,29,302,34,304,76,338,29,302,76,338,22,310,29,302,22,310,22,299,83,166,83,336,76,338,83,166,76,338,47,291,83,166,47,291,84,159,47,157,44,153,112,135,47,157,112,135,47,164,112,135,21,147,21,135,100,148,112,135,112,147,329,0,294,45,294,0, +371,42,362,46,357,40,352,36,346,34,340,33,333,32,276,32,318,73,335,91,347,106,355,120,360,134,361,148,358,166,350,181,337,193,320,200,298,203,275,201,257,194,243,182,232,165,223,143,235,136,243,149,251,159,259,167,269,171,280,173,291,171,301,166,308,158,313,147,315,135,313,125,308,112,301,98,290,82,276,66,225,12,225,0,351,0,16383,16383,297,338,275,338,48,-6,73,-6,16383,16383,108,135,108,147,97,148,89,150,84,154,81,159,80,166,80,336,73,338,19,310,19,299,26,302,31,304,35,305,42,305,44,301,44,297,45,291,45,164,44,157,41,153,37,150,29,148,18,147,18,135,359,45,359,74,331,74,331,203,308,203,206,70,206,45,296,45,296,0,331,0,331,45,16383,16383,296,74,229,74,296,163,16383,16383,319,338,296,338,69,-6,94,-6,16383,16383,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174, +308,112,301,98,318,73,318,73,301,98,290,82,318,73,290,82,276,66,276,66,225,12,276,32,276,32,225,12,351,0,276,32,351,0,333,32,340,33,333,32,351,0,340,33,351,0,346,34,346,34,351,0,352,36,235,136,243,149,243,182,243,182,243,149,251,159,243,182,251,159,257,194,257,194,251,159,259,167,257,194,259,167,275,201,275,201,259,167,269,171,275,201,269,171,280,173,280,173,291,171,298,203,298,203,291,171,301,166,298,203,301,166,320,200,320,200,301,166,308,158,320,200,308,158,313,147,232,165,223,143,235,136,232,165,235,136,243,182,371,42,362,46,357,40,371,42,357,40,352,36,371,42,352,36,351,0,275,338,48,-6,73,-6,275,338,73,-6,297,338,41,153,37,150,108,135,108,135,37,150,29,148,108,135,29,148,18,147,31,304,35,305,73,338,73,338,35,305,38,305,73,338,38,305,40,305,40,305,42,305,73,338,73,338,42,305,43,303,73,338,43,303,44,301,97,148,89,150,108,135,108,135,89,150,84,154,108,135,84,154,45,164,45,164,84,154,81,159,45,164,81,159,45,291,44,297,45,291,73,338,44,297,73,338,44,301,26,302,31,304,73,338,26,302,73,338,19,310,26,302,19,310,19,299,80,166,80,336,73,338,80,166,73,338,45,291,80,166,45,291,81,159,313,125,318,73,315,135,315,135,318,73,320,200,320,200,318,73,335,91,320,200,335,91,337,193,337,193,335,91,347,106,337,193,347,106,350,181,350,181,347,106,355,120,350,181,355,120,358,166,358,166,355,120,360,134,358,166,360,134,361,148,320,200,313,147,315,135,298,203,275,201,280,173,276,66,276,32,318,73,44,157,41,153,108,135,44,157,108,135,45,164,108,135,18,147,18,135,97,148,108,135,108,147,308,112,318,73,313,125,351,0,225,12,225,0, +359,45,359,74,331,74,331,203,308,203,206,70,206,45,296,45,296,0,331,0,331,45,16383,16383,296,74,229,74,296,163,16383,16383,319,338,296,338,69,-6,94,-6,16383,16383,102,256,114,263,123,271,129,279,131,288,132,296,130,310,122,321,110,330,95,336,78,338,61,336,46,331,33,322,22,309,11,291,23,281,31,293,39,301,47,306,56,309,66,310,76,309,83,306,89,301,93,295,94,286,92,276,87,267,78,259,65,252,46,244,46,230,52,231,59,231,60,232,76,230,88,225,97,216,103,205,105,190,103,179,99,169,92,162,82,157,71,155,66,155,61,156,57,158,52,161,40,169,32,173,28,174,25,175,19,174,14,172,10,169,8,165,7,159,9,150,15,142,25,136,37,132,52,131,83,134,109,144,129,159,141,177,146,200,144,214,139,227,130,239,118,248,102,254,130,208,129,216,125,223,119,229,112,232,103,233,95,232,87,229,82,223,78,217,77,208,78,199,82,192,87,186,95,182,103,180,112,182,119,186,125,192,129,199,130,208,16383,16383,100,147,96,128,91,112,85,97,77,84,68,70,46,42,31,20,22,2,17,-13,15,-30,16,-42,18,-52,22,-62,27,-71,33,-79,45,-89,58,-97,74,-103,90,-107,107,-108,133,-104,155,-94,173,-79,184,-59,188,-35,187,-24,184,-16,179,-10,173,-6,164,-5,157,-5,151,-8,147,-12,144,-18,143,-25,145,-33,147,-37,150,-42,154,-46,160,-54,161,-57,162,-59,162,-62,160,-71,153,-80,142,-87,130,-91,116,-93,98,-90,83,-81,71,-69,64,-52,61,-34,62,-19,64,-4,67,11,72,27,79,44,93,75,101,99,106,118,108,133,108,147,225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458, +206,45,296,45,206,70,206,70,296,45,229,74,206,70,229,74,308,203,308,203,229,74,296,163,308,203,296,163,331,0,331,0,296,163,296,74,331,0,296,74,296,45,296,45,296,74,229,74,308,203,331,0,331,203,331,74,331,45,359,45,331,74,359,45,359,74,296,338,69,-6,94,-6,296,338,94,-6,319,338,66,155,61,156,83,134,83,134,61,156,57,158,83,134,57,158,52,131,52,131,57,158,52,161,52,131,52,161,46,165,56,231,59,231,65,252,65,252,59,231,60,232,60,232,76,230,65,252,65,252,76,230,78,259,65,252,46,244,52,231,65,252,52,231,56,231,23,281,31,293,33,322,33,322,31,293,39,301,33,322,39,301,46,331,46,331,39,301,47,306,46,331,47,306,61,336,61,336,47,306,56,309,61,336,56,309,66,310,66,310,76,309,78,338,78,338,76,309,83,306,78,338,83,306,95,336,95,336,83,306,89,301,95,336,89,301,93,295,22,309,11,291,23,281,22,309,23,281,33,322,103,179,99,169,109,144,109,144,99,169,92,162,109,144,92,162,83,134,83,134,92,162,82,157,83,134,82,157,71,155,71,155,66,155,83,134,95,336,94,286,97,216,95,336,97,216,110,330,110,330,97,216,102,256,110,330,102,256,114,263,78,338,61,336,66,310,130,310,122,321,123,271,130,310,123,271,129,279,130,310,129,279,131,288,130,310,131,288,132,296,122,321,110,330,114,263,122,321,114,263,123,271,102,254,102,256,97,216,102,254,97,216,103,205,102,254,103,205,118,248,92,276,87,267,88,225,92,276,88,225,97,216,92,276,97,216,94,286,78,259,76,230,88,225,78,259,88,225,87,267,141,177,146,200,144,214,141,177,144,214,139,227,141,177,139,227,130,239,141,177,130,239,129,159,103,179,109,144,105,190,105,190,109,144,118,248,118,248,109,144,129,159,118,248,129,159,130,239,105,190,118,248,103,205,40,169,36,171,37,132,40,169,37,132,52,131,40,169,52,131,46,165,37,132,36,171,32,173,37,132,32,173,28,174,37,132,28,174,25,175,37,132,25,175,25,136,19,174,14,172,15,142,19,174,15,142,25,136,19,174,25,136,25,175,10,169,8,165,9,150,10,169,9,150,15,142,10,169,15,142,14,172,52,231,46,244,46,230,9,150,8,165,7,159,95,336,93,295,94,286,331,0,296,45,296,0, +130,208,129,216,125,223,119,229,112,232,103,233,95,232,87,229,82,223,78,217,77,208,78,199,82,192,87,186,95,182,103,180,112,182,119,186,125,192,129,199,130,208,16383,16383,100,147,96,128,91,112,85,97,77,84,68,70,46,42,31,20,22,2,17,-13,15,-30,16,-42,18,-52,22,-62,27,-71,33,-79,45,-89,58,-97,74,-103,90,-107,107,-108,133,-104,155,-94,173,-79,184,-59,188,-35,187,-24,184,-16,179,-10,173,-6,164,-5,157,-5,151,-8,147,-12,144,-18,143,-25,145,-33,147,-37,150,-42,154,-46,160,-54,161,-57,162,-59,162,-62,160,-71,153,-80,142,-87,130,-91,116,-93,98,-90,83,-81,71,-69,64,-52,61,-34,62,-19,64,-4,67,11,72,27,79,44,93,75,101,99,106,118,108,133,108,147,225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,114,454,113,448,114,443,116,439,119,434,123,430,128,426,205,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12, +103,180,112,182,112,232,112,232,112,182,119,186,112,232,119,186,119,229,119,229,119,186,125,192,119,229,125,192,125,223,125,223,125,192,129,199,125,223,129,199,129,216,129,216,129,199,130,208,78,217,78,199,82,223,82,223,78,199,82,192,82,223,82,192,87,229,87,229,82,192,87,186,87,229,87,186,95,232,95,232,87,186,95,182,95,232,95,182,103,233,103,233,95,182,103,180,103,233,103,180,112,232,72,27,79,44,77,84,72,27,77,84,68,70,68,70,46,42,62,-19,62,-19,46,42,61,-34,64,-52,61,-34,58,-97,64,-52,58,-97,74,-103,68,70,62,-19,64,-4,68,70,64,-4,67,11,68,70,67,11,72,27,33,-79,45,-89,46,42,46,42,45,-89,58,-97,46,42,58,-97,61,-34,31,20,22,2,22,-62,31,20,22,-62,27,-71,31,20,27,-71,33,-79,31,20,33,-79,46,42,15,-30,16,-42,17,-13,17,-13,16,-42,18,-52,17,-13,18,-52,22,2,22,2,18,-52,22,-62,108,147,100,147,101,99,108,147,101,99,106,118,108,147,106,118,108,133,96,128,91,112,93,75,96,128,93,75,101,99,96,128,101,99,100,147,85,97,77,84,79,44,85,97,79,44,93,75,85,97,93,75,91,112,160,-71,153,-80,155,-94,155,-94,153,-80,142,-87,155,-94,142,-87,133,-104,133,-104,142,-87,130,-91,133,-104,130,-91,116,-93,116,-93,98,-90,107,-108,107,-108,98,-90,90,-107,83,-81,71,-69,74,-103,83,-81,74,-103,90,-107,83,-81,90,-107,98,-90,147,-37,150,-42,151,-8,151,-8,150,-42,154,-46,151,-8,154,-46,157,-5,157,-5,154,-46,157,-50,157,-5,157,-50,164,-5,164,-5,157,-50,160,-54,164,-5,160,-54,161,-57,143,-25,144,-29,144,-18,144,-18,144,-29,145,-33,144,-18,145,-33,147,-12,147,-12,145,-33,147,-37,147,-12,147,-37,151,-8,173,-6,173,-79,179,-10,179,-10,173,-79,184,-59,179,-10,184,-59,184,-16,184,-16,184,-59,188,-35,184,-16,188,-35,187,-24,155,-94,173,-79,160,-71,160,-71,173,-79,162,-62,164,-5,162,-62,173,-79,164,-5,173,-79,173,-6,116,-93,107,-108,133,-104,164,-5,161,-57,162,-59,164,-5,162,-59,162,-62,64,-52,74,-103,71,-69,78,199,78,217,77,208, +225,378,153,453,148,457,144,460,140,462,132,464,125,463,120,461,117,458,114,454,113,448,114,443,116,439,119,434,123,430,128,426,205,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266, +205,378,225,378,153,453,205,378,153,453,148,457,205,378,148,457,144,460,205,378,144,460,140,462,205,378,140,462,136,463,205,378,136,463,132,464,205,378,132,464,128,426,113,448,114,443,114,454,114,454,114,443,116,439,114,454,116,439,117,458,117,458,116,439,119,434,117,458,119,434,120,461,120,461,119,434,123,430,120,461,123,430,125,463,125,463,123,430,128,426,125,463,128,426,132,464,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0, +138,378,158,378,235,427,245,435,248,439,249,443,250,448,249,454,247,458,243,461,239,463,233,464,228,463,224,462,221,460,216,457,211,453,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,257,378,194,462,163,462,101,378,118,378,179,430,239,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424, +233,464,235,427,239,463,239,463,235,427,240,431,239,463,240,431,243,461,243,461,240,431,245,435,243,461,245,435,247,458,247,458,245,435,248,439,247,458,248,439,249,454,249,454,248,439,249,443,249,454,249,443,250,448,235,427,233,464,228,463,235,427,228,463,224,462,235,427,224,462,221,460,235,427,221,460,216,457,235,427,216,457,211,453,235,427,211,453,158,378,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,158,378,211,453,138,378, +257,378,194,462,163,462,101,378,118,378,179,430,239,378,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,195,426,182,432,175,436,161,440,154,441,147,441,133,439,121,433,111,423,103,409,97,391,112,391,115,399,120,406,125,410,131,413,137,414,141,414,149,412,157,408,169,403,180,398,189,394,196,392,202,391,209,391,224,393,237,399,247,409,255,424,262,444,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20, +101,378,118,378,163,462,163,462,118,378,179,430,163,462,179,430,194,462,194,462,179,430,239,378,194,462,239,378,257,378,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0, +248,444,243,434,238,427,233,422,227,420,221,419,216,419,211,420,206,422,200,424,195,426,182,432,175,436,161,440,154,441,147,441,133,439,121,433,111,423,103,409,97,391,112,391,115,399,120,406,125,410,131,413,137,414,141,414,149,412,157,408,169,403,180,398,189,394,196,392,202,391,209,391,224,393,237,399,247,409,255,424,262,444,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,254,411,253,419,249,426,244,431,237,435,229,436,221,435,214,431,209,426,206,419,204,411,205,403,209,397,214,391,221,388,228,387,236,388,244,391,249,397,253,403,254,411,16383,16383,155,411,153,419,150,426,144,431,137,435,129,436,122,435,115,431,110,426,106,419,105,411,106,403,110,397,115,391,121,388,129,387,137,388,144,391,150,397,153,403,155,411,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128, +115,399,120,406,121,433,121,433,120,406,125,410,121,433,125,410,133,439,133,439,125,410,131,413,133,439,131,413,137,414,137,414,141,414,147,441,147,441,141,414,145,413,147,441,145,413,149,412,112,391,115,399,121,433,112,391,121,433,111,423,112,391,111,423,103,409,112,391,103,409,97,391,147,441,149,412,154,441,154,441,149,412,153,410,154,441,153,410,157,408,157,408,169,403,161,440,161,440,169,403,168,438,147,441,133,439,137,414,161,440,154,441,157,408,168,438,169,403,175,436,175,436,169,403,180,398,175,436,180,398,182,432,182,432,180,398,189,394,182,432,189,394,195,426,195,426,189,394,196,392,195,426,196,392,200,424,200,424,196,392,202,391,200,424,202,391,206,422,206,422,202,391,209,391,206,422,209,391,211,420,211,420,209,391,224,393,211,420,224,393,216,419,216,419,224,393,221,419,227,420,221,419,224,393,227,420,224,393,237,399,248,444,243,434,247,409,248,444,247,409,255,424,248,444,255,424,262,444,238,427,233,422,237,399,238,427,237,399,247,409,238,427,247,409,243,434,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0,227,420,237,399,233,422, +254,411,253,419,249,426,244,431,237,435,229,436,221,435,214,431,209,426,206,419,204,411,205,403,209,397,214,391,221,388,228,387,236,388,244,391,249,397,253,403,254,411,16383,16383,155,411,153,419,150,426,144,431,137,435,129,436,122,435,115,431,110,426,106,419,105,411,106,403,110,397,115,391,121,388,129,387,137,388,144,391,150,397,153,403,155,411,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,229,430,227,446,220,460,209,471,196,478,180,480,164,478,151,471,140,460,133,447,130,431,132,415,139,401,150,391,163,384,179,381,195,384,209,391,220,401,227,415,229,430,16383,16383,213,431,211,420,206,411,199,404,190,400,179,398,169,400,160,404,153,411,148,420,147,431,148,441,153,450,160,457,169,462,179,464,190,462,199,457,206,450,211,441,213,431,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266, +204,411,205,403,206,419,206,419,205,403,209,397,206,419,209,397,209,426,209,426,209,397,214,391,209,426,214,391,214,431,214,431,214,391,221,388,214,431,221,388,221,435,221,435,221,388,228,387,221,435,228,387,229,436,229,436,228,387,236,388,229,436,236,388,237,435,237,435,236,388,244,391,237,435,244,391,244,431,244,431,244,391,249,397,244,431,249,397,249,426,249,426,249,397,253,403,249,426,253,403,253,419,253,419,253,403,254,411,105,411,106,403,106,419,106,419,106,403,110,397,106,419,110,397,110,426,110,426,110,397,115,391,110,426,115,391,115,431,115,431,115,391,121,388,115,431,121,388,122,435,122,435,121,388,129,387,122,435,129,387,129,436,129,436,129,387,137,388,129,436,137,388,137,435,137,435,137,388,144,391,137,435,144,391,144,431,144,431,144,391,150,397,144,431,150,397,150,426,150,426,150,397,153,403,150,426,153,403,153,419,153,419,153,403,155,411,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0, +229,430,227,446,220,460,209,471,196,478,180,480,164,478,151,471,140,460,133,447,130,431,132,415,139,401,150,391,163,384,179,381,195,384,209,391,220,401,227,415,229,430,16383,16383,213,431,211,420,206,411,199,404,190,400,179,398,169,400,160,404,153,411,148,420,147,431,148,441,153,450,160,457,169,462,179,464,190,462,199,457,206,450,211,441,213,431,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,431,84,420,84,404,56,389,37,372,26,349,20,320,19,268,19,257,22,252,26,249,34,248,47,248,165,319,165,337,163,350,158,360,149,366,135,370,114,381,114,381,232,370,232,367,211,359,197,346,189,326,184,300,183,248,183,248,295,249,301,251,306,253,310,257,312,262,313,305,313,341,312,367,308,382,299,392,283,397,261,408,261,408,331,126,331,126,321,143,320,155,318,164,315,169,310,171,305,171,302,170,300,168,294,166,291,44,49,36,33,28,23,21,16,11,12,0,9,0,0,99,0,99,9,87,11,77,13,70,16,66,20,65,24,66,33,71,48,80,68,93,95,111,130,199,130,199,56,198,39,195,27,189,18,179,13,164,11,155,9,155,0,410,0,16383,16383,199,150,120,150,199,309,307,65,285,47,264,32,242,23,220,17, +211,420,206,411,209,391,209,391,206,411,199,404,209,391,199,404,195,384,195,384,199,404,190,400,195,384,190,400,179,381,179,381,190,400,179,398,180,480,179,464,190,462,180,480,190,462,196,478,196,478,190,462,199,457,196,478,199,457,209,471,209,471,199,457,206,450,209,471,206,450,211,441,229,430,227,446,227,415,227,415,227,446,220,460,227,415,220,460,220,401,220,401,220,460,213,431,211,441,213,431,220,460,211,441,220,460,209,471,211,420,209,391,220,401,211,420,220,401,213,431,153,450,160,457,164,478,164,478,160,457,169,462,164,478,169,462,180,480,180,480,169,462,179,464,151,471,140,460,147,431,151,471,147,431,148,441,151,471,148,441,153,450,151,471,153,450,164,478,153,411,148,420,150,391,150,391,148,420,147,431,169,400,160,404,163,384,169,400,163,384,179,381,169,400,179,381,179,398,153,411,150,391,163,384,153,411,163,384,160,404,130,431,132,415,133,447,133,447,132,415,139,401,133,447,139,401,140,460,140,460,139,401,150,391,140,460,150,391,147,431,55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,246,11,242,10,353,0,353,0,242,10,235,10,353,0,235,10,226,9,259,21,258,18,353,0,353,0,258,18,256,16,353,0,256,16,253,14,253,14,250,12,353,0,353,0,250,12,246,11,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,23,259,21,353,0,260,23,353,0,261,26,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58,353,0,226,9,226,0, +431,84,420,84,404,56,389,37,372,26,349,20,320,19,268,19,257,22,252,26,249,34,248,47,248,165,319,165,337,163,350,158,360,149,366,135,370,114,381,114,381,232,370,232,367,211,359,197,346,189,326,184,300,183,248,183,248,295,249,301,251,306,253,310,257,312,262,313,305,313,341,312,367,308,382,299,392,283,397,261,408,261,408,331,126,331,126,321,143,320,155,318,164,315,169,310,171,305,171,302,170,300,168,294,166,291,44,49,36,33,28,23,21,16,11,12,0,9,0,0,99,0,99,9,87,11,77,13,70,16,66,20,65,24,66,33,71,48,80,68,93,95,111,130,199,130,199,56,198,39,195,27,189,18,179,13,164,11,155,9,155,0,410,0,16383,16383,199,150,120,150,199,309,307,65,285,47,264,32,242,23,220,17,196,15,175,17,155,21,137,29,120,40,105,54,93,72,84,94,77,118,73,145,72,173,77,222,93,262,118,292,151,311,191,318,221,313,249,300,272,280,289,255,299,225,310,225,305,338,295,338,293,332,285,324,280,322,275,321,271,322,268,322,263,323,259,325,254,326,240,330,225,334,210,336,196,338,181,338,160,337,140,333,120,327,101,319,84,308,59,287,40,262,25,233,17,200,14,165,16,135,21,107,30,82,43,60,58,41,73,27,90,15,109,6,129,0,151,-4,132,-49,136,-51,139,-50,141,-50,144,-49,150,-49,160,-50,168,-52,173,-55,175,-60,176,-67,175,-74,172,-81,166,-85,158,-88,149,-89,143,-89,131,-87,124,-86,117,-83,109,-98,118,-102,134,-106, +87,11,77,13,99,0,99,0,77,13,70,16,99,0,70,16,36,33,36,33,70,16,66,20,36,33,66,20,44,49,44,49,66,20,65,24,71,48,80,68,166,291,166,291,80,68,93,95,166,291,93,95,111,130,111,130,199,130,120,150,120,150,199,130,199,150,195,27,189,18,410,0,410,0,189,18,179,13,410,0,179,13,164,11,166,291,111,130,120,150,166,291,120,150,199,309,166,291,199,309,168,294,262,313,408,331,199,309,199,309,408,331,169,310,199,309,169,310,171,305,171,305,171,302,199,309,199,309,171,302,170,300,199,309,170,300,169,297,360,149,366,135,367,211,367,211,366,135,370,114,367,211,370,114,370,232,370,232,370,114,381,114,370,232,381,114,381,232,300,183,319,165,326,184,326,184,319,165,337,163,326,184,337,163,346,189,346,189,337,163,350,158,346,189,350,158,359,197,359,197,350,158,360,149,359,197,360,149,367,211,199,309,249,34,248,47,248,183,248,165,319,165,248,183,319,165,300,183,408,331,262,313,305,313,408,331,305,313,341,312,408,331,341,312,367,308,408,331,367,308,382,299,408,331,382,299,392,283,408,331,392,283,397,261,408,331,397,261,408,261,199,309,248,47,248,295,199,309,248,295,249,301,199,309,249,301,251,306,199,309,251,306,253,310,199,309,253,310,257,312,199,309,257,312,262,313,408,331,126,331,143,320,408,331,143,320,155,318,408,331,155,318,164,315,408,331,164,315,169,310,389,37,372,26,410,0,410,0,372,26,349,20,410,0,349,20,320,19,410,0,431,84,420,84,410,0,420,84,404,56,410,0,404,56,389,37,199,56,198,39,257,22,257,22,198,39,195,27,257,22,195,27,268,19,268,19,195,27,410,0,268,19,410,0,283,19,283,19,410,0,320,19,199,150,199,130,252,26,199,150,252,26,249,34,199,150,249,34,199,309,199,56,257,22,252,26,199,56,252,26,199,130,155,9,155,0,410,0,155,9,410,0,164,11,44,49,65,24,66,33,44,49,66,33,71,48,44,49,71,48,166,291,99,0,36,33,28,23,99,0,28,23,21,16,99,0,21,16,11,12,99,0,11,12,0,9,99,0,0,9,0,0,87,11,99,0,99,9,168,294,199,309,169,297,143,320,126,331,126,321, +307,65,285,47,264,32,242,23,220,17,196,15,175,17,155,21,137,29,120,40,105,54,93,72,84,94,77,118,73,145,72,173,77,222,93,262,118,292,151,311,191,318,221,313,249,300,272,280,289,255,299,225,310,225,305,338,295,338,293,332,285,324,280,322,275,321,271,322,268,322,263,323,259,325,254,326,240,330,225,334,210,336,196,338,181,338,160,337,140,333,120,327,101,319,84,308,59,287,40,262,25,233,17,200,14,165,16,135,21,107,30,82,43,60,58,41,73,27,90,15,109,6,129,0,151,-4,132,-49,136,-51,139,-50,141,-50,144,-49,150,-49,160,-50,168,-52,173,-55,175,-60,176,-67,175,-74,172,-81,166,-85,158,-88,149,-89,143,-89,131,-87,124,-86,117,-83,109,-98,118,-102,134,-106,142,-106,151,-107,173,-105,190,-99,203,-91,211,-79,214,-64,212,-52,206,-43,198,-36,186,-32,171,-30,163,-30,161,-31,158,-31,168,-6,180,-6,213,-4,244,3,272,16,297,34,316,56,201,378,128,453,124,457,119,460,115,462,107,464,101,463,96,461,92,458,90,454,89,448,89,443,91,439,94,434,104,426,181,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158, +84,94,77,118,90,15,90,15,77,118,73,145,90,15,73,145,73,27,73,27,73,145,72,173,59,287,72,173,84,308,158,-31,175,17,155,21,158,-31,155,21,151,-4,151,-4,155,21,137,29,151,-4,137,29,129,0,129,0,137,29,120,40,129,0,120,40,109,6,109,6,120,40,105,54,142,-106,151,-107,143,-89,143,-89,151,-107,149,-89,158,-88,149,-89,151,-107,158,-88,151,-107,173,-105,141,-50,144,-49,151,-4,151,-4,144,-49,147,-49,151,-4,147,-49,150,-49,150,-49,160,-50,151,-4,151,-4,132,-49,136,-51,151,-4,136,-51,139,-50,151,-4,139,-50,141,-50,196,15,178,-6,180,-6,196,15,180,-6,213,-4,196,15,175,17,175,-6,196,15,175,-6,178,-6,175,17,158,-31,168,-6,175,17,168,-6,171,-6,175,17,171,-6,173,-6,175,17,173,-6,175,-6,316,56,307,65,297,34,297,34,307,65,285,47,297,34,285,47,272,16,272,16,285,47,264,32,272,16,264,32,244,3,244,3,264,32,242,23,244,3,242,23,220,17,220,17,196,15,213,-4,220,17,213,-4,244,3,191,318,181,338,160,337,191,318,160,337,151,311,191,318,196,338,181,338,72,173,77,222,84,308,84,308,77,222,93,262,84,308,93,262,101,319,101,319,93,262,118,292,101,319,118,292,120,327,120,327,118,292,151,311,120,327,151,311,140,333,140,333,151,311,160,337,210,336,221,313,225,334,225,334,221,313,249,300,225,334,249,300,240,330,240,330,249,300,254,326,221,313,210,336,196,338,221,313,196,338,191,318,289,328,285,324,289,255,289,255,285,324,280,322,289,255,280,322,275,321,275,321,271,322,272,280,272,280,271,322,268,322,272,280,268,322,263,323,272,280,263,323,259,325,272,280,259,325,254,326,272,280,254,326,249,300,299,225,310,225,305,338,299,225,305,338,295,338,299,225,295,338,293,332,299,225,293,332,289,255,275,321,272,280,289,255,214,-64,212,-52,211,-79,211,-79,212,-52,206,-43,211,-79,206,-43,203,-91,203,-91,206,-43,198,-36,203,-91,198,-36,190,-99,190,-99,198,-36,186,-32,190,-99,186,-32,176,-67,176,-67,186,-32,175,-60,173,-55,175,-60,186,-32,173,-55,186,-32,171,-30,173,-55,171,-30,168,-30,173,-55,168,-30,168,-52,168,-52,168,-30,166,-30,168,-52,166,-30,163,-30,168,-52,163,-30,161,-31,168,-52,161,-31,160,-50,158,-31,151,-4,160,-50,158,-31,160,-50,161,-31,190,-99,176,-67,175,-74,190,-99,175,-74,173,-105,173,-105,175,-74,172,-81,173,-105,172,-81,166,-85,117,-83,118,-102,124,-86,124,-86,118,-102,126,-104,124,-86,126,-104,131,-87,131,-87,126,-104,134,-106,131,-87,134,-106,137,-88,137,-88,134,-106,142,-106,137,-88,142,-106,143,-89,93,72,84,94,90,15,93,72,90,15,109,6,93,72,109,6,105,54,59,287,40,262,43,60,59,287,43,60,58,41,59,287,58,41,73,27,59,287,73,27,72,173,14,165,16,135,17,200,17,200,16,135,21,107,17,200,21,107,25,233,25,233,21,107,30,82,25,233,30,82,40,262,40,262,30,82,43,60,118,-102,117,-83,109,-98,158,-88,173,-105,166,-85,289,328,289,255,293,332, +201,378,128,453,124,457,119,460,115,462,107,464,101,463,96,461,92,458,90,454,89,448,89,443,91,439,94,434,104,426,181,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0, +181,378,201,378,128,453,181,378,128,453,124,457,181,378,124,457,119,460,181,378,119,460,115,462,181,378,115,462,111,463,181,378,111,463,107,464,181,378,107,464,104,426,89,448,89,443,90,454,90,454,89,443,91,439,90,454,91,439,92,458,92,458,91,439,94,434,92,458,94,434,96,461,96,461,94,434,99,430,96,461,99,430,101,463,101,463,99,430,104,426,101,463,104,426,107,464,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232, +123,378,142,378,219,427,225,431,229,435,232,439,234,443,234,454,231,458,228,461,223,463,217,464,209,462,205,460,201,457,196,453,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,242,378,179,462,148,462,86,378,103,378,164,430,224,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426, +217,464,219,427,223,463,223,463,219,427,225,431,223,463,225,431,228,461,228,461,225,431,229,435,228,461,229,435,231,458,231,458,229,435,232,439,231,458,232,439,234,454,234,454,232,439,234,443,234,454,234,443,234,448,219,427,217,464,213,463,219,427,213,463,209,462,219,427,209,462,205,460,219,427,205,460,201,457,219,427,201,457,196,453,219,427,196,453,142,378,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232,142,378,196,453,123,378, +242,378,179,462,148,462,86,378,103,378,164,430,224,378,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,189,419,188,411,189,403,193,397,198,391,204,388,212,387,220,388,227,391,233,397,236,403,238,411,16383,16383,138,411,137,419,133,426,128,431,121,435,113,436,105,435,98,431,93,426,90,419,89,411,90,403,93,397,98,391,105,388,113,387,121,388,128,391,133,397,137,403,138,411,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115, +86,378,103,378,148,462,148,462,103,378,164,430,148,462,164,430,179,462,179,462,164,430,224,378,179,462,224,378,242,378,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232, +238,411,236,419,233,426,227,431,220,435,213,436,205,435,198,431,193,426,189,419,188,411,189,403,193,397,198,391,204,388,212,387,220,388,227,391,233,397,236,403,238,411,16383,16383,138,411,137,419,133,426,128,431,121,435,113,436,105,435,98,431,93,426,90,419,89,411,90,403,93,397,98,391,105,388,113,387,121,388,128,391,133,397,137,403,138,411,16383,16383,299,84,285,84,271,57,255,38,234,26,206,20,169,18,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,184,312,213,311,234,306,247,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,134,378,62,453,57,457,53,460,49,462,41,464,35,463,29,461,26,458,23,454,22,448,23,443,25,439,28,434,32,430,37,426,114,378,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11, +113,436,113,387,121,435,121,435,113,387,121,388,121,435,121,388,128,431,128,431,121,388,128,391,128,431,128,391,133,426,133,426,128,391,133,397,133,426,133,397,137,419,137,419,133,397,137,403,137,419,137,403,138,411,89,411,90,403,90,419,90,419,90,403,93,397,90,419,93,397,93,426,93,426,93,397,98,391,93,426,98,391,98,431,98,431,98,391,105,388,98,431,105,388,105,435,105,435,105,388,113,387,105,435,113,387,113,436,45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,49,294,50,275,106,310,49,294,106,310,45,307,45,307,106,310,111,312,45,307,111,312,271,331,271,331,111,312,118,312,188,411,189,403,189,419,189,419,189,403,193,397,189,419,193,397,193,426,193,426,193,397,198,391,193,426,198,391,198,431,198,431,198,391,204,388,198,431,204,388,205,435,205,435,204,388,212,387,205,435,212,387,213,436,213,436,212,387,220,388,213,436,220,388,220,435,220,435,220,388,227,391,220,435,227,391,227,431,227,431,227,391,233,397,227,431,233,397,233,426,233,426,233,397,236,403,233,426,236,403,236,419,236,419,236,403,238,411,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,271,331,118,312,184,312,271,331,184,312,213,311,271,331,213,311,234,306,271,331,234,306,247,297,271,331,247,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,271,331,6,331,25,320,271,331,25,320,38,315,271,331,38,315,45,307,255,38,234,26,276,0,276,0,234,26,206,20,276,0,206,20,169,18,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,255,38,276,0,169,18,151,18,276,0,151,18,132,19,276,0,132,19,117,21,276,0,117,21,45,24,276,0,6,9,6,0,25,320,6,331,6,321,176,184,176,164,198,162,233,232,244,115,244,232, +134,378,62,453,57,457,53,460,49,462,41,464,35,463,29,461,26,458,23,454,22,448,23,443,25,439,28,434,32,430,37,426,114,378,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0, +114,378,134,378,62,453,114,378,62,453,57,457,114,378,57,457,53,460,114,378,53,460,49,462,114,378,49,462,45,463,114,378,45,463,41,464,114,378,41,464,37,426,22,448,23,443,23,454,23,454,23,443,25,439,23,454,25,439,26,458,26,458,25,439,28,434,26,458,28,434,29,461,29,461,28,434,32,430,29,461,32,430,35,463,35,463,32,430,37,426,35,463,37,426,41,464,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321, +32,378,52,378,129,427,139,435,142,439,143,443,144,448,143,454,141,458,137,461,133,463,127,464,122,463,118,462,115,460,110,457,105,453,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,119,16,110,24,106,37,104,56,104,276,105,295,110,308,118,316,132,320,153,321,153,331,5,331,5,321,26,320,40,316,49,308,53,295,54,276,54,56,53,36,49,23,40,15,26,11,5,9,5,0,157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426, +127,464,129,427,133,463,133,463,129,427,134,431,133,463,134,431,137,461,137,461,134,431,139,435,137,461,139,435,141,458,141,458,139,435,142,439,141,458,142,439,143,454,143,454,142,439,143,443,143,454,143,443,144,448,129,427,127,464,122,463,129,427,122,463,118,462,129,427,118,462,115,460,129,427,115,460,110,457,129,427,110,457,105,453,129,427,105,453,52,378,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321,52,378,105,453,32,378, +161,378,98,462,67,462,5,378,22,378,83,430,143,378,16383,16383,153,0,153,9,133,11,119,16,110,24,106,37,104,56,104,276,105,295,110,308,118,316,132,320,153,321,153,331,5,331,5,321,26,320,40,316,49,308,53,295,54,276,54,56,53,36,49,23,40,15,26,11,5,9,5,0,157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,109,419,108,411,109,403,113,397,118,391,124,388,132,387,140,388,147,391,153,397,156,403,157,411,16383,16383,58,411,57,419,53,426,48,431,41,435,33,436,25,435,18,431,13,426,10,419,8,411,10,403,13,397,18,391, +5,378,22,378,67,462,67,462,22,378,83,430,67,462,83,430,98,462,98,462,83,430,143,378,98,462,143,378,161,378,49,23,40,15,153,0,153,0,40,15,26,11,153,0,26,11,5,9,153,331,5,331,26,320,153,331,26,320,40,316,153,331,40,316,49,308,153,331,49,308,53,295,153,331,53,295,118,316,153,331,118,316,132,320,153,331,132,320,153,321,119,16,110,24,54,56,54,56,110,24,106,37,54,56,106,37,54,276,54,276,106,37,104,56,54,276,104,56,104,276,54,276,104,276,105,295,54,276,105,295,110,308,54,276,110,308,118,316,54,276,118,316,53,295,153,0,153,9,133,11,153,0,133,11,119,16,153,0,119,16,53,36,153,0,53,36,49,23,153,0,5,9,5,0,53,36,119,16,54,56,26,320,5,331,5,321, +157,411,156,419,153,426,147,431,140,435,132,436,125,435,118,431,113,426,109,419,108,411,109,403,113,397,118,391,124,388,132,387,140,388,147,391,153,397,156,403,157,411,16383,16383,58,411,57,419,53,426,48,431,41,435,33,436,25,435,18,431,13,426,10,419,8,411,10,403,13,397,18,391,25,388,32,387,40,388,47,391,53,397,57,403,58,411,16383,16383,157,0,157,9,136,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,8,331,8,321,30,320,44,316,52,308,56,295,57,276,57,56,56,36,52,23,44,15,29,11,8,9,8,0,8,331,8,321,28,319,40,315,48,307,51,295,52,276,52,180,11,180,11,157,52,157,52,55,51,36,47,24,40,16,27,12,8,9,8,0,150,0,183,2,213,7,242,16,267,27,287,41,307,60,322,83,333,109,340,137,343,167,334,224,308,269,267,303,212,324,143,331,16383,16383,103,157,176,157,176,180,103,180,103,293,104,301,106,307,111,310,117,312,127,313,152,312,175,309,194,304,212,297,227,289,249,271,266,249,278,224,285,195,288,164,285,130,278,101,266,76,249,55,227,39,211,31,194,26,175,22,153,19,128,18,118,19,111,21,106,25,104,31,103,39,244,444,240,434, +8,411,10,403,10,419,10,419,10,403,13,397,10,419,13,397,13,426,13,426,13,397,18,391,13,426,18,391,18,431,18,431,18,391,25,388,18,431,25,388,25,435,25,435,25,388,32,387,25,435,32,387,33,436,33,436,32,387,40,388,33,436,40,388,41,435,41,435,40,388,47,391,41,435,47,391,48,431,48,431,47,391,53,397,48,431,53,397,53,426,53,426,53,397,57,403,53,426,57,403,57,419,57,419,57,403,58,411,52,23,44,15,157,0,157,0,44,15,29,11,157,0,29,11,8,9,157,331,8,331,30,320,157,331,30,320,44,316,157,331,44,316,52,308,157,331,52,308,56,295,157,331,56,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,56,295,132,436,132,387,140,435,140,435,132,387,140,388,140,435,140,388,147,431,147,431,140,388,147,391,147,431,147,391,153,426,153,426,147,391,153,397,153,426,153,397,156,419,156,419,153,397,156,403,156,419,156,403,157,411,108,411,109,403,109,419,109,419,109,403,113,397,109,419,113,397,113,426,113,426,113,397,118,391,113,426,118,391,118,431,118,431,118,391,124,388,118,431,124,388,125,435,125,435,124,388,132,387,125,435,132,387,132,436,157,0,157,9,136,11,157,0,136,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,8,9,8,0,56,36,122,16,57,56,30,320,8,331,8,321, +8,331,8,321,28,319,40,315,48,307,51,295,52,276,52,180,11,180,11,157,52,157,52,55,51,36,47,24,40,16,27,12,8,9,8,0,150,0,183,2,213,7,242,16,267,27,287,41,307,60,322,83,333,109,340,137,343,167,334,224,308,269,267,303,212,324,143,331,16383,16383,103,157,176,157,176,180,103,180,103,293,104,301,106,307,111,310,117,312,127,313,152,312,175,309,194,304,212,297,227,289,249,271,266,249,278,224,285,195,288,164,285,130,278,101,266,76,249,55,227,39,211,31,194,26,175,22,153,19,128,18,118,19,111,21,106,25,104,31,103,39,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9, +47,24,40,16,150,0,150,0,40,16,27,12,150,0,27,12,8,9,40,315,48,307,143,331,143,331,48,307,51,295,143,331,51,295,52,276,104,31,52,276,52,180,104,31,52,180,52,157,52,157,52,180,11,180,52,157,11,180,11,157,104,301,106,307,52,276,52,276,106,307,111,310,52,276,111,310,143,331,143,331,111,310,117,312,143,331,117,312,127,313,127,313,117,312,127,312,127,313,127,312,152,312,127,313,152,312,143,331,143,331,152,312,212,324,175,22,183,2,194,26,194,26,183,2,213,7,194,26,213,7,211,31,211,31,213,7,227,39,249,55,227,39,242,16,249,55,242,16,267,27,128,18,150,0,153,19,153,19,150,0,183,2,153,19,183,2,175,22,175,309,194,304,212,324,212,324,194,304,212,297,212,324,212,297,227,289,227,289,249,271,267,303,267,303,249,271,266,249,267,303,266,249,278,224,334,224,308,269,322,83,334,224,322,83,333,109,334,224,333,109,340,137,334,224,340,137,343,167,322,83,308,269,307,60,307,60,308,269,288,164,287,41,288,164,285,130,287,41,285,130,278,101,267,303,278,224,308,269,308,269,278,224,285,195,308,269,285,195,288,164,267,303,212,324,227,289,267,27,287,41,278,101,267,27,278,101,266,76,267,27,266,76,249,55,227,39,213,7,242,16,52,276,104,31,103,39,103,180,103,157,176,157,103,180,176,157,176,180,103,293,104,301,52,276,103,293,52,276,103,39,143,331,8,331,28,319,143,331,28,319,40,315,52,55,51,36,111,21,111,21,51,36,150,0,111,21,150,0,118,19,118,19,150,0,128,18,52,55,111,21,106,25,52,55,106,25,104,31,52,55,104,31,52,157,150,0,8,9,8,0,47,24,150,0,51,36,28,319,8,331,8,321,288,164,287,41,307,60,212,324,152,312,175,309, +244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,225,378,152,453,148,457,143,460,139,462,131,464,125,463,120,461,116,458,114,454,113,448,113,443,115,439,118,434,128,426,205,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448, +112,399,116,406,118,433,118,433,116,406,122,410,118,433,122,410,130,439,130,439,122,410,128,413,130,439,128,413,134,414,134,414,138,414,145,441,145,441,138,414,142,413,145,441,142,413,146,412,108,391,112,399,118,433,108,391,118,433,108,423,108,391,108,423,100,409,108,391,100,409,94,391,145,441,146,412,151,441,151,441,146,412,150,410,151,441,150,410,155,408,155,408,166,403,158,440,158,440,166,403,165,438,145,441,130,439,134,414,158,440,151,441,155,408,165,438,166,403,172,436,172,436,166,403,177,398,172,436,177,398,180,432,180,432,177,398,185,394,180,432,185,394,191,426,191,426,185,394,193,392,191,426,193,392,197,424,197,424,193,392,200,391,197,424,200,391,203,422,203,422,200,391,206,391,203,422,206,391,208,420,208,420,206,391,221,393,208,420,221,393,213,419,213,419,221,393,218,419,224,420,218,419,221,393,224,420,221,393,234,399,244,444,240,434,244,409,244,444,244,409,252,424,244,444,252,424,259,444,235,427,230,422,234,399,235,427,234,399,244,409,235,427,244,409,240,434,49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299,224,420,234,399,230,422, +225,378,152,453,148,457,143,460,139,462,131,464,125,463,120,461,116,458,114,454,113,448,113,443,115,439,118,434,128,426,205,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,241,454,239,458,235,461,230,463,224,464,216,462,212,460,208,457,203,453,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201, +205,378,225,378,152,453,205,378,152,453,148,457,205,378,148,457,143,460,205,378,143,460,139,462,205,378,139,462,135,463,205,378,135,463,131,464,205,378,131,464,128,426,113,448,113,443,114,454,114,454,113,443,115,439,114,454,115,439,116,458,116,458,115,439,118,434,116,458,118,434,120,461,120,461,118,434,123,430,120,461,123,430,125,463,125,463,123,430,128,426,125,463,128,426,131,464,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19, +129,378,150,378,227,427,232,431,236,435,239,439,241,443,242,448,241,454,239,458,235,461,230,463,224,464,216,462,212,460,208,457,203,453,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,255,378,193,462,161,462,99,378,117,378,177,430,238,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426, +149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,224,464,227,427,230,463,230,463,227,427,232,431,230,463,232,431,235,461,235,461,232,431,236,435,235,461,236,435,239,458,239,458,236,435,239,439,239,458,239,439,241,454,241,454,239,439,241,443,241,454,241,443,242,448,227,427,224,464,220,463,227,427,220,463,216,462,227,427,216,462,212,460,227,427,212,460,208,457,227,427,208,457,203,453,227,427,203,453,150,378,81,24,74,166,46,61,150,378,203,453,129,378,223,19,234,1,235,26,130,25,180,-6,142,19, +255,378,193,462,161,462,99,378,117,378,177,430,238,378,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19, +99,378,117,378,161,462,161,462,117,378,177,430,161,462,177,430,193,462,193,462,177,430,238,378,193,462,238,378,255,378,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19, +244,444,240,434,235,427,230,422,224,420,218,419,213,419,208,420,203,422,191,426,180,432,172,436,158,440,151,441,145,441,130,439,118,433,108,423,100,409,94,391,108,391,112,399,116,406,122,410,128,413,134,414,138,414,146,412,150,410,155,408,177,398,185,394,193,392,200,391,206,391,221,393,234,399,244,409,252,424,259,444,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257, +112,399,116,406,118,433,118,433,116,406,122,410,118,433,122,410,130,439,130,439,122,410,128,413,130,439,128,413,134,414,134,414,138,414,145,441,145,441,138,414,142,413,145,441,142,413,146,412,108,391,112,399,118,433,108,391,118,433,108,423,108,391,108,423,100,409,108,391,100,409,94,391,145,441,146,412,151,441,151,441,146,412,150,410,151,441,150,410,155,408,155,408,166,403,158,440,158,440,166,403,165,438,145,441,130,439,134,414,158,440,151,441,155,408,165,438,166,403,172,436,172,436,166,403,177,398,172,436,177,398,180,432,180,432,177,398,185,394,180,432,185,394,191,426,191,426,185,394,193,392,191,426,193,392,197,424,197,424,193,392,200,391,197,424,200,391,203,422,203,422,200,391,206,391,203,422,206,391,208,420,208,420,206,391,221,393,208,420,221,393,213,419,213,419,221,393,218,419,224,420,218,419,221,393,224,420,221,393,234,399,244,444,240,434,244,409,244,444,244,409,252,424,244,444,252,424,259,444,235,427,230,422,234,399,235,427,234,399,244,409,235,427,244,409,240,434,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19,224,420,234,399,230,422, +252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,299,11,184,126,299,242,276,265,160,150,45,265,22,242,137,126,22,11,45,-11,160,103,276,-11,329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,17,165,18,147,20,129,24,111,30,94,36,79,48,59,55,50,75,30,28,-39,52,-39,92,18,110,8,127,1,143,-3,161,-5,180,-6,234,1,279,24,314,61,336,109,344,166,343,184,340,203,336,220,331,237,325,252,319,263,313,272,305,281,296,291,285,302,16383,16383,97,61,88,80,82,99,77,119,75,141,74,165,79,218,93,261,115,293,144,313,180,320,196,319,211,315,225,309,238,300,251,287,16383,16383,263,270,272,251,279,232,284,212,286,190,287,165,282,113,268,70,246,38,217,18,180,11,164,12,149,16,135,22,122,32,109,44,227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426, +103,411,104,403,104,419,104,419,104,403,107,397,104,419,107,397,107,426,107,426,107,397,112,391,107,426,112,391,113,431,113,431,112,391,119,388,113,431,119,388,119,435,119,435,119,388,127,387,119,435,127,387,127,436,127,436,127,387,135,388,127,436,135,388,135,435,135,435,135,388,142,391,135,435,142,391,142,431,142,431,142,391,147,397,142,431,147,397,147,426,147,426,147,397,151,403,147,426,151,403,151,419,151,419,151,403,152,411,149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,202,411,203,403,203,419,203,419,203,403,207,397,203,419,207,397,207,426,207,426,207,397,212,391,207,426,212,391,212,431,212,431,212,391,218,388,212,431,218,388,219,435,219,435,218,388,226,387,219,435,226,387,227,436,227,436,226,387,234,388,227,436,234,388,234,435,234,435,234,388,241,391,234,435,241,391,241,431,241,431,241,391,247,397,241,431,247,397,247,426,247,426,247,397,250,403,247,426,250,403,250,419,250,419,250,403,252,411,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19, +299,11,184,126,299,242,276,265,160,150,45,265,22,242,137,126,22,11,45,-11,160,103,276,-11,329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222, +184,126,299,242,276,265,184,126,276,265,160,150,184,126,160,150,276,-11,184,126,276,-11,299,11,22,11,45,-11,137,126,137,126,45,-11,160,103,137,126,160,103,160,150,160,150,160,103,276,-11,45,265,22,242,137,126,45,265,137,126,160,150, +329,367,305,367,268,314,250,323,233,330,217,335,200,337,181,338,127,330,81,307,47,270,25,222,17,165,18,147,20,129,24,111,30,94,36,79,48,59,55,50,75,30,28,-39,52,-39,92,18,110,8,127,1,143,-3,161,-5,180,-6,234,1,279,24,314,61,336,109,344,166,343,184,340,203,336,220,331,237,325,252,319,263,313,272,305,281,296,291,285,302,16383,16383,97,61,88,80,82,99,77,119,75,141,74,165,79,218,93,261,115,293,144,313,180,320,196,319,211,315,225,309,238,300,251,287,16383,16383,263,270,272,251,279,232,284,212,286,190,287,165,282,113,268,70,246,38,217,18,180,11,164,12,149,16,135,22,122,32,109,44,227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,206,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45, +48,59,55,50,81,307,81,307,55,50,64,41,81,307,64,41,74,165,74,165,75,30,75,141,75,141,75,30,77,119,282,113,268,70,279,24,279,24,268,70,246,38,279,24,246,38,234,1,234,1,246,38,217,18,234,1,217,18,180,11,180,11,164,12,180,-6,180,-6,164,12,161,-5,88,80,92,18,97,61,97,61,92,18,110,8,97,61,110,8,109,44,109,44,110,8,122,32,122,32,110,8,127,1,122,32,127,1,135,22,135,22,127,1,143,-3,135,22,143,-3,149,16,149,16,143,-3,161,-5,149,16,161,-5,164,12,92,18,88,80,82,99,92,18,82,99,77,119,92,18,77,119,75,30,92,18,75,30,52,-39,75,30,28,-39,52,-39,109,44,263,270,251,287,251,287,268,314,250,323,251,287,250,323,238,300,238,300,250,323,233,330,238,300,233,330,225,309,225,309,233,330,217,335,225,309,217,335,211,315,211,315,217,335,200,337,211,315,200,337,196,319,196,319,200,337,181,338,196,319,181,338,180,320,343,184,340,203,344,166,344,166,340,203,336,220,344,166,336,220,336,109,336,109,336,220,331,237,336,109,331,237,325,252,319,263,313,272,314,61,319,263,314,61,336,109,319,263,336,109,325,252,279,24,314,61,282,113,282,113,314,61,287,165,296,291,287,165,314,61,296,291,314,61,305,281,305,281,314,61,313,272,180,11,180,-6,234,1,263,270,272,251,268,314,268,314,272,251,285,302,268,314,285,302,305,367,305,367,285,302,329,367,285,302,272,251,279,232,285,302,279,232,284,212,285,302,284,212,286,190,285,302,286,190,296,291,251,287,97,61,109,44,93,261,115,293,127,330,127,330,115,293,144,313,127,330,144,313,181,338,181,338,144,313,180,320,81,307,74,165,79,218,81,307,79,218,93,261,81,307,93,261,127,330,47,270,25,222,30,94,47,270,30,94,36,79,47,270,36,79,42,69,47,270,42,69,48,59,47,270,48,59,81,307,25,222,17,165,18,147,25,222,18,147,20,129,25,222,20,129,24,111,25,222,24,111,30,94,296,291,286,190,287,165,268,314,251,287,263,270,75,30,74,165,64,41, +227,378,154,453,149,457,145,460,141,462,137,463,132,464,126,463,121,461,118,458,115,454,114,448,115,443,117,439,120,434,124,430,129,426,206,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,132,378,152,378,229,427,234,431,238,435,241,439,243,443,244,448,243,454,241,458,237,461,233,463,227,464,222,463,218,462,214,460,210,457,205,453,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321, +206,378,227,378,154,453,206,378,154,453,149,457,206,378,149,457,145,460,206,378,145,460,141,462,206,378,141,462,137,463,206,378,137,463,132,464,206,378,132,464,129,426,114,448,115,443,115,454,115,454,115,443,117,439,115,454,117,439,118,458,118,458,117,439,120,434,118,458,120,434,121,461,121,461,120,434,124,430,121,461,124,430,126,463,126,463,124,430,129,426,126,463,129,426,132,464,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20, +132,378,152,378,229,427,234,431,238,435,241,439,243,443,244,448,243,454,241,458,237,461,233,463,227,464,222,463,218,462,214,460,210,457,205,453,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,256,378,193,462,162,462,100,378,117,378,177,430,238,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411, +105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,227,464,229,427,233,463,233,463,229,427,234,431,233,463,234,431,237,461,237,461,234,431,238,435,237,461,238,435,241,458,241,458,238,435,241,439,241,458,241,439,243,454,243,454,241,439,243,443,243,454,243,443,244,448,229,427,227,464,222,463,229,427,222,463,218,462,229,427,218,462,214,460,229,427,214,460,210,457,229,427,210,457,205,453,229,427,205,453,152,378,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20,152,378,205,453,132,378, +256,378,193,462,162,462,100,378,117,378,177,430,238,378,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314, +100,378,117,378,162,462,162,462,117,378,177,430,162,462,177,430,193,462,193,462,177,430,238,378,193,462,238,378,256,378,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20, +252,411,250,419,247,426,241,431,234,435,227,436,219,435,212,431,207,426,203,419,202,411,203,403,207,397,212,391,218,388,226,387,234,388,241,391,247,397,250,403,252,411,16383,16383,152,411,151,419,147,426,142,431,135,435,127,436,119,435,113,431,107,426,104,419,103,411,104,403,107,397,112,391,119,388,127,387,135,388,142,391,147,397,151,403,152,411,16383,16383,353,331,237,331,237,321,257,319,270,312,279,301,282,283,283,257,283,103,282,85,279,70,273,57,265,45,254,34,241,26,225,20,208,16,189,15,173,16,158,19,146,24,135,30,125,37,115,50,109,63,105,79,104,97,103,118,103,275,104,293,108,306,115,314,128,319,148,321,148,331,7,331,7,321,27,319,40,315,47,308,51,297,52,280,52,124,53,95,58,69,66,48,78,30,93,16,106,8,121,1,138,-3,157,-5,177,-6,204,-5,227,0,247,6,264,17,278,30,290,45,297,62,302,81,305,104,305,258,306,282,310,300,318,311,331,318,353,321,133,378,153,378,230,427,240,435,243,439,244,443,245,448,244,454,242,458,238,461,234,463,228,464,223,463,219,462,216,460,211,457,206,453,16383,16383,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90, +202,411,203,403,203,419,203,419,203,403,207,397,203,419,207,397,207,426,207,426,207,397,212,391,207,426,212,391,212,431,212,431,212,391,218,388,212,431,218,388,219,435,219,435,218,388,226,387,219,435,226,387,227,436,227,436,226,387,234,388,227,436,234,388,234,435,234,435,234,388,241,391,234,435,241,391,241,431,241,431,241,391,247,397,241,431,247,397,247,426,247,426,247,397,250,403,247,426,250,403,250,419,250,419,250,403,252,411,103,411,104,403,104,419,104,419,104,403,107,397,104,419,107,397,107,426,107,426,107,397,112,391,107,426,112,391,113,431,113,431,112,391,119,388,113,431,119,388,119,435,119,435,119,388,127,387,119,435,127,387,127,436,127,436,127,387,135,388,127,436,135,388,135,435,135,435,135,388,142,391,135,435,142,391,142,431,142,431,142,391,147,397,142,431,147,397,147,426,147,426,147,397,151,403,147,426,151,403,151,419,151,419,151,403,152,411,105,79,106,8,109,63,109,63,106,8,121,1,109,63,121,1,115,50,115,50,121,1,125,37,135,30,125,37,138,-3,135,30,138,-3,146,24,146,24,138,-3,157,-5,146,24,157,-5,158,19,158,19,157,-5,177,-6,158,19,177,-6,173,16,173,16,177,-6,189,15,208,16,189,15,204,-5,208,16,204,-5,227,0,103,118,103,275,93,16,103,118,93,16,104,97,104,97,93,16,106,8,104,97,106,8,105,79,125,37,121,1,138,-3,283,103,282,85,290,45,290,45,282,85,279,70,290,45,279,70,278,30,278,30,279,70,273,57,278,30,273,57,265,45,265,45,254,34,264,17,264,17,254,34,247,6,241,26,225,20,227,0,241,26,227,0,247,6,241,26,247,6,254,34,353,331,237,331,257,319,353,331,257,319,270,312,353,331,270,312,279,301,353,331,279,301,318,311,353,331,318,311,331,318,353,331,331,318,353,321,305,258,306,282,297,62,305,258,297,62,302,81,305,258,302,81,305,104,305,258,305,104,305,131,290,45,297,62,306,282,290,45,306,282,283,257,290,45,283,257,283,125,290,45,283,125,283,103,310,300,318,311,282,283,310,300,282,283,283,257,310,300,283,257,306,282,265,45,264,17,278,30,189,15,177,-6,204,-5,128,319,148,321,148,331,128,319,148,331,115,314,115,314,148,331,51,297,115,314,51,297,52,280,53,95,52,280,52,124,58,69,66,48,104,293,104,293,66,48,78,30,104,293,78,30,103,275,103,275,78,30,93,16,104,293,108,306,52,280,104,293,52,280,53,95,104,293,53,95,58,69,148,331,7,331,27,319,148,331,27,319,40,315,148,331,40,315,47,308,148,331,47,308,51,297,27,319,7,331,7,321,115,314,52,280,108,306,257,319,237,331,237,321,318,311,279,301,282,283,208,16,227,0,225,20, +133,378,153,378,230,427,240,435,243,439,244,443,245,448,244,454,242,458,238,461,234,463,228,464,223,463,219,462,216,460,211,457,206,453,16383,16383,352,331,243,331,243,321,256,321,266,319,272,316,275,312,276,306,276,302,274,294,272,290,270,285,197,174,124,285,121,289,118,294,116,299,115,304,115,308,116,312,119,316,123,318,130,320,138,321,151,321,151,331,11,331,11,321,24,319,37,313,50,299,68,277,92,243,157,147,157,61,156,39,152,25,144,16,129,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,151,282,266,297,288,310,303,322,313,336,319,352,321,101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,223,96,239,107,253,121,263,138,269,156,271,175,265,206,248,231,221,250,185,262,141,266,16383,16383,101,230,101,237,103,242,106,245,110,247,117,247,154,244,182,236,201,221,213,200,217,172,213,146,202,126,185,111,161,102,129,99,113,99,107,100,101,100,36,42,36,28,33,19, +121,289,118,294,157,147,157,147,118,294,116,299,157,147,116,299,92,243,92,243,116,299,115,304,92,243,115,304,115,308,115,308,116,312,92,243,151,331,11,331,24,319,151,331,24,319,37,313,151,331,37,313,50,299,151,331,50,299,123,318,151,331,123,318,130,320,151,331,130,320,138,321,151,331,138,321,151,321,123,318,50,299,119,316,119,316,50,299,68,277,119,316,68,277,116,312,116,312,68,277,92,243,209,55,209,151,197,174,209,55,197,174,210,36,210,36,197,174,157,147,210,36,157,147,215,23,215,23,157,147,157,61,215,23,157,61,224,15,224,15,157,61,156,39,224,15,156,39,260,0,260,0,156,39,152,25,260,0,152,25,144,16,275,298,274,294,282,266,282,266,274,294,272,290,282,266,272,290,270,285,270,285,197,174,209,151,352,331,243,331,256,321,352,331,256,321,266,319,352,331,266,319,272,316,352,331,272,316,275,312,352,331,275,312,276,306,352,331,276,306,322,313,352,331,322,313,336,319,352,331,336,319,352,321,276,306,282,266,297,288,276,306,297,288,310,303,276,306,310,303,322,313,282,266,276,306,276,302,282,266,276,302,275,298,270,285,209,151,282,266,228,464,230,427,234,463,234,463,230,427,235,431,234,463,235,431,238,461,238,461,235,431,240,435,238,461,240,435,242,458,242,458,240,435,243,439,242,458,243,439,244,454,244,454,243,439,244,443,244,454,244,443,245,448,230,427,228,464,223,463,230,427,223,463,219,462,230,427,219,462,216,460,230,427,216,460,211,457,230,427,211,457,206,453,230,427,206,453,153,378,239,11,224,15,260,0,239,11,260,0,260,9,129,12,107,9,260,0,129,12,260,0,144,16,124,285,121,289,157,147,124,285,157,147,197,174,260,0,107,9,107,0,153,378,206,453,133,378,256,321,243,331,243,321,24,319,11,331,11,321, +101,266,101,268,100,269,100,271,101,292,105,306,113,314,127,319,147,321,147,331,8,331,8,321,27,319,39,314,46,307,49,294,50,276,50,60,49,39,46,25,39,17,27,12,8,9,8,0,148,0,148,9,128,11,114,16,106,23,102,36,101,55,101,80,109,80,115,79,136,79,158,80,177,82,194,85,210,90,223,96,239,107,253,121,263,138,269,156,271,175,265,206,248,231,221,250,185,262,141,266,16383,16383,101,230,101,237,103,242,106,245,110,247,117,247,154,244,182,236,201,221,213,200,217,172,213,146,202,126,185,111,161,102,129,99,113,99,107,100,101,100,36,42,36,28,33,19,28,13,19,9,6,7,6,0,79,0,79,275,81,293,86,308,95,319,107,326,122,328,137,325,150,316,159,302,165,282,167,258,165,237,159,220,150,207,137,199,119,195,114,194,110,193,107,191,105,189,105,184,107,182,110,180,115,179,121,179,145,173,163,161,176,140,184,111,187,75,186,61,185,48,182,36,179,26,175,19,172,15,164,11,160,10,155,10,150,11,146,12,143,15,142,19,141,25,140,36,138,42,135,48,130,52,125,55,118,56,111,55,105,51,100,46,97,40,96,32,98,20,105,10,115,2,129,-2,145,-3,173,0,198,14, +50,276,102,36,50,276,50,276,102,36,101,55,50,276,101,55,100,271,100,271,101,292,50,276,50,276,101,292,105,306,50,276,105,306,113,314,147,331,8,331,27,319,147,331,27,319,39,314,147,331,39,314,46,307,147,331,46,307,49,294,147,331,49,294,113,314,147,331,113,314,127,319,147,331,127,319,147,321,50,276,113,314,49,294,101,237,103,242,101,266,101,266,103,242,106,245,101,266,106,245,141,266,141,266,106,245,110,247,141,266,110,247,117,247,117,247,154,244,141,266,141,266,154,244,185,262,201,221,213,200,221,250,221,250,213,200,217,172,223,96,217,172,213,146,185,262,154,244,182,236,185,262,182,236,201,221,185,262,201,221,221,250,265,206,248,231,253,121,265,206,253,121,263,138,265,206,263,138,269,156,265,206,269,156,271,175,248,231,221,250,223,96,248,231,223,96,239,107,248,231,239,107,253,121,136,79,158,80,161,102,161,102,158,80,177,82,161,102,177,82,185,111,185,111,177,82,194,85,185,111,194,85,202,126,202,126,194,85,210,90,202,126,210,90,213,146,213,146,210,90,223,96,161,102,129,99,136,79,136,79,129,99,128,79,128,79,129,99,124,99,128,79,124,99,122,79,122,79,124,99,118,99,122,79,118,99,115,79,115,79,118,99,113,99,115,79,113,99,109,80,109,80,113,99,107,100,109,80,107,100,101,100,101,266,101,100,101,230,101,266,101,230,101,237,101,267,101,268,101,55,101,267,101,55,101,100,101,267,101,100,101,266,101,100,101,80,109,80,148,0,148,9,128,11,148,0,128,11,114,16,148,0,114,16,49,39,148,0,49,39,46,25,148,0,46,25,39,17,148,0,39,17,27,12,148,0,27,12,8,9,148,0,8,9,8,0,101,55,101,268,100,269,101,55,100,269,100,270,101,55,100,270,100,271,50,60,49,39,114,16,50,60,114,16,106,23,50,60,106,23,102,36,50,60,102,36,50,276,217,172,223,96,221,250,27,319,8,331,8,321, +36,42,36,28,33,19,28,13,19,9,6,7,6,0,79,0,79,275,81,293,86,308,95,319,107,326,122,328,137,325,150,316,159,302,165,282,167,258,165,237,159,220,150,207,137,199,119,195,114,194,110,193,107,191,105,189,105,184,107,182,110,180,115,179,121,179,145,173,163,161,176,140,184,111,187,75,186,61,185,48,182,36,179,26,175,19,172,15,164,11,160,10,155,10,150,11,146,12,143,15,142,19,141,25,140,36,138,42,135,48,130,52,125,55,118,56,111,55,105,51,100,46,97,40,96,32,98,20,105,10,115,2,129,-2,145,-3,173,0,198,14,217,35,229,62,234,93,233,110,229,125,223,139,214,152,203,163,193,170,183,176,172,181,158,185,142,189,169,203,189,216,202,230,208,246,210,266,207,291,195,312,178,328,154,338,126,342,93,337,68,324,50,301,40,269,36,227,158,253,86,328,81,332,77,335,73,337,65,339,59,338,53,336,50,333,47,329,46,323,47,318,49,314,52,309,56,305,61,301,138,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3, +33,19,28,13,79,0,79,0,28,13,19,9,79,0,19,9,6,7,158,185,142,189,145,173,145,173,142,189,137,199,145,173,137,199,121,179,121,179,137,199,119,195,121,179,119,195,115,179,115,179,119,195,114,194,115,179,114,194,110,180,110,180,114,194,110,193,110,180,110,193,107,182,107,182,110,193,107,191,107,182,107,191,105,184,105,184,107,191,105,189,105,184,105,189,105,187,81,293,86,308,93,337,93,337,86,308,95,319,93,337,95,319,126,342,126,342,95,319,107,326,126,342,107,326,122,328,122,328,137,325,126,342,126,342,137,325,154,338,165,237,169,203,167,258,167,258,169,203,178,328,178,328,169,203,189,216,178,328,189,216,195,312,195,312,189,216,202,230,195,312,202,230,207,291,207,291,202,230,208,246,207,291,208,246,210,266,137,325,150,316,154,338,154,338,150,316,159,302,154,338,159,302,178,328,178,328,159,302,165,282,178,328,165,282,167,258,150,207,142,189,169,203,150,207,169,203,159,220,159,220,169,203,165,237,229,62,234,93,233,110,229,62,233,110,229,125,229,62,229,125,223,139,229,62,223,139,217,35,223,139,214,152,217,35,217,35,214,152,203,163,217,35,203,163,198,14,198,14,203,163,193,170,198,14,193,170,187,75,187,75,193,170,184,111,198,14,187,75,186,61,198,14,186,61,185,48,198,14,185,48,182,36,198,14,182,36,179,26,198,14,179,26,175,19,198,14,175,19,173,0,141,25,140,36,138,42,141,25,138,42,145,-3,141,25,145,-3,142,19,68,324,50,301,79,0,68,324,79,0,79,275,68,324,79,275,81,293,68,324,81,293,93,337,79,0,50,301,40,269,79,0,40,269,36,227,79,0,36,227,36,42,79,0,36,42,36,28,79,0,36,28,33,19,168,13,164,11,173,0,173,0,164,11,160,10,173,0,160,10,155,10,155,10,150,11,173,0,173,0,150,11,146,12,173,0,146,12,145,-3,145,-3,146,12,143,15,145,-3,143,15,142,19,168,13,173,0,172,15,172,15,173,0,175,19,138,42,135,48,145,-3,145,-3,135,48,130,52,145,-3,130,52,129,-2,129,-2,130,52,125,55,129,-2,125,55,118,56,115,2,129,-2,118,56,115,2,118,56,111,55,115,2,111,55,105,51,115,2,105,51,105,10,100,46,97,40,98,20,100,46,98,20,105,10,100,46,105,10,105,51,158,185,163,161,172,181,172,181,163,161,176,140,172,181,176,140,183,176,183,176,176,140,184,111,183,176,184,111,193,170,158,185,145,173,163,161,98,20,97,40,96,32,79,0,6,7,6,0,142,189,150,207,137,199, +158,253,86,328,81,332,77,335,73,337,65,339,59,338,53,336,50,333,47,329,46,323,47,318,49,314,52,309,56,305,61,301,138,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,60,253,79,253,156,302,162,306,166,310,169,314,171,318,171,329,168,333,165,336,160,338,154,339,146,337,142,335,138,332,133,328,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,190,253, +138,253,158,253,86,328,138,253,86,328,81,332,138,253,81,332,77,335,138,253,77,335,73,337,138,253,73,337,69,338,138,253,69,338,65,339,138,253,65,339,61,301,46,323,47,318,47,329,47,329,47,318,49,314,47,329,49,314,50,333,50,333,49,314,52,309,50,333,52,309,53,336,53,336,52,309,56,305,53,336,56,305,59,338,59,338,56,305,61,301,59,338,61,301,65,339,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175, +60,253,79,253,156,302,162,306,166,310,169,314,171,318,171,329,168,333,165,336,160,338,154,339,146,337,142,335,138,332,133,328,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,190,253,128,337,97,337,35,253,52,253,113,305,174,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297, +37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,154,339,156,302,160,338,160,338,156,302,162,306,160,338,162,306,165,336,165,336,162,306,166,310,165,336,166,310,168,333,168,333,166,310,169,314,168,333,169,314,171,329,171,329,169,314,171,318,171,329,171,318,171,323,156,302,154,339,150,338,156,302,150,338,146,337,156,302,146,337,142,335,156,302,142,335,138,332,156,302,138,332,133,328,156,302,133,328,79,253,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,79,253,133,328,60,253,184,56,186,-3,185,44,29,167,29,183,28,175, +190,253,128,337,97,337,35,253,52,253,113,305,174,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,133,299,127,301,115,307,108,311,94,315,87,316,80,316,66,314,54,308,43,298,35,284,30,266,44,266,48,274,52,281,57,285,63,288,70,289,73,289,81,287,86,285,90,283,102,278,112,273,121,269,128,267,135,266,142,266,157,268,169,274,180,284,188,299,195,319,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17, +35,253,52,253,97,337,97,337,52,253,113,305,97,337,113,305,128,337,128,337,113,305,174,253,128,337,174,253,190,253,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,184,56,186,-3,185,44,29,167,29,183,28,175, +180,319,175,309,170,302,165,297,160,295,153,294,149,294,144,295,138,297,133,299,127,301,115,307,108,311,94,315,87,316,80,316,66,314,54,308,43,298,35,284,30,266,44,266,48,274,52,281,57,285,63,288,70,289,73,289,81,287,86,285,90,283,102,278,112,273,121,269,128,267,135,266,142,266,157,268,169,274,180,284,188,299,195,319,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,186,286,185,294,182,301,176,306,169,310,161,311,154,310,147,306,142,301,138,294,137,286,138,278,142,272,147,266,153,263,161,262,169,263,176,266,182,272,185,278,186,286,16383,16383,87,286,86,294,82,301,77,306,70,310,62,311,54,310,48,306,42,301,39,294,37,286,39,278,42,272,47,266,54,263,61,262,69,263,76,266,82,272,86,278,87,286,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127, +48,274,52,281,54,308,54,308,52,281,57,285,54,308,57,285,66,314,66,314,57,285,63,288,66,314,63,288,70,289,70,289,73,289,80,316,80,316,73,289,77,288,80,316,77,288,81,287,44,266,48,274,54,308,44,266,54,308,43,298,44,266,43,298,35,284,44,266,35,284,30,266,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,80,316,81,287,87,316,87,316,81,287,86,285,87,316,86,285,90,283,90,283,102,278,94,315,94,315,102,278,101,313,80,316,66,314,70,289,94,315,87,316,90,283,101,313,102,278,108,311,108,311,102,278,112,273,108,311,112,273,115,307,115,307,112,273,121,269,115,307,121,269,127,301,127,301,121,269,128,267,127,301,128,267,133,299,133,299,128,267,135,266,133,299,135,266,138,297,138,297,135,266,142,266,138,297,142,266,144,295,144,295,142,266,157,268,144,295,157,268,149,294,149,294,157,268,153,294,160,295,153,294,157,268,160,295,157,268,169,274,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,180,319,175,309,180,284,180,319,180,284,188,299,180,319,188,299,195,319,170,302,165,297,169,274,170,302,169,274,180,284,170,302,180,284,175,309,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,29,167,29,183,28,175,160,295,169,274,165,297,184,56,186,-3,185,44, +186,286,185,294,182,301,176,306,169,310,161,311,154,310,147,306,142,301,138,294,137,286,138,278,142,272,147,266,153,263,161,262,169,263,176,266,182,272,185,278,186,286,16383,16383,87,286,86,294,82,301,77,306,70,310,62,311,54,310,48,306,42,301,39,294,37,286,39,278,42,272,47,266,54,263,61,262,69,263,76,266,82,272,86,278,87,286,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,162,306,159,322,152,336,142,347,128,354,113,357,97,354,83,347,72,336,65,323,63,307,65,291,72,277,83,267,96,260,112,257,128,260,141,267,152,277,159,291,162,306,16383,16383,145,307,143,296,139,287,132,280,122,276,112,274,101,276,92,280,85,287,81,296,79,307,81,317,86,326,93,333,102,338,112,339,122,338,131,333,139,326,143,317,145,307,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134, +161,311,161,262,169,310,169,310,161,262,169,263,169,310,169,263,176,306,176,306,169,263,176,266,176,306,176,266,182,301,182,301,176,266,182,272,182,301,182,272,185,294,185,294,182,272,185,278,185,294,185,278,186,286,137,286,138,278,138,294,138,294,138,278,142,272,138,294,142,272,142,301,142,301,142,272,147,266,142,301,147,266,147,306,147,306,147,266,153,263,147,306,153,263,154,310,154,310,153,263,161,262,154,310,161,262,161,311,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,37,286,39,278,39,294,39,294,39,278,42,272,39,294,42,272,42,301,42,301,42,272,47,266,42,301,47,266,48,306,48,306,47,266,54,263,48,306,54,263,54,310,54,310,54,263,61,262,54,310,61,262,62,311,62,311,61,262,69,263,62,311,69,263,70,310,70,310,69,263,76,266,70,310,76,266,77,306,77,306,76,266,82,272,77,306,82,272,82,301,82,301,82,272,86,278,82,301,86,278,86,294,86,294,86,278,87,286,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,29,167,29,183,28,175,184,56,186,-3,185,44, +162,306,159,322,152,336,142,347,128,354,113,357,97,354,83,347,72,336,65,323,63,307,65,291,72,277,83,267,96,260,112,257,128,260,141,267,152,277,159,291,162,306,16383,16383,145,307,143,296,139,287,132,280,122,276,112,274,101,276,92,280,85,287,81,296,79,307,81,317,86,326,93,333,102,338,112,339,122,338,131,333,139,326,143,317,145,307,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,98,0,113,6,128,16,143,31,144,31,147,17,151,7,157,0,166,-3,176,-4,186,-3,195,-1,204,2,212,9,221,19,16383,16383,143,64,143,56,142,49,138,43,133,38,126,32,121,29,109,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,79,68,87,73,94,79,101,88,108,99,114,111,121,126,127,143,134,310,77,296,58,283,44,269,35,254,30,238,28,226,30,215,33,205,38,197,45,190,54,185,65,181,78,179,93,178,112,177,138,308,138,302,173,292,199,277,216,255,227,228,230,215,229,203,227,192,222,181,216,169,206,157,216,147,222,136,227,123,229,109,230,84,227,62,220,45,208,34,193,30,176,31,168,34,161,38,156,44,153,52,152,59,153,66,156,70,161,73,167,74,175,74,185,73,188,73,196,74,203,79,208,86,213,96,216,107,217,119,215,127,210,133,202,136,189,137,172,137,141,73,123,48,112,32,99,24,84,20,68,19,50,22,32,30,17,42,6,58,0,77,-2,91,-1,105,1,119,7,134,17,153,31,164,18,175,8,188,1,202,-1,218,-2,230,-2,243,0,254,3,266,9,276,17,285,24,293,33,300,44,308,58,316,75,16383,16383,177,153,180,177,186,194,194,206,206,212,221,214,235,212,246,206,254,194,259,177,261,153,16383,16383,137,100,138,90,140,68,146,46,146,45,147,45,147,44,143,38,134,31,121,25,108,21,95,19,83,21,74,28,67,37,64,49,63,63,64,79,71,92,85,103,106,114,137,127,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161, +143,296,139,287,141,267,141,267,139,287,132,280,141,267,132,280,128,260,128,260,132,280,122,276,128,260,122,276,112,257,112,257,122,276,112,274,63,307,65,291,65,323,65,323,65,291,72,277,65,323,72,277,72,336,72,336,72,277,83,267,72,336,83,267,79,307,79,307,83,347,72,336,37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,218,117,216,111,230,117,216,127,229,127,229,117,216,128,211,127,229,128,211,140,226,140,226,128,211,136,202,140,226,136,202,142,190,76,208,83,213,85,227,85,227,83,213,93,217,85,227,93,217,98,229,98,229,93,217,104,218,98,229,104,218,111,230,73,224,70,194,71,201,73,224,71,201,76,208,73,224,76,208,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,113,357,112,339,122,338,113,357,122,338,128,354,128,354,122,338,131,333,128,354,131,333,142,347,142,347,131,333,139,326,142,347,139,326,143,317,184,56,184,152,184,168,184,56,184,168,183,181,184,56,183,181,180,191,184,56,180,191,186,-3,190,28,195,-1,195,25,195,25,195,-1,200,23,204,24,200,23,204,2,204,24,204,2,212,9,187,35,185,44,186,-3,187,35,186,-3,195,-1,187,35,195,-1,190,28,147,17,151,7,152,222,152,222,151,7,157,0,152,222,157,0,162,215,162,215,157,0,166,-3,162,215,166,-3,170,208,170,208,166,-3,176,-4,170,208,176,-4,176,199,176,199,176,-4,186,-3,176,199,186,-3,180,191,152,222,140,226,142,190,152,222,142,190,143,173,152,222,143,173,143,134,152,222,143,134,144,31,152,222,144,31,147,17,143,31,144,31,143,134,143,146,143,134,143,173,216,29,212,27,212,9,216,29,212,9,221,19,216,29,221,19,221,33,208,25,204,24,212,9,208,25,212,9,212,27,200,23,195,-1,204,2,162,306,159,322,159,291,159,291,159,322,152,336,159,291,152,336,152,277,152,277,152,336,145,307,143,317,145,307,152,336,143,317,152,336,142,347,143,296,141,267,152,277,143,296,152,277,145,307,86,326,93,333,97,354,97,354,93,333,102,338,97,354,102,338,113,357,113,357,102,338,112,339,83,347,79,307,81,317,83,347,81,317,86,326,83,347,86,326,97,354,101,276,92,280,96,260,101,276,96,260,112,257,101,276,112,257,112,274,85,287,81,296,83,267,85,287,83,267,96,260,85,287,96,260,92,280,143,31,143,134,143,64,143,31,143,64,143,56,143,31,143,56,142,49,143,31,142,49,138,43,143,31,138,43,133,38,143,31,133,38,128,16,128,16,133,38,126,32,126,32,121,29,128,16,128,16,121,29,115,27,128,16,115,27,113,6,113,6,115,27,109,25,113,6,109,25,103,24,99,114,111,121,114,135,114,135,111,121,126,127,114,135,126,127,143,146,143,146,126,127,143,134,65,79,68,87,75,118,75,118,68,87,73,94,75,118,73,94,79,101,79,101,88,108,92,126,92,126,88,108,99,114,92,126,99,114,114,135,92,126,75,118,79,101,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,79,63,112,65,79,75,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,98,0,86,25,86,25,98,0,97,24,103,24,97,24,98,0,103,24,98,0,113,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,79,307,83,267,81,296,184,56,186,-3,185,44,29,167,29,183,28,175, +310,77,296,58,283,44,269,35,254,30,238,28,226,30,215,33,205,38,197,45,190,54,185,65,181,78,179,93,178,112,177,138,308,138,302,173,292,199,277,216,255,227,228,230,215,229,203,227,192,222,181,216,169,206,157,216,147,222,136,227,123,229,109,230,84,227,62,220,45,208,34,193,30,176,31,168,34,161,38,156,44,153,52,152,59,153,66,156,70,161,73,167,74,175,74,185,73,188,73,196,74,203,79,208,86,213,96,216,107,217,119,215,127,210,133,202,136,189,137,172,137,141,73,123,48,112,32,99,24,84,20,68,19,50,22,32,30,17,42,6,58,0,77,-2,91,-1,105,1,119,7,134,17,153,31,164,18,175,8,188,1,202,-1,218,-2,230,-2,243,0,254,3,266,9,276,17,285,24,293,33,300,44,308,58,316,75,16383,16383,177,153,180,177,186,194,194,206,206,212,221,214,235,212,246,206,254,194,259,177,261,153,16383,16383,137,100,138,90,140,68,146,46,146,45,147,45,147,44,143,38,134,31,121,25,108,21,95,19,83,21,74,28,67,37,64,49,63,63,64,79,71,92,85,103,106,114,137,127,199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,220,67,213,55,204,40,189,28,172,19,152,14,130,12,106,16,72,27,43,45,20,68,4,96,-3,77,-49,80,-51,83,-50,85,-50,88,-49,94,-49,104,-50,112,-52,117,-55,120,-60,121,-67,120,-74,116,-81,111,-85,103,-88,94,-89,88,-89,82,-88,75,-87,69,-86,61,-83,54,-98,63,-102,79,-106,87,-106,96,-107,117,-105,135,-99,148,-91,156,-79,158,-64,157,-52,151,-43,142,-36,130,-32,116,-30,108,-30,105,-31,103,-31,113,-4,136,0,156,9,174,24,190,46,206,74,155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71, +73,196,73,196,73,196,73,196,74,203,62,220,73,196,62,220,66,156,73,196,66,156,70,161,143,38,134,31,134,17,134,17,134,31,121,25,134,17,121,25,119,7,119,7,121,25,108,21,119,7,108,21,105,1,105,1,108,21,95,19,105,1,95,19,91,-1,91,-1,95,19,83,21,91,-1,83,21,77,-2,77,-2,83,21,74,28,77,-2,74,28,67,37,63,63,58,0,64,49,64,49,58,0,77,-2,64,49,77,-2,67,37,74,203,79,208,84,227,84,227,79,208,86,213,84,227,86,213,109,230,109,230,86,213,96,216,109,230,96,216,107,217,107,217,119,215,109,230,109,230,119,215,123,229,175,8,177,138,169,206,175,8,169,206,164,18,164,18,169,206,157,216,164,18,157,216,153,31,153,31,157,216,147,44,147,45,147,44,147,222,147,222,147,44,157,216,147,222,136,227,136,189,147,222,136,189,137,172,147,222,137,172,137,127,147,222,137,127,138,90,147,222,138,90,139,79,147,222,139,79,140,68,147,222,140,68,143,57,147,222,143,57,146,46,147,222,146,46,146,45,147,222,146,45,147,45,137,141,137,127,137,172,136,227,123,229,127,210,136,227,127,210,133,202,136,227,133,202,136,189,228,230,221,214,235,212,228,230,235,212,255,227,255,227,235,212,246,206,255,227,246,206,254,194,177,153,180,177,181,216,181,216,180,177,186,194,181,216,186,194,192,222,192,222,186,194,194,206,192,222,194,206,203,227,203,227,194,206,206,212,203,227,206,212,215,229,215,229,206,212,221,214,215,229,221,214,228,230,277,216,261,153,308,138,308,138,261,153,177,153,308,138,177,153,177,138,169,206,177,138,177,153,169,206,177,153,181,216,259,177,261,153,277,216,259,177,277,216,255,227,259,177,255,227,254,194,292,199,277,216,308,138,292,199,308,138,302,173,226,30,215,33,218,-2,218,-2,215,33,205,38,218,-2,205,38,202,-1,202,-1,205,38,197,45,202,-1,197,45,190,54,190,54,185,65,188,1,188,1,185,65,181,78,188,1,181,78,179,93,175,8,188,1,179,93,175,8,179,93,178,112,175,8,178,112,177,138,218,-2,230,-2,226,30,226,30,230,-2,238,28,254,30,238,28,243,0,254,30,243,0,254,3,190,54,188,1,202,-1,285,24,293,33,296,58,296,58,293,33,300,44,296,58,300,44,310,77,310,77,300,44,308,58,310,77,308,58,316,75,254,3,266,9,269,35,269,35,266,9,276,17,269,35,276,17,283,44,283,44,276,17,285,24,283,44,285,24,296,58,238,28,230,-2,243,0,143,38,134,17,153,31,143,38,153,31,147,44,64,79,71,92,73,123,73,123,71,92,85,103,73,123,85,103,137,141,137,141,85,103,106,114,137,141,106,114,137,127,42,6,58,0,48,112,48,112,58,0,63,63,48,112,63,63,64,79,20,68,22,32,24,84,24,84,22,32,30,17,24,84,30,17,32,99,32,99,30,17,42,6,32,99,42,6,48,112,38,156,44,153,45,208,45,208,44,153,52,152,45,208,52,152,62,220,62,220,52,152,59,153,62,220,59,153,66,156,34,193,30,176,31,168,34,193,31,168,34,161,34,193,34,161,38,156,34,193,38,156,45,208,74,185,73,188,73,167,74,185,73,167,74,175,74,185,74,175,74,180,73,167,73,188,73,192,73,167,73,192,73,196,73,167,73,196,70,161,62,220,74,203,84,227,22,32,20,68,19,50,48,112,64,79,73,123,138,90,137,127,137,100,254,30,254,3,269,35,123,229,119,215,127,210, +199,78,185,60,172,46,159,38,144,33,128,31,103,36,81,49,65,69,54,96,51,128,54,157,63,181,78,200,96,211,119,215,128,215,136,212,141,208,145,201,148,191,151,180,154,172,159,166,163,161,169,158,175,157,183,158,189,161,195,166,198,172,199,179,195,195,184,209,167,220,146,227,122,230,108,229,94,226,80,220,67,213,55,204,40,189,28,172,19,152,14,130,12,106,16,72,27,43,45,20,68,4,96,-3,77,-49,80,-51,83,-50,85,-50,88,-49,94,-49,104,-50,112,-52,117,-55,120,-60,121,-67,120,-74,116,-81,111,-85,103,-88,94,-89,88,-89,82,-88,75,-87,69,-86,61,-83,54,-98,63,-102,79,-106,87,-106,96,-107,117,-105,135,-99,148,-91,156,-79,158,-64,157,-52,151,-43,142,-36,130,-32,116,-30,108,-30,105,-31,103,-31,113,-4,136,0,156,9,174,24,190,46,206,74,155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31, +81,49,65,69,68,4,68,4,65,69,54,96,68,4,54,96,45,20,45,20,54,96,51,128,55,204,51,128,54,157,55,204,54,157,63,181,87,-106,96,-107,88,-89,88,-89,96,-107,94,-89,103,-88,94,-89,96,-107,103,-88,96,-107,117,-105,96,-3,94,-49,104,-50,96,-3,104,-50,103,-31,96,-3,103,-31,103,36,103,36,103,-31,113,-4,96,-3,77,-49,80,-51,96,-3,80,-51,83,-50,96,-3,83,-50,85,-50,96,-3,85,-50,88,-49,96,-3,88,-49,91,-49,96,-3,91,-49,94,-49,185,60,172,46,174,24,174,24,172,46,159,38,174,24,159,38,156,9,156,9,159,38,144,33,156,9,144,33,136,0,136,0,144,33,128,31,113,-4,136,0,128,31,113,-4,128,31,103,36,81,49,68,4,96,-3,81,49,96,-3,103,36,136,212,141,208,146,227,146,227,141,208,145,201,146,227,145,201,148,191,148,191,151,180,167,220,167,220,151,180,154,172,167,220,154,172,159,166,122,230,119,215,128,215,122,230,128,215,146,227,146,227,128,215,136,212,195,195,184,209,189,161,195,195,189,161,195,166,195,195,195,166,198,172,195,195,198,172,199,179,184,209,167,220,169,158,184,209,169,158,175,157,184,209,175,157,183,158,184,209,183,158,189,161,167,220,159,166,163,161,167,220,163,161,169,158,167,220,146,227,148,191,190,46,206,74,199,78,190,46,199,78,185,60,190,46,185,60,174,24,96,211,119,215,108,229,96,211,108,229,94,226,96,211,94,226,80,220,96,211,80,220,78,200,67,213,55,204,63,181,67,213,63,181,78,200,67,213,78,200,80,220,45,20,51,128,55,204,45,20,55,204,40,189,45,20,40,189,28,172,45,20,28,172,27,43,19,152,14,130,16,72,19,152,16,72,27,43,19,152,27,43,28,172,158,-64,157,-52,156,-79,156,-79,157,-52,151,-43,156,-79,151,-43,148,-91,148,-91,151,-43,142,-36,148,-91,142,-36,135,-99,135,-99,142,-36,130,-32,135,-99,130,-32,121,-67,121,-67,130,-32,120,-60,117,-55,120,-60,130,-32,117,-55,130,-32,116,-30,117,-55,116,-30,113,-30,117,-55,113,-30,112,-52,112,-52,113,-30,110,-30,112,-52,110,-30,108,-30,112,-52,108,-30,105,-31,112,-52,105,-31,104,-50,135,-99,121,-67,120,-74,135,-99,120,-74,117,-105,117,-105,120,-74,116,-81,117,-105,116,-81,111,-85,61,-83,63,-102,69,-86,69,-86,63,-102,71,-104,69,-86,71,-104,75,-87,75,-87,71,-104,79,-106,75,-87,79,-106,82,-88,82,-88,79,-106,87,-106,82,-88,87,-106,88,-89,63,-102,61,-83,54,-98,103,-88,117,-105,111,-85,103,-31,104,-50,105,-31,119,215,122,230,108,229,16,72,14,130,12,106, +155,253,83,328,78,332,74,335,69,337,61,339,55,338,50,336,46,333,44,329,43,323,44,318,46,314,49,309,53,305,58,301,135,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176, +56,85,75,0,62,71,62,71,75,0,71,57,80,47,71,57,75,0,80,47,75,0,108,-4,52,100,50,118,49,15,52,100,49,15,75,0,52,100,75,0,56,85,12,108,17,70,17,148,17,148,17,70,29,39,17,148,29,39,31,182,31,182,29,39,49,15,31,182,49,15,49,138,49,138,49,15,50,118,135,253,155,253,83,328,135,253,83,328,78,332,135,253,78,332,74,335,135,253,74,335,69,337,135,253,69,337,65,338,135,253,65,338,61,339,135,253,61,339,58,301,43,323,44,318,44,329,44,329,44,318,46,314,44,329,46,314,46,333,46,333,46,314,49,309,46,333,49,309,50,336,50,336,49,309,53,305,50,336,53,305,55,338,55,338,53,305,58,301,55,338,58,301,61,339,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,90,39,80,47,108,-4,90,39,108,-4,101,34,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155, +58,253,78,253,155,302,161,306,165,310,168,314,170,318,170,323,169,329,167,333,163,336,158,338,152,339,148,338,145,337,141,335,137,332,132,328,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,190,253,127,337,97,337,35,253,51,253,112,305,173,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286, +203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,152,339,155,302,158,338,158,338,155,302,161,306,158,338,161,306,163,336,163,336,161,306,165,310,163,336,165,310,167,333,167,333,165,310,168,314,167,333,168,314,169,329,169,329,168,314,170,318,169,329,170,318,170,323,155,302,152,339,148,338,155,302,148,338,145,337,155,302,145,337,141,335,155,302,141,335,137,332,155,302,137,332,132,328,155,302,132,328,78,253,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15,78,253,132,328,58,253, +190,253,127,337,97,337,35,253,51,253,112,305,173,253,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,138,278,141,272,146,266,153,263,161,262,169,263,176,266,181,272,185,278,186,286,16383,16383,86,286,85,294,82,301,76,306,69,310,61,311,54,310,47,306,42,301,38,294,37,286,38,278,41,272,47,266,53,263,61,262,69,263,76,266,81,272,85,278,86,286,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138, +35,253,51,253,97,337,97,337,51,253,112,305,97,337,112,305,127,337,127,337,112,305,173,253,127,337,173,253,190,253,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15, +186,286,185,294,181,301,176,306,169,310,161,311,153,310,147,306,141,301,138,294,137,286,138,278,141,272,146,266,153,263,161,262,169,263,176,266,181,272,185,278,186,286,16383,16383,86,286,85,294,82,301,76,306,69,310,61,311,54,310,47,306,42,301,38,294,37,286,38,278,41,272,47,266,53,263,61,262,69,263,76,266,81,272,85,278,86,286,16383,16383,204,82,190,62,176,48,162,37,146,31,127,30,114,31,101,34,90,39,80,47,71,57,62,71,56,85,52,100,50,118,49,138,203,138,201,153,198,166,195,177,185,195,175,207,163,217,149,224,133,228,116,230,81,224,52,207,31,182,17,148,12,108,17,70,29,39,49,15,75,0,108,-4,136,-1,160,9,181,26,198,49,212,79,16383,16383,50,155,55,175,63,191,74,203,87,210,103,212,120,210,133,203,141,192,147,176,151,155,115,253,42,328,38,332,33,335,29,337,21,339,15,338,10,336,6,333,4,329,3,323,3,318,5,314,8,309,18,301,95,253,16383,16383,122,0,122,7,105,9,94,14,88,21,85,34,84,52,84,228,82,230,5,203,5,195,15,197,26,197,33,196,37,193,40,187,42,178,42,33,38,20,32,13,20,9,3,7,3,0,25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228, +203,138,201,153,198,166,203,138,198,166,195,177,203,138,195,177,190,186,203,138,190,186,185,195,203,138,185,195,175,207,203,138,175,207,163,217,203,138,163,217,151,155,203,138,151,155,50,155,203,138,50,155,49,138,141,192,147,176,149,224,149,224,147,176,151,155,149,224,151,155,163,217,137,286,138,278,138,294,138,294,138,278,141,272,138,294,141,272,141,301,141,301,141,272,146,266,141,301,146,266,147,306,147,306,146,266,153,263,147,306,153,263,153,310,153,310,153,263,161,262,153,310,161,262,161,311,161,311,161,262,169,263,161,311,169,263,169,310,169,310,169,263,176,266,169,310,176,266,176,306,176,306,176,266,181,272,176,306,181,272,181,301,181,301,181,272,185,278,181,301,185,278,185,294,185,294,185,278,186,286,37,286,38,278,38,294,38,294,38,278,41,272,38,294,41,272,42,301,42,301,41,272,47,266,42,301,47,266,47,306,47,306,47,266,53,263,47,306,53,263,54,310,54,310,53,263,61,262,54,310,61,262,61,311,61,311,61,262,69,263,61,311,69,263,69,310,69,310,69,263,76,266,69,310,76,266,76,306,76,306,76,266,81,272,76,306,81,272,82,301,82,301,81,272,85,278,82,301,85,278,85,294,85,294,85,278,86,286,52,100,50,118,49,15,49,15,50,118,49,138,49,15,49,138,31,182,49,15,31,182,29,39,29,39,31,182,17,148,29,39,17,148,17,70,17,70,17,148,12,108,133,228,116,230,120,210,120,210,116,230,103,212,87,210,103,212,116,230,87,210,116,230,81,224,190,62,176,48,181,26,181,26,176,48,162,37,181,26,162,37,160,9,160,9,162,37,146,31,160,9,146,31,136,-1,136,-1,146,31,127,30,198,49,212,79,204,82,198,49,204,82,190,62,198,49,190,62,181,26,114,31,101,34,108,-4,114,31,108,-4,136,-1,114,31,136,-1,127,30,101,34,90,39,108,-4,108,-4,90,39,80,47,108,-4,80,47,75,0,75,0,80,47,71,57,133,228,120,210,133,203,133,228,133,203,141,192,133,228,141,192,149,224,50,155,55,175,52,207,52,207,55,175,63,191,52,207,63,191,81,224,81,224,63,191,74,203,81,224,74,203,87,210,52,207,31,182,49,138,52,207,49,138,50,155,75,0,71,57,62,71,75,0,62,71,56,85,75,0,56,85,52,100,75,0,52,100,49,15, +115,253,42,328,38,332,33,335,29,337,21,339,15,338,10,336,6,333,4,329,3,323,3,318,5,314,8,309,18,301,95,253,16383,16383,122,0,122,7,105,9,94,14,88,21,85,34,84,52,84,228,82,230,5,203,5,195,15,197,26,197,33,196,37,193,40,187,42,178,42,33,38,20,32,13,20,9,3,7,3,0,25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7, +95,253,115,253,42,328,95,253,42,328,38,332,95,253,38,332,33,335,95,253,33,335,29,337,95,253,29,337,25,338,95,253,25,338,21,339,95,253,21,339,18,301,3,323,3,318,4,329,4,329,3,318,5,314,4,329,5,314,6,333,6,333,5,314,8,309,6,333,8,309,10,336,10,336,8,309,13,305,10,336,13,305,15,338,15,338,13,305,18,301,15,338,18,301,21,339,38,20,32,13,122,0,122,0,32,13,20,9,122,0,20,9,3,7,15,197,19,197,82,230,82,230,19,197,23,197,82,230,23,197,26,197,26,197,33,196,82,230,82,230,33,196,37,193,82,230,37,193,40,187,38,20,122,0,42,33,42,33,122,0,94,14,42,33,94,14,42,52,42,52,94,14,88,21,42,52,88,21,42,166,42,178,42,166,82,230,42,178,82,230,40,187,10,196,15,197,82,230,10,196,82,230,5,203,10,196,5,203,5,195,84,52,84,228,82,230,84,52,82,230,42,166,84,52,42,166,85,34,105,9,94,14,122,0,105,9,122,0,122,7,122,0,3,7,3,0,42,166,88,21,85,34, +25,253,45,253,122,302,127,306,131,310,134,314,136,318,137,323,136,329,134,333,130,336,125,338,119,339,111,337,107,335,103,332,98,328,16383,16383,127,0,127,7,110,9,99,14,93,21,90,34,89,52,89,228,87,230,10,203,10,195,20,197,31,197,38,196,42,193,45,187,47,178,47,33,43,20,37,13,25,9,8,7,8,0,147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,70,230,-6,203,-6,195,0,196,3,197,15,197,21,196,26,193,29,187,31,178,31,52,30,33,27,20,21,13,9,9,-7,7,-7,0,144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306, +119,339,122,302,125,338,125,338,122,302,127,306,125,338,127,306,130,336,130,336,127,306,131,310,130,336,131,310,134,333,134,333,131,310,134,314,134,333,134,314,136,329,136,329,134,314,136,318,136,329,136,318,137,323,122,302,119,339,115,338,122,302,115,338,111,337,122,302,111,337,107,335,122,302,107,335,103,332,122,302,103,332,98,328,122,302,98,328,45,253,43,20,37,13,127,0,127,0,37,13,25,9,127,0,25,9,8,7,20,197,24,197,87,230,87,230,24,197,28,197,87,230,28,197,31,197,31,197,38,196,87,230,87,230,38,196,42,193,87,230,42,193,45,187,43,20,127,0,47,33,47,33,127,0,99,14,47,33,99,14,47,52,47,52,99,14,93,21,47,52,93,21,47,166,47,178,47,166,87,230,47,178,87,230,45,187,15,196,20,197,87,230,15,196,87,230,10,203,15,196,10,203,10,195,89,52,89,228,87,230,89,52,87,230,47,166,89,52,47,166,90,34,110,9,99,14,127,0,110,9,127,0,127,7,127,0,8,7,8,0,47,166,93,21,90,34,45,253,98,328,25,253, +147,253,84,337,54,337,-7,253,8,253,69,305,130,253,16383,16383,110,0,110,7,93,9,83,14,77,21,74,34,73,52,73,228,70,230,-6,203,-6,195,0,196,3,197,15,197,21,196,26,193,29,187,31,178,31,52,30,33,27,20,21,13,9,9,-7,7,-7,0,144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,99,301,96,294,94,286,96,278,99,272,104,266,111,263,118,262,126,263,133,266,139,272,143,278,144,286,16383,16383,45,286,43,294,40,301,34,306,27,310,20,311,12,310,5,306,0,301,-3,294,-4,286, +-7,253,8,253,54,337,54,337,8,253,69,305,54,337,69,305,84,337,84,337,69,305,130,253,84,337,130,253,147,253,27,20,21,13,110,0,110,0,21,13,9,9,110,0,9,9,-7,7,3,197,8,197,70,230,70,230,8,197,11,197,70,230,11,197,15,197,15,197,21,196,70,230,70,230,21,196,26,193,70,230,26,193,29,187,31,166,31,52,77,21,31,166,77,21,74,34,31,166,74,34,73,52,31,166,73,52,70,230,31,166,70,230,31,178,0,196,3,197,70,230,0,196,70,230,-6,203,0,196,-6,203,-6,195,73,52,73,228,70,230,110,0,110,7,93,9,110,0,93,9,83,14,110,0,83,14,30,33,110,0,30,33,27,20,31,52,30,33,83,14,31,52,83,14,77,21,110,0,-7,7,-7,0,70,230,29,187,31,178, +144,286,143,294,139,301,133,306,127,310,119,311,111,310,104,306,99,301,96,294,94,286,96,278,99,272,104,266,111,263,118,262,126,263,133,266,139,272,143,278,144,286,16383,16383,45,286,43,294,40,301,34,306,27,310,20,311,12,310,5,306,0,301,-3,294,-4,286,-3,278,0,272,5,266,11,263,19,262,27,263,34,266,40,272,43,278,45,286,16383,16383,113,0,113,7,97,9,86,14,80,21,77,34,76,52,76,228,74,230,-2,203,-2,195,2,196,7,197,18,197,25,196,29,193,32,187,34,178,35,166,35,52,34,33,31,20,24,13,12,9,-4,7,-4,0,212,328,195,343,148,318,135,326,122,332,107,337,90,340,71,342,50,329,66,326,80,323,93,318,105,311,118,302,57,270,74,255,135,287,151,272,163,256,172,239,179,220,184,200,170,212,159,221,148,226,136,229,123,230,89,224,59,208,35,182,20,148,15,108,20,70,35,38,58,15,88,0,123,-4,145,-2,165,3,182,13,196,26,209,44,218,60,225,79,231,99,234,120,235,142,233,179,225,215,211,248,192,278,166,304,16383,16383,190,101,187,69,179,44,167,25,151,13,132,9,104,18,83,41,70,73,62,108,60,141,62,165,70,185,83,201,99,212,118,216,142,211, +31,20,113,0,34,33,34,33,113,0,86,14,34,33,86,14,35,52,35,52,86,14,80,21,35,52,80,21,35,166,35,166,80,21,77,34,35,166,77,34,76,52,74,230,-2,203,2,196,74,230,2,196,7,197,74,230,7,197,11,197,74,230,11,197,15,197,74,230,15,197,18,197,74,230,18,197,25,196,74,230,25,196,29,193,74,230,29,193,32,187,74,230,32,187,34,178,74,230,34,178,35,166,74,230,35,166,76,52,74,230,76,52,76,228,94,286,96,278,96,294,96,294,96,278,99,272,96,294,99,272,99,301,99,301,99,272,104,266,99,301,104,266,104,306,104,306,104,266,111,263,104,306,111,263,111,310,111,310,111,263,118,262,111,310,118,262,119,311,119,311,118,262,126,263,119,311,126,263,127,310,127,310,126,263,133,266,127,310,133,266,133,306,133,306,133,266,139,272,133,306,139,272,139,301,139,301,139,272,143,278,139,301,143,278,143,294,143,294,143,278,144,286,97,9,86,14,113,0,97,9,113,0,113,7,113,0,31,20,24,13,113,0,24,13,12,9,113,0,12,9,-4,7,113,0,-4,7,-4,0,-4,286,-3,278,-3,294,-3,294,-3,278,0,272,-3,294,0,272,0,301,0,301,0,272,5,266,0,301,5,266,5,306,5,306,5,266,11,263,5,306,11,263,12,310,12,310,11,263,19,262,12,310,19,262,20,311,20,311,19,262,27,263,20,311,27,263,27,310,27,310,27,263,34,266,27,310,34,266,34,306,34,306,34,266,40,272,34,306,40,272,40,301,40,301,40,272,43,278,40,301,43,278,43,294,43,294,43,278,45,286,2,196,-2,203,-2,195, +212,328,195,343,148,318,135,326,122,332,107,337,90,340,71,342,50,329,66,326,80,323,93,318,105,311,118,302,57,270,74,255,135,287,151,272,163,256,172,239,179,220,184,200,170,212,159,221,148,226,136,229,123,230,89,224,59,208,35,182,20,148,15,108,20,70,35,38,58,15,88,0,123,-4,145,-2,165,3,182,13,196,26,209,44,218,60,225,79,231,99,234,120,235,142,233,179,225,215,211,248,192,278,166,304,16383,16383,190,101,187,69,179,44,167,25,151,13,132,9,104,18,83,41,70,73,62,108,60,141,62,165,70,185,83,201,99,212,118,216,142,211,162,195,177,171,187,139,190,101,196,319,191,309,186,302,181,297,176,295,170,294,165,294,160,295,154,297,149,299,143,301,131,307,124,311,110,315,103,316,96,316,82,314,70,308,59,298,51,284,46,266,60,266,64,274,68,281,73,285,79,288,85,289,89,289,97,287,102,285,106,283,118,278,128,273,137,269,144,267,151,266,158,266,173,268,185,274,195,284,203,299,210,319,16383,16383,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200, +136,229,123,230,142,211,142,211,123,230,118,216,99,212,118,216,123,230,99,212,123,230,89,224,122,332,118,302,135,287,122,332,135,287,135,326,135,326,135,287,151,272,135,326,151,272,148,318,148,318,151,272,166,304,148,318,166,304,195,343,195,343,166,304,212,328,107,337,90,340,93,318,107,337,93,318,105,311,107,337,105,311,118,302,107,337,118,302,122,332,50,329,66,326,71,342,71,342,66,326,80,323,71,342,80,323,90,340,90,340,80,323,93,318,187,69,179,44,182,13,182,13,179,44,167,25,182,13,167,25,165,3,165,3,167,25,151,13,165,3,151,13,145,-2,145,-2,151,13,132,9,145,-2,132,9,123,-4,123,-4,132,9,104,18,123,-4,104,18,88,0,88,0,104,18,83,41,88,0,83,41,70,73,88,0,70,73,58,15,58,15,70,73,62,108,58,15,62,108,60,141,60,141,62,165,59,208,59,208,62,165,70,185,59,208,70,185,89,224,89,224,70,185,83,201,89,224,83,201,99,212,15,108,20,70,20,148,20,148,20,70,35,38,20,148,35,38,35,182,35,182,35,38,58,15,35,182,58,15,59,208,59,208,58,15,60,141,151,272,163,256,166,304,166,304,163,256,172,239,166,304,172,239,192,278,192,278,172,239,179,220,192,278,179,220,184,200,118,302,57,270,74,255,118,302,74,255,135,287,184,200,187,139,192,278,192,278,187,139,190,101,196,26,190,101,187,69,233,179,225,215,225,79,233,179,225,79,231,99,233,179,231,99,234,120,233,179,234,120,235,142,196,26,209,44,211,248,211,248,209,44,218,60,211,248,218,60,225,215,225,215,218,60,225,79,192,278,190,101,196,26,192,278,196,26,211,248,187,139,184,200,177,171,177,171,184,200,170,212,177,171,170,212,162,195,162,195,170,212,159,221,162,195,159,221,148,226,148,226,136,229,142,211,148,226,142,211,162,195,187,69,182,13,196,26, +196,319,191,309,186,302,181,297,176,295,170,294,165,294,160,295,154,297,149,299,143,301,131,307,124,311,110,315,103,316,96,316,82,314,70,308,59,298,51,284,46,266,60,266,64,274,68,281,73,285,79,288,85,289,89,289,97,287,102,285,106,283,118,278,128,273,137,269,144,267,151,266,158,266,173,268,185,274,195,284,203,299,210,319,16383,16383,243,0,243,7,230,9,221,13,216,19,213,29,212,42,212,153,210,180,202,201,190,217,174,227,153,230,139,229,125,224,111,216,96,205,81,190,80,190,80,228,76,230,50,220,37,216,23,212,8,208,8,199,10,200,13,200,16,201,22,201,30,200,35,197,38,191,40,181,40,47,39,32,37,21,31,14,22,9,9,7,9,0,114,0,114,7,101,9,92,13,86,18,83,26,82,36,82,174,95,186,105,194,115,199,124,202,133,203,147,201,157,195,164,185,169,171,170,152,170,52,169,35,166,23,161,15,152,10,139,7,138,0,166,253,94,328,89,332,84,335,80,337,72,339,66,338,61,336,57,333,55,329,54,323,55,318,57,314,60,309,64,305,69,301,146,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76, +37,21,31,14,114,0,114,0,31,14,22,9,114,0,22,9,9,7,13,200,16,201,23,212,23,212,16,201,19,201,23,212,19,201,22,201,22,201,30,200,23,212,23,212,30,200,37,216,23,212,8,208,10,200,23,212,10,200,13,200,30,200,35,197,37,216,37,216,35,197,38,191,37,216,38,191,50,220,50,220,38,191,40,181,50,220,40,181,40,169,83,26,40,169,40,47,83,26,40,47,86,18,86,18,40,47,92,13,80,228,76,230,80,190,80,190,76,230,82,36,80,190,82,36,81,190,81,190,82,36,82,174,81,190,82,174,96,205,96,205,82,174,95,186,96,205,95,186,105,194,64,274,68,281,70,308,70,308,68,281,73,285,70,308,73,285,82,314,82,314,73,285,79,288,82,314,79,288,85,289,85,289,89,289,96,316,96,316,89,289,93,288,96,316,93,288,97,287,60,266,64,274,70,308,60,266,70,308,59,298,60,266,59,298,51,284,60,266,51,284,46,266,96,316,97,287,103,316,103,316,97,287,102,285,103,316,102,285,106,283,106,283,118,278,110,315,110,315,118,278,117,313,96,316,82,314,85,289,110,315,103,316,106,283,117,313,118,278,124,311,124,311,118,278,128,273,124,311,128,273,131,307,131,307,128,273,137,269,131,307,137,269,143,301,143,301,137,269,144,267,143,301,144,267,149,299,149,299,144,267,151,266,149,299,151,266,154,297,154,297,151,266,158,266,154,297,158,266,160,295,160,295,158,266,173,268,160,295,173,268,165,294,165,294,173,268,170,294,176,295,170,294,173,268,176,295,173,268,185,274,96,205,105,194,111,216,111,216,105,194,115,199,111,216,115,199,125,224,125,224,115,199,124,202,125,224,124,202,133,203,133,203,147,201,139,229,139,229,147,201,153,230,82,36,76,230,63,225,82,36,63,225,83,26,139,229,125,224,133,203,166,23,161,15,243,0,243,0,161,15,152,10,243,0,152,10,139,7,157,195,164,185,174,227,174,227,164,185,169,171,174,227,169,171,170,152,216,19,170,152,170,52,216,19,170,52,221,13,221,13,170,52,169,35,221,13,169,35,243,0,243,0,169,35,166,23,153,230,147,201,157,195,153,230,157,195,174,227,212,42,212,153,210,180,212,42,210,180,202,201,212,42,202,201,213,29,230,9,221,13,243,0,230,9,243,0,243,7,213,29,202,201,190,217,213,29,190,217,174,227,213,29,174,227,170,152,213,29,170,152,216,19,196,319,191,309,195,284,196,319,195,284,203,299,196,319,203,299,210,319,186,302,181,297,185,274,186,302,185,274,195,284,186,302,195,284,191,309,114,0,114,7,101,9,114,0,101,9,92,13,114,0,92,13,39,32,114,0,39,32,37,21,50,220,40,169,83,26,50,220,83,26,63,225,10,200,8,208,8,199,114,0,9,7,9,0,39,32,92,13,40,47,176,295,185,274,181,297,243,0,139,7,138,0, +166,253,94,328,89,332,84,335,80,337,72,339,66,338,61,336,57,333,55,329,54,323,55,318,57,314,60,309,64,305,69,301,146,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102, +146,253,166,253,94,328,146,253,94,328,89,332,146,253,89,332,84,335,146,253,84,335,80,337,146,253,80,337,76,338,146,253,76,338,72,339,146,253,72,339,69,301,54,323,55,318,55,329,55,329,55,318,57,314,55,329,57,314,57,333,57,333,57,314,60,309,57,333,60,309,61,336,61,336,60,309,64,305,61,336,64,305,66,338,66,338,64,305,69,301,66,338,69,301,72,339,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18, +77,253,97,253,174,302,180,306,184,310,187,314,189,318,189,323,188,329,186,333,182,336,177,338,171,339,163,337,160,335,156,332,151,328,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301, +171,339,174,302,177,338,177,338,174,302,180,306,177,338,180,306,182,336,182,336,180,306,184,310,182,336,184,310,186,333,186,333,184,310,187,314,186,333,187,314,188,329,188,329,187,314,189,318,188,329,189,318,189,323,174,302,171,339,167,338,174,302,167,338,163,337,174,302,163,337,160,335,174,302,160,335,156,332,174,302,156,332,151,328,174,302,151,328,97,253,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,97,253,151,328,77,253, +200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,126,307,118,311,104,315,97,316,90,316,76,314,64,308,54,298,46,284,40,266,55,266,58,274,63,281,68,285,73,288,80,289,84,289,92,287,100,283,112,278,123,273,131,269,139,267,145,266,152,266,168,268,180,274,190,284,198,299,205,319,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76, +45,253,62,253,107,337,107,337,62,253,123,305,107,337,123,305,138,337,138,337,123,305,184,253,138,337,184,253,200,253,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18, +190,319,185,309,181,302,176,297,170,295,164,294,159,294,154,295,149,297,137,301,126,307,118,311,104,315,97,316,90,316,76,314,64,308,54,298,46,284,40,266,55,266,58,274,63,281,68,285,73,288,80,289,84,289,92,287,100,283,112,278,123,273,131,269,139,267,145,266,152,266,168,268,180,274,190,284,198,299,205,319,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,197,286,196,294,192,301,186,306,180,310,172,311,164,310,157,306,152,301,149,294,147,286,149,278,152,272,157,266,164,263,171,262,179,263,186,266,192,272,196,278,197,286,16383,16383,98,286,96,294,93,301,87,306,80,310,73,311,65,310,58,306,53,301,49,294,48,286,49,278,53,272,58,266,64,263,72,262,80,263,87,266,93,272,96,278,98,286,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161, +58,274,63,281,64,308,64,308,63,281,68,285,64,308,68,285,76,314,76,314,68,285,73,288,76,314,73,288,80,289,80,289,84,289,90,316,90,316,84,289,88,288,90,316,88,288,92,287,55,266,58,274,64,308,55,266,64,308,54,298,55,266,54,298,46,284,55,266,46,284,40,266,90,316,92,287,97,316,97,316,92,287,96,285,97,316,96,285,100,283,100,283,112,278,104,315,104,315,112,278,111,313,90,316,76,314,80,289,104,315,97,316,100,283,111,313,112,278,118,311,118,311,112,278,123,273,118,311,123,273,126,307,126,307,123,273,131,269,126,307,131,269,137,301,137,301,131,269,139,267,137,301,139,267,143,299,143,299,139,267,145,266,143,299,145,266,149,297,149,297,145,266,152,266,149,297,152,266,154,295,154,295,152,266,168,268,154,295,168,268,159,294,159,294,168,268,164,294,170,295,164,294,168,268,170,295,168,268,180,274,190,319,185,309,190,284,190,319,190,284,198,299,190,319,198,299,205,319,181,302,176,297,180,274,181,302,180,274,190,284,181,302,190,284,185,309,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18,170,295,180,274,176,297, +197,286,196,294,192,301,186,306,180,310,172,311,164,310,157,306,152,301,149,294,147,286,149,278,152,272,157,266,164,263,171,262,179,263,186,266,192,272,196,278,197,286,16383,16383,98,286,96,294,93,301,87,306,80,310,73,311,65,310,58,306,53,301,49,294,48,286,49,278,53,272,58,266,64,263,72,262,80,263,87,266,93,272,96,278,98,286,16383,16383,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114,20,75,35,42,58,17,88,1,123,-4,160,1,191,17,215,43,230,76,235,116,16383,16383,190,102,187,70,180,44,168,25,151,13,131,9,120,10,110,13,101,18,93,25,86,34,76,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,98,212,118,216,130,215,140,211,149,206,158,199,165,191,174,177,181,161,186,142,189,122,190,102,169,229,168,238,164,246,158,252,150,256,142,258,133,256,125,252,119,246,115,239,113,230,115,221,119,214,125,208,132,204,141,203,150,204,158,208,164,214,168,221,169,229,16383,16383,267,110,267,143,15,143,15,110,16383,16383,169,22,168,31,164,38,158,45,150,49,142,50,133,49,125,45,119,39,115,31,113,22,115,14,119,6,125,0,132,-3,141,-4,150,-3,158,0,164,6,168,13,169,22,219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,82,202, +48,286,49,278,49,294,49,294,49,278,53,272,49,294,53,272,53,301,53,301,53,272,58,266,53,301,58,266,58,306,58,306,58,266,64,263,58,306,64,263,65,310,65,310,64,263,72,262,65,310,72,262,73,311,73,311,72,262,80,263,73,311,80,263,80,310,80,310,80,263,87,266,80,310,87,266,87,306,87,306,87,266,93,272,87,306,93,272,93,301,93,301,93,272,96,278,93,301,96,278,96,294,96,294,96,278,98,286,64,91,58,17,69,70,69,70,58,17,88,1,69,70,88,1,76,51,76,51,88,1,86,34,93,25,86,34,88,1,93,25,88,1,123,-4,162,225,127,230,130,215,130,215,127,230,118,216,98,212,118,216,127,230,98,212,127,230,90,225,147,286,149,278,149,294,149,294,149,278,152,272,149,294,152,272,152,301,152,301,152,272,157,266,152,301,157,266,157,306,157,306,157,266,164,263,157,306,164,263,164,310,164,310,164,263,171,262,164,310,171,262,172,311,172,311,171,262,179,263,172,311,179,263,180,310,180,310,179,263,186,266,180,310,186,266,186,306,186,306,186,266,192,272,186,306,192,272,192,301,192,301,192,272,196,278,192,301,196,278,196,294,196,294,196,278,197,286,187,70,180,44,191,17,191,17,180,44,168,25,191,17,168,25,160,1,160,1,168,25,151,13,160,1,151,13,131,9,131,9,120,10,123,-4,123,-4,120,10,110,13,123,-4,110,13,101,18,140,211,149,206,162,225,162,225,149,206,158,199,162,225,158,199,165,191,165,191,174,177,191,210,191,210,174,177,181,161,191,210,181,161,186,142,230,154,215,186,215,43,230,154,215,43,230,76,230,154,230,76,235,116,187,70,191,17,190,102,190,102,191,17,191,210,191,210,191,17,215,43,191,210,215,43,215,186,191,210,186,142,189,122,191,210,189,122,190,102,191,210,162,225,165,191,131,9,123,-4,160,1,58,17,61,113,60,137,60,137,62,164,58,209,58,209,62,164,70,186,58,209,70,186,90,225,90,225,70,186,82,202,90,225,82,202,98,212,58,17,60,137,58,209,58,17,58,209,35,42,35,42,58,209,35,185,35,42,35,185,20,75,20,75,35,185,20,153,20,75,20,153,15,114,61,113,58,17,64,91,162,225,130,215,140,211,93,25,123,-4,101,18, +169,229,168,238,164,246,158,252,150,256,142,258,133,256,125,252,119,246,115,239,113,230,115,221,119,214,125,208,132,204,141,203,150,204,158,208,164,214,168,221,169,229,16383,16383,267,110,267,143,15,143,15,110,16383,16383,169,22,168,31,164,38,158,45,150,49,142,50,133,49,125,45,119,39,115,31,113,22,115,14,119,6,125,0,132,-3,141,-4,150,-3,158,0,164,6,168,13,169,22,219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186, +113,230,115,221,115,239,115,239,115,221,119,214,115,239,119,214,119,246,119,246,119,214,125,208,119,246,125,208,125,252,125,252,125,208,132,204,125,252,132,204,133,256,133,256,132,204,141,203,133,256,141,203,142,258,142,258,141,203,150,204,142,258,150,204,150,256,150,256,150,204,158,208,150,256,158,208,158,252,158,252,158,208,164,214,158,252,164,214,164,246,164,246,164,214,168,221,164,246,168,221,168,238,168,238,168,221,169,229,15,143,15,110,267,110,15,143,267,110,267,143,113,22,115,14,115,31,115,31,115,14,119,6,115,31,119,6,119,39,119,39,119,6,125,0,119,39,125,0,125,45,125,45,125,0,132,-3,125,45,132,-3,133,49,133,49,132,-3,141,-4,133,49,141,-4,142,50,142,50,141,-4,150,-3,142,50,150,-3,150,49,150,49,150,-3,158,0,150,49,158,0,158,45,158,45,158,0,164,6,158,45,164,6,164,38,164,38,164,6,168,13,164,38,168,13,168,31,168,31,168,13,169,22, +219,276,199,276,171,221,161,224,152,227,143,229,134,230,124,230,88,224,58,208,35,184,20,152,15,113,15,100,17,87,20,74,30,50,35,42,40,36,46,29,53,22,63,14,26,-55,45,-55,77,6,87,1,105,-3,114,-4,123,-4,159,1,190,18,214,44,229,78,235,117,233,141,227,162,218,181,204,198,186,213,16383,16383,79,46,72,63,66,81,63,99,60,118,60,138,62,164,70,186,82,202,99,212,118,216,127,215,135,213,143,210,151,205,158,198,16383,16383,170,183,178,167,183,152,187,136,189,120,190,102,187,69,180,44,168,25,151,13,131,9,121,10,112,12,104,16,97,22,89,30,170,253,97,328,92,332,88,335,84,337,80,338,75,339,69,338,64,336,61,333,58,329,57,323,58,318,60,314,63,309,67,305,73,301,150,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18, +63,14,63,14,45,-55,63,14,45,-55,77,6,63,14,77,6,63,99,63,14,63,99,60,118,63,14,60,118,60,138,63,14,60,138,58,208,63,14,58,208,53,22,58,208,35,184,35,42,58,208,35,42,40,36,58,208,40,36,46,29,58,208,46,29,53,22,35,184,20,152,20,74,35,184,20,74,25,62,35,184,25,62,30,50,35,184,30,50,35,42,20,152,15,113,15,100,20,152,15,100,17,87,20,152,17,87,20,74,124,230,118,216,127,215,124,230,127,215,134,230,134,230,127,215,135,213,134,230,135,213,143,229,143,229,135,213,143,210,143,229,143,210,152,227,152,227,143,210,151,205,152,227,151,205,158,198,187,69,180,44,190,18,190,18,180,44,168,25,190,18,168,25,159,1,159,1,168,25,151,13,159,1,151,13,131,9,131,9,121,10,123,-4,123,-4,121,10,114,-4,112,12,104,16,105,-3,112,12,105,-3,114,-4,112,12,114,-4,121,10,87,1,96,-1,89,30,89,30,96,-1,97,22,97,22,96,-1,105,-3,97,22,105,-3,104,16,161,224,158,198,170,183,161,224,170,183,171,221,171,221,170,183,178,167,171,221,178,167,186,213,186,213,178,167,183,152,186,213,183,152,187,136,199,276,171,221,186,213,199,276,186,213,219,276,158,198,79,46,89,30,158,198,89,30,170,183,79,46,72,63,77,6,79,46,77,6,87,1,79,46,87,1,89,30,66,81,63,99,77,6,66,81,77,6,72,63,229,78,235,117,233,141,229,78,233,141,227,162,229,78,227,162,218,181,229,78,218,181,214,44,187,69,190,18,190,102,190,102,190,18,204,198,204,198,190,18,214,44,204,198,214,44,218,181,186,213,187,136,204,198,204,198,187,136,189,120,204,198,189,120,190,102,131,9,123,-4,159,1,70,186,82,202,88,224,88,224,82,202,99,212,88,224,99,212,124,230,124,230,99,212,118,216,60,138,62,164,58,208,58,208,62,164,70,186,58,208,70,186,88,224,45,-55,63,14,26,-55,152,227,158,198,161,224, +170,253,97,328,92,332,88,335,84,337,80,338,75,339,69,338,64,336,61,333,58,329,57,323,58,318,60,314,63,309,67,305,73,301,150,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,78,253,98,253,175,302,181,306,185,310,188,314,189,318,190,323,189,329,187,333,183,336,179,338,172,339,168,338,165,337,161,335,156,332,151,328,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18, +150,253,170,253,97,328,150,253,97,328,92,332,150,253,92,332,88,335,150,253,88,335,84,337,150,253,84,337,80,338,150,253,80,338,75,339,150,253,75,339,73,301,57,323,58,318,58,329,58,329,58,318,60,314,58,329,60,314,61,333,61,333,60,314,63,309,61,333,63,309,64,336,64,336,63,309,67,305,64,336,67,305,69,338,69,338,67,305,73,301,69,338,73,301,75,339,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,184,168,38,209,225,209,225,168,38,169,38,209,225,169,38,171,-3,171,-3,169,38,169,-2,168,38,166,184,166,69,168,38,166,69,166,59,168,38,166,59,164,53,155,40,153,21,168,38,225,26,217,29,225,14,225,14,217,29,212,34,225,14,212,34,212,10,212,10,212,34,209,42,212,10,209,42,199,6,199,6,209,42,209,54,199,6,209,54,209,225,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,38,38,36,185,36,59,145,215,129,225,129,217,17,216,4,225,4,218, +78,253,98,253,175,302,181,306,185,310,188,314,189,318,190,323,189,329,187,333,183,336,179,338,172,339,168,338,165,337,161,335,156,332,151,328,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286, +209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,172,339,175,302,179,338,179,338,175,302,181,306,179,338,181,306,183,336,183,336,181,306,185,310,183,336,185,310,187,333,187,333,185,310,188,314,187,333,188,314,189,329,189,329,188,314,189,318,189,329,189,318,190,323,175,302,172,339,168,338,175,302,168,338,165,337,175,302,165,337,161,335,175,302,161,335,156,332,175,302,156,332,151,328,175,302,151,328,98,253,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,98,253,151,328,78,253,145,215,129,225,129,217, +200,253,138,337,107,337,45,253,62,253,123,305,184,253,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,148,278,151,272,157,266,163,263,171,262,179,263,186,266,192,272,195,278,196,286,16383,16383,97,286,96,294,92,301,87,306,80,310,72,311,64,310,58,306,52,301,49,294,47,286,49,278,52,272,57,266,64,263,71,262,79,263,86,266,92,272,96,278,97,286,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43, +209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,45,253,62,253,107,337,107,337,62,253,123,305,107,337,123,305,138,337,138,337,123,305,184,253,138,337,184,253,200,253,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,145,215,129,225,129,217, +196,286,195,294,192,301,186,306,179,310,171,311,164,310,157,306,152,301,148,294,147,286,148,278,151,272,157,266,163,263,171,262,179,263,186,266,192,272,195,278,196,286,16383,16383,97,286,96,294,92,301,87,306,80,310,72,311,64,310,58,306,52,301,49,294,47,286,49,278,52,272,57,266,64,263,71,262,79,263,86,266,92,272,96,278,97,286,16383,16383,240,25,237,25,225,26,217,29,212,34,209,42,209,225,129,225,129,217,145,215,155,212,162,206,165,197,166,184,166,59,164,53,162,48,159,43,147,34,139,29,130,26,121,25,113,24,102,26,92,31,84,40,79,51,78,64,78,225,4,225,4,218,17,216,26,213,32,207,35,197,36,185,36,59,38,38,46,20,58,6,75,-1,97,-4,109,-3,123,0,138,8,153,21,168,38,169,38,169,-2,171,-3,186,1,199,6,225,14,240,18,71,253,92,253,169,302,174,306,178,310,181,314,183,318,184,323,183,329,181,333,177,336,172,338,166,339,158,337,154,335,150,332,145,328,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,79,339,76,342,63,337,51,333,38,329,23,325, +209,225,129,225,145,215,209,225,145,215,155,212,209,225,155,212,162,206,209,225,162,206,165,197,209,225,165,197,166,184,209,225,166,184,168,38,209,225,168,38,169,38,209,225,169,38,171,-3,209,225,171,-3,186,1,209,225,186,1,199,6,209,225,199,6,209,54,166,184,166,69,168,38,237,25,225,26,225,14,237,25,225,14,240,18,237,25,240,18,240,25,209,54,199,6,209,42,209,42,199,6,212,10,209,42,212,10,212,34,212,34,212,10,225,14,212,34,225,14,217,29,217,29,225,14,225,26,147,286,148,278,148,294,148,294,148,278,151,272,148,294,151,272,152,301,152,301,151,272,157,266,152,301,157,266,157,306,157,306,157,266,163,263,157,306,163,263,164,310,164,310,163,263,171,262,164,310,171,262,171,311,171,311,171,262,179,263,171,311,179,263,179,310,179,310,179,263,186,266,179,310,186,266,186,306,186,306,186,266,192,272,186,306,192,272,192,301,192,301,192,272,195,278,192,301,195,278,195,294,195,294,195,278,196,286,47,286,49,278,49,294,49,294,49,278,52,272,49,294,52,272,52,301,52,301,52,272,57,266,52,301,57,266,58,306,58,306,57,266,64,263,58,306,64,263,64,310,64,310,64,263,71,262,64,310,71,262,72,311,72,311,71,262,79,263,72,311,79,263,80,310,80,310,79,263,86,266,80,310,86,266,87,306,87,306,86,266,92,272,87,306,92,272,92,301,92,301,92,272,96,278,92,301,96,278,96,294,96,294,96,278,97,286,78,225,4,225,17,216,78,225,17,216,26,213,78,225,26,213,32,207,78,225,32,207,35,197,78,225,35,197,36,185,78,225,36,185,38,38,78,225,38,38,46,20,78,225,46,20,58,6,78,225,58,6,75,-1,78,225,75,-1,78,64,164,53,162,48,168,38,168,38,162,48,159,43,168,38,159,43,155,40,155,40,147,34,153,21,153,21,147,34,139,29,153,21,139,29,138,8,138,8,139,29,130,26,138,8,130,26,123,0,123,0,130,26,121,25,123,0,121,25,113,24,113,24,102,26,109,-3,109,-3,102,26,97,-4,97,-4,102,26,92,31,97,-4,92,31,84,40,97,-4,84,40,79,51,97,-4,79,51,75,-1,78,64,75,-1,79,51,113,24,109,-3,123,0,166,59,164,53,168,38,166,59,168,38,166,69,155,40,153,21,168,38,38,38,36,185,36,59,171,-3,169,38,169,-2,17,216,4,225,4,218,145,215,129,225,129,217, +71,253,92,253,169,302,174,306,178,310,181,314,183,318,184,323,183,329,181,333,177,336,172,338,166,339,158,337,154,335,150,332,145,328,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,79,339,76,342,63,337,51,333,38,329,23,325,4,320,4,311,8,311,9,312,13,312,23,311,30,308,35,303,37,295,37,-76,34,-86,27,-92,17,-96,2,-98,2,-107,123,-107,123,-98,104,-97,91,-93,84,-87,80,-75,79,-59,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,160,221,190,204,212,180,225,151,230,135,229,120,224,106,216,92,205,79,190,16383,16383,79,166,83,175,91,184,103,192,117,198,131,200,152,196,170,185,182,166,189,140,192,107,189,75,181,49,169,29,152,16,131,11,117,13,103,19,91,27,82,36,79,45,198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286, +166,339,169,302,172,338,172,338,169,302,174,306,172,338,174,306,177,336,177,336,174,306,178,310,177,336,178,310,181,333,181,333,178,310,181,314,181,333,181,314,183,329,183,329,181,314,183,318,183,329,183,318,184,323,169,302,166,339,162,338,169,302,162,338,158,337,169,302,158,337,154,335,169,302,154,335,150,332,169,302,150,332,145,328,169,302,145,328,92,253,90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218,92,253,145,328,71,253, +79,339,76,342,63,337,51,333,38,329,23,325,4,320,4,311,8,311,9,312,13,312,23,311,30,308,35,303,37,295,37,-76,34,-86,27,-92,17,-96,2,-98,2,-107,123,-107,123,-98,104,-97,91,-93,84,-87,80,-75,79,-59,79,17,90,8,99,2,108,-1,118,-3,130,-4,164,1,193,19,215,47,230,82,235,123,231,160,221,190,204,212,180,225,151,230,135,229,120,224,106,216,92,205,79,190,16383,16383,79,166,83,175,91,184,103,192,117,198,131,200,152,196,170,185,182,166,189,140,192,107,189,75,181,49,169,29,152,16,131,11,117,13,103,19,91,27,82,36,79,45,198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,16383,16383,99,286,97,294,94,301,88,306,81,310,74,311,66,310,59,306,54,301,50,294,49,286,50,278,54,272,59,266,65,263,73,262,81,263,88,266,94,272,97,278,99,286,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214, +34,-86,27,-92,123,-107,123,-107,27,-92,17,-96,123,-107,17,-96,2,-98,8,311,9,312,23,325,23,325,9,312,11,312,23,325,11,312,13,312,13,312,23,311,23,325,23,325,23,311,38,329,23,325,4,320,6,311,23,325,6,311,8,311,30,308,35,303,38,329,38,329,35,303,37,295,38,329,37,295,37,284,80,-75,37,284,37,-63,80,-75,37,-63,84,-87,84,-87,37,-63,91,-93,79,190,79,339,76,342,79,190,76,342,79,-59,79,190,79,-59,79,166,79,190,79,166,92,205,235,123,231,160,230,82,230,82,231,160,221,190,230,82,221,190,215,47,215,47,221,190,204,212,215,47,204,212,193,19,193,19,204,212,192,107,193,19,192,107,189,75,193,19,189,75,181,49,152,196,170,185,180,225,180,225,170,185,182,166,180,225,182,166,204,212,204,212,182,166,189,140,204,212,189,140,192,107,135,229,131,200,152,196,135,229,152,196,151,230,151,230,152,196,180,225,108,-1,118,-3,117,13,117,13,118,-3,131,11,152,16,131,11,164,1,152,16,164,1,169,29,169,29,164,1,193,19,169,29,193,19,181,49,131,11,118,-3,130,-4,131,11,130,-4,164,1,123,-107,123,-98,104,-97,123,-107,104,-97,91,-93,123,-107,91,-93,37,-76,123,-107,37,-76,34,-86,82,36,79,45,90,8,90,8,79,45,79,17,80,-75,79,-59,51,333,80,-75,51,333,38,329,63,337,51,333,79,-59,63,337,79,-59,76,342,83,175,91,184,92,205,92,205,91,184,103,192,92,205,103,192,106,216,106,216,103,192,117,198,106,216,117,198,120,224,120,224,117,198,131,200,120,224,131,200,135,229,82,36,90,8,91,27,91,27,90,8,99,2,91,27,99,2,103,19,103,19,99,2,108,-1,103,19,108,-1,117,13,92,205,79,166,83,175,6,311,4,320,4,311,123,-107,2,-98,2,-107,37,-76,91,-93,37,-63,37,284,80,-75,38,329,38,329,23,311,30,308, +198,286,197,294,193,301,188,306,181,310,173,311,165,310,159,306,153,301,150,294,148,286,150,278,153,272,158,266,165,263,172,262,180,263,187,266,193,272,197,278,198,286,16383,16383,99,286,97,294,94,301,88,306,81,310,74,311,66,310,59,306,54,301,50,294,49,286,50,278,54,272,59,266,65,263,73,262,81,263,88,266,94,272,97,278,99,286,16383,16383,238,225,171,225,171,218,179,217,186,216,190,213,193,210,194,205,194,202,193,201,193,198,192,196,143,59,88,184,82,196,81,201,81,204,82,209,85,212,90,215,98,217,109,218,109,225,7,225,7,218,14,217,21,214,26,211,30,206,33,200,99,60,105,47,111,35,116,24,121,9,119,2,116,-8,112,-21,106,-34,100,-44,96,-51,85,-62,80,-65,75,-66,71,-66,69,-65,66,-64,62,-63,63,-63,57,-60,52,-58,42,-56,36,-56,30,-57,24,-60,19,-65,16,-72,15,-79,17,-88,21,-96,28,-102,38,-106,50,-108,71,-105,90,-94,106,-76,122,-49,137,-11,213,192,217,202,221,208,226,213,231,216,238,218,256,359,256,387,100,387,100,359,16383,16383,353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,23,259,21,258,18,256,16,250,12,242,10,235,10,226,9,226,0,16383,16383,224,128,108,128,166,266,190,253,190,281,35,281,35,253,16383,16383,221,33,216,29,208,25,200,23,195,25,190,28,187,35,185,44,184,56,184,168,183,181,180,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,208,83,213,93,217,104,218,117,216,128,211,136,202,142,190,143,173,143,146,114,135,92,126,75,118,63,112,54,105,42,97, +148,286,150,278,150,294,150,294,150,278,153,272,150,294,153,272,153,301,153,301,153,272,158,266,153,301,158,266,159,306,159,306,158,266,165,263,159,306,165,263,165,310,165,310,165,263,172,262,165,310,172,262,173,311,173,311,172,262,180,263,173,311,180,263,181,310,181,310,180,263,187,266,181,310,187,266,188,306,188,306,187,266,193,272,188,306,193,272,193,301,193,301,193,272,197,278,193,301,197,278,197,294,197,294,197,278,198,286,49,286,50,278,50,294,50,294,50,278,54,272,50,294,54,272,54,301,54,301,54,272,59,266,54,301,59,266,59,306,59,306,59,266,65,263,59,306,65,263,66,310,66,310,65,263,73,262,66,310,73,262,74,311,74,311,73,262,81,263,74,311,81,263,81,310,81,310,81,263,88,266,81,310,88,266,88,306,88,306,88,266,94,272,88,306,94,272,94,301,94,301,94,272,97,278,94,301,97,278,97,294,97,294,97,278,99,286,90,-57,85,-62,90,-94,90,-94,85,-62,80,-65,90,-94,80,-65,75,-66,75,-66,73,-66,90,-94,90,-94,73,-66,71,-105,90,-57,106,-76,96,-51,96,-51,106,-76,100,-44,106,-34,100,-44,106,-76,106,-34,106,-76,122,-49,143,59,88,184,99,60,143,59,99,60,105,47,143,59,105,47,111,35,143,59,111,35,116,24,143,59,116,24,119,15,143,59,119,15,121,9,143,59,121,9,122,-49,143,59,122,-49,137,-11,143,59,137,-11,213,192,143,59,213,192,192,196,122,-49,121,9,119,2,99,60,88,184,86,188,99,60,86,188,84,192,99,60,84,192,82,196,99,60,82,196,81,201,99,60,81,201,33,200,33,200,81,201,81,204,81,204,82,209,33,200,33,200,82,209,85,212,33,200,85,212,109,225,109,225,85,212,90,215,109,225,90,215,98,217,194,202,193,201,213,192,213,192,193,201,193,198,213,192,193,198,192,196,238,225,171,225,179,217,238,225,179,217,186,216,238,225,186,216,190,213,238,225,190,213,193,210,238,225,193,210,194,205,238,225,194,205,226,213,238,225,226,213,231,216,238,225,231,216,238,218,194,205,213,192,217,202,194,205,217,202,221,208,194,205,221,208,226,213,194,204,194,202,213,192,194,204,213,192,194,205,122,-49,119,2,116,-8,122,-49,116,-8,112,-21,122,-49,112,-21,106,-34,71,-105,73,-66,71,-66,71,-105,71,-66,69,-65,71,-105,69,-65,66,-64,71,-105,66,-64,63,-63,71,-105,63,-63,57,-60,71,-105,57,-60,52,-58,71,-105,52,-58,50,-108,52,-58,47,-57,50,-108,50,-108,47,-57,42,-56,50,-108,42,-56,38,-106,38,-106,42,-56,36,-56,38,-106,36,-56,30,-57,38,-106,30,-57,28,-102,28,-102,30,-57,24,-60,28,-102,24,-60,21,-96,21,-96,24,-60,19,-65,21,-96,19,-65,17,-88,17,-88,19,-65,16,-72,17,-88,16,-72,15,-79,98,217,109,218,109,225,109,225,7,225,14,217,109,225,14,217,21,214,109,225,21,214,26,211,109,225,26,211,30,206,109,225,30,206,33,200,66,-64,62,-63,63,-63,14,217,7,225,7,218,90,-57,90,-94,106,-76,179,217,171,225,171,218, +166,253,94,328,89,332,85,335,81,337,73,339,66,338,61,336,58,333,55,329,55,318,57,314,60,309,70,301,147,253,55,253,75,253,151,301,157,305,161,309,164,314,166,318,166,329,163,333,160,336,155,338,148,339,140,337,136,335,132,332, +147,253,166,253,94,328,147,253,94,328,89,332,147,253,89,332,85,335,147,253,85,335,81,337,147,253,81,337,77,338,147,253,77,338,73,339,147,253,73,339,70,301,55,323,55,318,55,329,55,329,55,318,57,314,55,329,57,314,58,333,58,333,57,314,60,309,58,333,60,309,61,336,61,336,60,309,65,305,61,336,65,305,66,338,66,338,65,305,70,301,66,338,70,301,73,339, +55,253,75,253,151,301,157,305,161,309,164,314,166,318,166,329,163,333,160,336,155,338,148,339,140,337,136,335,132,332,127,328,203,253,140,337,109,337,47,253,64,253,124,305,185,253,193,319,188,309,183,302,178,297,173,294,161,294,155,295,148,298,139,302, +148,339,151,301,155,338,155,338,151,301,157,305,155,338,157,305,160,336,160,336,157,305,161,309,160,336,161,309,163,333,163,333,161,309,164,314,163,333,164,314,166,329,166,329,164,314,166,318,166,329,166,318,166,323,151,301,148,339,144,338,151,301,144,338,140,337,151,301,140,337,136,335,151,301,136,335,132,332,151,301,132,332,127,328,151,301,127,328,75,253,127,328,55,253,75,253, +203,253,140,337,109,337,47,253,64,253,124,305,185,253,193,319,188,309,183,302,178,297,173,294,161,294,155,295, +47,253,64,253,109,337,109,337,64,253,124,305,109,337,124,305,140,337,140,337,124,305,185,253,140,337,185,253,203,253, +193,319,188,309,183,302,178,297,173,294,161,294,155,295,148,298,139,302,128,307,121,311,107,315,100,316,93,316,79,314,67,308,56,298,48,284,42,266,57,266,61,274,65,281,70,285,76,288,83,289,88,289,92,288,98,286,105,282,114,278,125,273,134,269,141,267,148,266,155,266,170,268,182,274,192,284,201,299,208,319,203,273,203,300,47,300,47,273,250,385,250,410,0,410,0,385,180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,78,267,98,257,123,253,145,256,164,266,178,281,188,303,194,332,150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294, +61,274,65,281,67,308,67,308,65,281,70,285,67,308,70,285,79,314,79,314,70,285,76,288,79,314,76,288,83,289,83,289,88,289,93,316,93,316,88,289,92,288,93,316,92,288,98,286,57,266,61,274,67,308,57,266,67,308,56,298,57,266,56,298,48,284,57,266,48,284,42,266,155,266,170,268,161,294,161,294,170,268,166,294,173,294,166,294,170,268,173,294,170,268,182,274,193,319,188,309,192,284,193,319,192,284,201,299,193,319,201,299,208,319,183,302,178,297,182,274,183,302,182,274,192,284,183,302,192,284,188,309,114,313,114,278,121,311,121,311,114,278,125,273,121,311,125,273,128,307,128,307,125,273,134,269,128,307,134,269,139,302,139,302,134,269,141,267,139,302,141,267,148,298,148,298,141,267,148,266,148,298,148,266,155,295,155,295,148,266,155,266,155,295,155,266,161,294,93,316,98,286,100,316,100,316,98,286,105,282,100,316,105,282,107,315,107,315,105,282,114,278,107,315,114,278,114,313,93,316,79,314,83,289,173,294,182,274,178,297, +203,273,203,300,47,300,47,273,250,385,250,410,0,410,0,385, +203,273,203,300,47,300,203,273,47,300,47,273, +250,385,250,410,0,410,0,385,180,332,171,313,162,300,151,290, +250,385,250,410,0,410,250,385,0,410,0,385, +180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283,78,267,98,257,123,253,145,256,164,266,178,281,188,303,194,332,150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,100,286,101,278,105,272,110,266,117,263,124,262,132,263,139,266,145,271,148,278,150,286,200,286, +107,285,93,291,98,257,98,257,93,291,82,301,98,257,82,301,78,267,78,267,82,301,73,315,78,267,73,315,68,332,171,313,162,300,164,266,164,266,162,300,151,290,164,266,151,290,145,256,145,256,151,290,139,285,145,256,139,285,124,283,124,283,107,285,123,253,123,253,107,285,98,257,68,332,54,332,56,305,68,332,56,305,64,283,68,332,64,283,78,267,180,332,171,313,178,281,180,332,178,281,188,303,180,332,188,303,194,332,124,283,123,253,145,256,171,313,164,266,178,281, +150,286,148,294,145,301,140,306,133,310,124,311,116,310,109,306,104,301,101,294,100,286,101,278,105,272,110,266,117,263,124,262,132,263,139,266,145,271,148,278,150,286,200,286,198,294,195,301,189,306,182,310,175,311,167,310,160,306,155,301,151,294,150,286,151,278,155,272,160,266,166,263,174,262,182,263,189,266,195,272,198,278,200,286, +124,262,132,263,133,310,133,310,132,263,139,266,133,310,139,266,140,306,140,306,139,266,145,271,140,306,145,271,145,301,145,301,145,271,148,278,145,301,148,278,148,294,148,294,148,278,150,286,101,294,101,278,104,301,104,301,101,278,105,272,104,301,105,272,109,306,109,306,105,272,110,266,109,306,110,266,116,310,116,310,110,266,117,263,116,310,117,263,124,311,124,311,117,263,124,262,124,311,124,262,133,310,101,278,101,294,100,286, +200,286,198,294,195,301,189,306,182,310,175,311,167,310,160,306,155,301,151,294,150,286,151,278,155,272,160,266,166,263,174,262,182,263,189,266,195,272,198,278,200,286,16383,16383,100,286,99,294,95,301,90,306,83,310,75,311,67,310,60,306,55,301,51,294,50,286,51,278,55,272,60,266,67,263,75,262,83,263,90,266,95,272,99,278,100,286,109,291,109,246,126,246,127,263,131,263,147,266,160,274,171,287,178,303,181,321,179,337,175,352,165,364,150,373,129,376,122,375,116,374,109,372,104,370,99,367,94,363,91,359,88,354,86,346,87,342,89,338,92,335,96,333,100,332,109,335,113,343,116,353,121,361,131,364,139,362,146,356,150,347,153,336,153,325,152,314,146,304,138,297,128,292, +75,311,75,262,83,310,83,310,75,262,83,263,83,310,83,263,90,306,90,306,83,263,90,266,90,306,90,266,95,301,95,301,90,266,95,272,95,301,95,272,99,294,99,294,95,272,99,278,99,294,99,278,100,286,50,286,51,278,51,294,51,294,51,278,55,272,51,294,55,272,55,301,55,301,55,272,60,266,55,301,60,266,60,306,60,306,60,266,67,263,60,306,67,263,67,310,67,310,67,263,75,262,67,310,75,262,75,311,150,286,151,278,151,294,151,294,151,278,155,272,151,294,155,272,155,301,155,301,155,272,160,266,155,301,160,266,160,306,160,306,160,266,166,263,160,306,166,263,167,310,167,310,166,263,174,262,167,310,174,262,175,311,175,311,174,262,182,263,175,311,182,263,182,310,182,310,182,263,189,266,182,310,189,266,189,306,189,306,189,266,195,272,189,306,195,272,195,301,195,301,195,272,198,278,195,301,198,278,198,294,198,294,198,278,200,286, +109,291,109,246,126,246,127,263,131,263,147,266,160,274,171,287,178,303,181,321,179,337,175,352,165,364,150,373,129,376,122,375,116,374,109,372,104,370,99,367,94,363,91,359,88,354,86,346,87,342,89,338,92,335,96,333,100,332,109,335,113,343,116,353,121,361,131,364,139,362,146,356,150,347,153,336,153,325,152,314,146,304,138,297,128,292,116,291,175,305,173,321,165,335,155,346,141,353,126,355,110,353,96,346,85,335,78,322,75,306,78,290,85,276,95,266,109,259,124,256,140,259,154,266,165,276,173,290,175,305,16383,16383,158,306,156,295,152,286,144,279,135,275,124,273,114,275,106,279,99,286,94,295,93,306,94,316,99,325,106,332,115,337,124,339,135,337,144,332,151,325,156,316,158,306,118,253, +131,364,129,376,122,375,131,364,122,375,121,361,131,364,150,373,129,376,121,361,122,375,116,353,116,353,122,375,116,374,116,353,116,374,113,343,113,343,116,374,109,372,113,343,109,372,109,335,109,335,109,372,104,370,109,335,104,370,100,332,100,332,104,370,99,367,100,332,99,367,96,333,96,333,99,367,94,363,96,333,94,363,92,335,92,335,94,363,91,359,92,335,91,359,89,338,89,338,91,359,88,354,89,338,88,354,87,342,87,342,88,354,87,350,87,342,87,350,86,346,181,321,179,337,178,303,178,303,179,337,175,352,178,303,175,352,171,287,171,287,175,352,165,364,171,287,165,364,160,274,160,274,165,364,153,325,153,336,153,325,165,364,153,336,165,364,150,373,153,336,150,373,150,347,150,373,131,364,139,362,150,373,139,362,146,356,150,373,146,356,150,347,152,314,146,304,147,266,152,314,147,266,160,274,152,314,160,274,153,325,126,246,127,263,128,292,128,292,127,263,131,263,128,292,131,263,138,297,138,297,131,263,147,266,138,297,147,266,146,304,126,246,128,292,116,291,126,246,116,291,109,291,126,246,109,291,109,246, +175,305,173,321,165,335,155,346,141,353,126,355,110,353,96,346,85,335,78,322,75,306,78,290,85,276,95,266,109,259,124,256,140,259,154,266,165,276,173,290,175,305,16383,16383,158,306,156,295,152,286,144,279,135,275,124,273,114,275,106,279,99,286,94,295,93,306,94,316,99,325,106,332,115,337,124,339,135,337,144,332,151,325,156,316,158,306,118,253,137,253,214,301,220,305,224,310,227,314,229,324,228,329,226,333,222,336,218,338,212,339,208,339,204,338,200,336,196,333,190,328,16383,16383,40,253,60,253,137,301,142,305,146,310,149,314,151,319,151,324,150,329,148,333,144,336,140,338,134,339,130,339,126,338,123,336,118,333,113,328,203,337,185,337,125,286,65,337,47,337,109,253,141,253, +156,295,152,286,154,266,154,266,152,286,144,279,154,266,144,279,140,259,140,259,144,279,135,275,140,259,135,275,124,256,124,256,135,275,124,273,126,355,124,339,135,337,126,355,135,337,141,353,141,353,135,337,144,332,141,353,144,332,155,346,155,346,144,332,151,325,155,346,151,325,156,316,175,305,173,321,173,290,173,290,173,321,165,335,173,290,165,335,165,276,165,276,165,335,158,306,156,316,158,306,165,335,156,316,165,335,155,346,156,295,154,266,165,276,156,295,165,276,158,306,99,325,106,332,110,353,110,353,106,332,115,337,110,353,115,337,126,355,126,355,115,337,124,339,96,346,85,335,93,306,96,346,93,306,94,316,96,346,94,316,99,325,96,346,99,325,110,353,99,286,94,295,95,266,95,266,94,295,93,306,114,275,106,279,109,259,114,275,109,259,124,256,114,275,124,256,124,273,99,286,95,266,109,259,99,286,109,259,106,279,75,306,78,290,78,322,78,322,78,290,85,276,78,322,85,276,85,335,85,335,85,276,95,266,85,335,95,266,93,306, +118,253,137,253,214,301,220,305,224,310,227,314,229,324,228,329,226,333,222,336,218,338,212,339,208,339,204,338,200,336,196,333,190,328,16383,16383,40,253,60,253,137,301,142,305,146,310,149,314,151,319,151,324,150,329,148,333,144,336,140,338,134,339,130,339,126,338,123,336,118,333,113,328,203,337,185,337,125,286,65,337,47,337,109,253,141,253,142,250,142,350,115,350,115,250,174,250,174,350,146,350,146,250,16383,16383,104,250,104,350,77,350,77,250,229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,121,333,119,329,118,324,118,319,120,314,123,310,127,305, +212,339,214,301,218,338,218,338,214,301,220,305,218,338,220,305,222,336,222,336,220,305,224,310,222,336,224,310,226,333,226,333,224,310,227,314,226,333,227,314,228,329,228,329,227,314,228,319,228,329,228,319,229,324,214,301,212,339,208,339,214,301,208,339,204,338,214,301,204,338,200,336,214,301,200,336,196,333,214,301,196,333,190,328,214,301,190,328,137,253,134,339,137,301,140,338,140,338,137,301,142,305,140,338,142,305,144,336,144,336,142,305,146,310,144,336,146,310,148,333,148,333,146,310,149,314,148,333,149,314,150,329,150,329,149,314,151,319,150,329,151,319,151,324,137,301,134,339,130,339,137,301,130,339,126,338,137,301,126,338,123,336,137,301,123,336,118,333,137,301,118,333,113,328,137,301,113,328,60,253,60,253,113,328,40,253,137,253,190,328,118,253, +203,337,185,337,125,286,65,337,47,337,109,253,141,253,142,250,142,350,115,350,115,250,174,250,174,350,146,350, +203,337,185,337,141,253,141,253,185,337,125,286,141,253,125,286,109,253,109,253,125,286,65,337,109,253,65,337,47,337, +142,250,142,350,115,350,115,250,174,250,174,350,146,350,146,250, +142,250,142,350,115,350,142,250,115,350,115,250, +174,250,174,350,146,350,146,250,16383,16383,104,250,104,350,77,350,77,250,229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336, +146,350,146,250,174,250,146,350,174,250,174,350,77,350,77,250,104,250,77,350,104,250,104,350, +229,253,156,328,151,333,146,336,142,338,138,339,134,339,129,338,124,336,121,333,119,329,118,324,118,319,120,314,123,310,127,305,132,301,209,253,16383,16383,151,253,78,328,73,333,68,336,64,338,60,339,56,339,51,338,46,336,43,333,40,329,40,319,42,314,44,310,49,305,54,301,131,253,150,358,148,366,145,373,140,379,133,382,124,383,116,382,109,379,104,373,101,366,100,358,101,351,105,344,110,339,117,335,124,334,132,335,139,339,145,344,148,350,150,358,16383,16383,180,332,171,313,162,300,151,290,139,285,124,283,107,285,93,291,82,301,73,315,68,332,54,332,56,305,64,283, +209,253,229,253,156,328,209,253,156,328,151,333,209,253,151,333,146,336,209,253,146,336,142,338,209,253,142,338,138,339,209,253,138,339,134,339,209,253,134,339,132,301,118,324,118,319,119,329,119,329,118,319,120,314,119,329,120,314,121,333,121,333,120,314,123,310,121,333,123,310,124,336,124,336,123,310,127,305,124,336,127,305,129,338,129,338,127,305,132,301,129,338,132,301,134,339,131,253,151,253,78,328,131,253,78,328,73,333,131,253,73,333,68,336,131,253,68,336,64,338,131,253,64,338,60,339,131,253,60,339,56,339,131,253,56,339,54,301,40,324,40,319,40,329,40,329,40,319,42,314,40,329,42,314,43,333,43,333,42,314,44,310,43,333,44,310,46,336,46,336,44,310,49,305,46,336,49,305,51,338,51,338,49,305,54,301,51,338,54,301,56,339, +353,0,353,9,340,12,330,17,321,26,314,38,306,55,184,337,174,337,70,93,55,58,44,34,33,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,99,108,230,108,251,61,257,45,259,38,260,31,261,26,260,22,258,18,256,15,252,13,248,12,226,9,226,0,16383,16383,224,128,108,128,166,266,211,175,235,181,254,191,268,205,277,224,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,292,116,281,138,263,155,239,167,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,162,310,192,302, +55,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,174,337,76,51,99,108,174,337,99,108,108,128,108,128,99,108,230,108,108,128,230,108,224,128,224,128,230,108,306,55,224,128,306,55,184,337,258,18,256,15,353,0,353,0,256,15,252,13,353,0,252,13,248,12,261,26,353,0,330,17,261,26,330,17,321,26,261,26,321,26,314,38,261,26,314,38,306,55,261,26,306,55,260,31,306,55,230,108,251,61,306,55,251,61,254,53,306,55,254,53,257,45,306,55,257,45,259,38,306,55,259,38,260,31,174,337,108,128,166,266,174,337,166,266,224,128,174,337,224,128,184,337,70,93,55,58,72,30,70,93,74,43,75,47,70,93,75,47,76,51,70,93,76,51,174,337,340,12,330,17,353,0,340,12,353,0,353,9,260,22,258,18,353,0,260,22,353,0,261,26,226,9,226,0,353,0,226,9,353,0,248,12,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,44,34,107,0,44,34,33,20,107,0,33,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,55,58, +211,175,235,181,254,191,268,205,277,224,280,248,274,277,258,300,232,317,195,327,148,331,8,331,8,321,29,320,43,316,51,308,55,295,56,275,56,56,55,37,51,24,42,16,29,11,8,9,8,0,177,0,217,4,250,15,275,34,291,58,296,89,292,116,281,138,263,155,239,167,211,174,16383,16383,108,183,108,303,109,307,112,310,115,312,119,313,162,310,192,302,213,289,225,270,228,245,225,223,214,205,197,193,172,186,139,183,16383,16383,108,163,140,163,171,161,198,155,220,142,234,121,239,89,234,59,220,39,198,26,170,20,138,18,126,19,118,21,112,26,109,32,108,41,289,247,286,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,62,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,126,11,113,16,105,24,101,37,100,56,100,292,101,300,103,306,106,310,111,311,118,312,206,312,232,310,251,303,264,291,272,273,276,247,338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184, +51,24,42,16,177,0,177,0,42,16,29,11,177,0,29,11,8,9,55,295,56,275,112,310,55,295,112,310,148,331,148,331,112,310,115,312,148,331,115,312,119,313,119,313,162,310,148,331,148,331,162,310,195,327,239,89,234,59,250,15,250,15,234,59,220,39,250,15,220,39,217,4,217,4,220,39,198,26,217,4,198,26,177,0,177,0,198,26,170,20,177,0,170,20,138,18,138,18,126,19,177,0,177,0,126,19,118,21,177,0,118,21,55,37,55,37,118,21,56,56,213,289,225,270,232,317,232,317,225,270,228,245,235,181,228,245,225,223,195,327,162,310,192,302,195,327,192,302,213,289,195,327,213,289,232,317,235,181,254,191,258,300,258,300,254,191,268,205,258,300,268,205,274,277,274,277,268,205,277,224,274,277,277,224,280,248,232,317,228,245,235,181,232,317,235,181,258,300,234,121,239,167,220,142,220,142,239,167,211,174,220,142,211,174,198,155,198,155,211,174,211,175,198,155,211,175,214,205,214,205,211,175,235,181,214,205,235,181,225,223,140,163,171,161,172,186,172,186,171,161,198,155,172,186,198,155,197,193,197,193,198,155,214,205,140,163,172,186,139,183,140,163,139,183,108,183,140,163,108,183,108,163,109,32,108,41,56,275,109,32,56,275,56,56,296,89,292,116,291,58,291,58,292,116,281,138,291,58,281,138,275,34,275,34,281,138,263,155,275,34,263,155,250,15,250,15,263,155,239,167,250,15,239,167,239,89,56,56,118,21,112,26,56,56,112,26,109,32,56,275,108,41,108,296,56,275,108,296,108,303,56,275,108,303,109,307,56,275,109,307,112,310,148,331,8,331,29,320,148,331,29,320,43,316,148,331,43,316,51,308,148,331,51,308,55,295,29,320,8,331,8,321,177,0,8,9,8,0,51,24,177,0,55,37,239,167,234,121,239,89, +289,247,286,331,6,331,6,321,25,319,38,315,45,307,49,294,50,276,50,62,49,40,45,25,37,16,25,12,6,9,6,0,146,0,146,9,126,11,113,16,105,24,101,37,100,56,100,292,101,300,103,306,106,310,111,311,118,312,206,312,232,310,251,303,264,291,272,273,276,247,338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184, +38,315,45,307,286,331,286,331,45,307,111,311,286,331,111,311,118,312,286,331,118,312,206,312,286,331,206,312,232,310,286,331,232,310,251,303,286,331,251,303,264,291,286,331,264,291,272,273,286,331,272,273,276,247,286,331,276,247,289,247,100,56,100,292,50,276,50,276,100,292,101,300,50,276,101,300,103,306,50,276,103,306,106,310,50,276,106,310,49,294,50,276,101,37,100,56,111,311,45,307,49,294,111,311,49,294,106,310,25,319,38,315,286,331,25,319,286,331,6,331,25,319,6,331,6,321,146,0,146,9,126,11,146,0,126,11,113,16,146,0,113,16,49,40,146,0,49,40,45,25,146,0,45,25,37,16,146,0,37,16,25,12,146,0,25,12,6,9,146,0,6,9,6,0,50,62,49,40,113,16,50,62,113,16,105,24,50,62,105,24,101,37,50,62,101,37,50,276, +338,0,184,337,174,337,24,0,16383,16383,262,46,68,46,166,266,299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19, +174,337,24,0,68,46,68,46,24,0,338,0,68,46,338,0,262,46,262,46,338,0,184,337,262,46,184,337,174,337,174,337,68,46,166,266,174,337,166,266,262,46, +299,84,285,84,271,57,254,38,230,26,197,20,151,18,132,19,117,21,108,25,102,31,100,42,100,164,176,164,198,162,213,158,222,150,229,136,233,115,244,115,244,232,233,232,229,212,222,198,213,190,198,185,176,184,100,184,100,294,101,302,103,307,106,310,111,312,118,312,179,311,219,306,243,297,255,282,261,259,273,259,271,331,6,331,6,321,25,320,38,315,45,307,49,294,50,275,50,57,49,37,45,24,38,16,25,12,6,9,6,0,276,0,299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274, +45,24,38,16,276,0,276,0,38,16,25,12,276,0,25,12,6,9,38,315,45,307,271,331,271,331,45,307,111,312,271,331,111,312,118,312,118,312,179,311,271,331,271,331,179,311,219,306,271,331,219,306,243,297,271,331,243,297,255,282,271,331,255,282,261,259,271,331,261,259,273,259,45,24,117,21,49,37,49,37,117,21,108,25,49,37,108,25,50,57,50,57,108,25,102,31,50,57,102,31,50,275,50,275,102,31,100,42,50,275,100,42,100,294,100,184,100,164,176,164,100,184,176,164,176,184,198,185,176,184,198,162,198,185,198,162,213,190,213,190,198,162,213,158,213,190,213,158,222,198,222,198,213,158,222,150,222,198,222,150,229,212,229,212,222,150,229,136,229,212,229,136,233,232,233,232,229,136,233,115,233,232,233,115,244,115,50,275,100,294,101,302,50,275,101,302,103,307,50,275,103,307,106,310,50,275,106,310,49,294,106,310,111,312,45,307,106,310,45,307,49,294,25,320,38,315,271,331,25,320,271,331,6,331,25,320,6,331,6,321,254,38,230,26,276,0,276,0,230,26,197,20,276,0,197,20,151,18,151,18,132,19,276,0,276,0,132,19,117,21,276,0,117,21,45,24,276,0,299,84,285,84,276,0,285,84,271,57,276,0,271,57,254,38,176,184,176,164,198,162,233,232,244,115,244,232,276,0,6,9,6,0, +299,88,287,88,282,72,278,59,273,49,266,40,257,33,249,28,240,24,228,21,215,20,199,19,73,19,289,324,289,331,26,331,16,246,29,246,32,260,35,271,38,279,43,287,50,295,58,301,68,306,81,309,97,311,117,312,224,312,5,7,5,0,286,0,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321, +35,271,38,279,26,331,26,331,38,279,43,287,26,331,43,287,50,295,50,295,58,301,26,331,26,331,58,301,68,306,26,331,68,306,81,309,73,19,289,324,224,312,224,312,289,324,289,331,224,312,289,331,117,312,97,311,117,312,289,331,97,311,289,331,26,331,26,331,16,246,29,246,26,331,29,246,32,260,26,331,32,260,35,271,224,312,5,7,73,19,73,19,5,7,286,0,73,19,286,0,199,19,199,19,286,0,215,20,278,59,273,49,286,0,286,0,273,49,266,40,286,0,266,40,257,33,257,33,249,28,286,0,286,0,249,28,240,24,286,0,240,24,228,21,286,0,299,88,287,88,286,0,287,88,282,72,286,0,282,72,278,59,286,0,5,7,5,0,215,20,286,0,228,21,26,331,81,309,97,311, +352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,211,331,211,321,231,319,244,315,251,307,255,294,256,274,256,180,104,180,104,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,157,256,157,256,62,255,41,252,26,244,17,232,12,212,9,212,0,251,118,249,129,247,142,245,170,245,189,246,197,247,204,251,220,238,220,235,211,231,203,226,197,218,193,209,191,156,191,146,192,139,196,133,201,129,209,124,220,112,220,114,210,116,197,117,184,117,172,118,161,118,153,115,126,113,118,125,118,129,129,134,138,139,144,146,148,156,149,209,149,219,148,226,144,231,137,235,128,238,118,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24, +49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,149,331,9,331,28,319,149,331,28,319,41,315,149,331,41,315,49,307,149,331,49,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,105,38,104,56,104,180,104,157,256,157,104,180,256,157,256,180,256,180,256,157,312,25,256,180,312,25,308,37,54,274,104,56,104,274,54,274,104,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,255,294,320,315,255,294,256,274,308,37,256,274,256,180,307,55,307,274,256,274,256,274,307,274,308,293,256,274,308,293,312,307,352,331,211,331,231,319,352,331,231,319,244,315,352,331,244,315,251,307,352,331,251,307,255,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,256,62,255,41,320,17,256,62,320,17,312,25,256,62,312,25,256,157,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,54,61,53,39,117,17,54,61,117,17,109,25,54,61,109,25,105,38,54,61,105,38,54,274,148,0,9,9,9,0,352,0,212,9,212,0,256,274,308,37,307,55,231,319,211,331,211,321,320,315,256,274,312,307,28,319,9,331,9,321, +251,118,249,129,247,142,245,170,245,189,246,197,247,204,251,220,238,220,235,211,231,203,226,197,218,193,209,191,156,191,146,192,139,196,133,201,129,209,124,220,112,220,114,210,116,197,117,184,117,172,118,161,118,153,115,126,113,118,125,118,129,129,134,138,139,144,146,148,156,149,209,149,219,148,226,144,231,137,235,128,238,118,16383,16383,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337, +207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,134,308,149,314,180,338,180,338,149,314,164,318,180,338,164,318,180,320,180,320,194,319,235,330,235,330,194,319,207,316,235,330,180,338,180,320,247,142,246,156,238,220,238,220,246,156,245,170,238,220,245,170,245,180,245,180,245,189,238,220,238,220,245,189,246,197,238,220,246,197,247,204,249,212,251,220,238,220,249,212,238,220,247,204,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,234,1,235,26,223,19,234,1,223,19,209,15,234,1,209,15,196,12,234,1,196,12,181,11,234,1,181,11,180,-6,226,144,231,137,231,203,231,203,231,137,235,128,231,203,235,128,235,211,235,211,235,128,238,118,235,211,238,118,238,220,238,220,238,118,249,129,238,220,249,129,247,142,156,149,209,149,209,191,218,193,209,191,219,148,218,193,219,148,226,197,226,197,219,148,226,144,226,197,226,144,231,203,209,191,156,191,156,149,146,148,156,149,156,191,146,148,156,191,146,192,146,148,146,192,139,144,139,144,146,192,139,196,139,144,139,196,134,138,134,138,139,196,133,201,134,138,133,201,129,129,129,129,133,201,129,209,129,129,129,209,125,118,125,118,129,209,124,220,125,118,124,220,118,161,118,161,124,220,117,172,124,220,112,220,114,210,124,220,114,210,116,197,124,220,116,197,117,184,124,220,117,184,117,172,125,118,118,161,118,153,125,118,118,153,117,144,125,118,117,144,116,135,125,118,116,135,115,126,125,118,115,126,113,118,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,154,15,180,-6,167,12,167,12,180,-6,181,11,142,19,130,25,180,-6,142,19,180,-6,154,15,81,24,74,166,46,61,126,330,134,308,180,338,209,191,209,149,219,148,249,129,238,118,251,118, +157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256, +52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321, +362,0,362,9,349,11,336,16,322,25,305,41,283,64,166,192,259,281,278,298,292,309,305,316,320,320,338,321,338,331,208,331,208,321,220,321,229,320,235,318,238,315,240,311,241,305,239,298,234,289,226,280,202,256,113,174,113,293,117,307,124,315,137,319,158,321,158,331,17,331,17,321,37,319,50,315,57,306,61,293,62,275,62,63,61,40,57,26,50,17,36,12,17,9,17,0,157,0,157,9,139,12,126,16,118,23,114,36,113,55,113,148,126,158,176,107,198,84,217,63,232,46,241,32,244,22,244,18,241,15,237,12,231,11,224,10,210,9,210,0,344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,169,337,70,93,56,58,44,34,34,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,160,267,161,267,241,61,244,51,247,44,249,37,250,31,251,26,249,18,244,13,236,11,227,10,216,9,216,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12, +158,321,158,321,137,319,137,319,158,321,158,331,137,319,158,331,124,315,124,315,158,331,61,293,124,315,61,293,62,275,114,36,62,275,62,63,114,36,62,63,118,23,118,23,62,63,126,16,62,275,114,36,113,55,113,174,113,148,126,158,113,174,126,158,202,256,202,256,126,158,166,192,202,256,166,192,259,281,62,275,113,55,113,274,62,275,113,274,113,293,62,275,113,293,117,307,62,275,117,307,124,315,158,331,17,331,37,319,158,331,37,319,50,315,158,331,50,315,57,306,158,331,57,306,61,293,234,289,226,280,259,281,259,281,226,280,215,269,259,281,215,269,202,256,338,331,208,331,220,321,338,331,220,321,229,320,338,331,229,320,235,318,338,331,235,318,238,315,338,331,238,315,240,311,338,331,240,311,241,305,338,331,241,305,305,316,338,331,305,316,320,320,338,331,320,320,338,321,241,305,259,281,278,298,241,305,278,298,292,309,241,305,292,309,305,316,239,298,234,289,259,281,239,298,259,281,241,305,241,15,237,12,362,0,362,0,237,12,231,11,362,0,231,11,224,10,244,22,362,0,336,16,244,22,336,16,322,25,244,22,322,25,305,41,244,22,305,41,283,64,244,22,283,64,241,32,283,64,166,192,176,107,283,64,176,107,198,84,283,64,198,84,217,63,283,64,217,63,232,46,283,64,232,46,241,32,349,11,336,16,362,0,349,11,362,0,362,9,244,18,241,15,362,0,244,18,362,0,244,22,210,9,210,0,362,0,210,9,362,0,224,10,157,0,157,9,139,12,157,0,139,12,126,16,157,0,126,16,61,40,157,0,61,40,57,26,157,0,57,26,50,17,157,0,50,17,36,12,157,0,36,12,17,9,157,0,17,9,17,0,61,40,126,16,62,63,176,107,166,192,126,158,220,321,208,331,208,321,37,319,17,331,17,321, +344,0,344,9,330,12,320,17,311,26,304,38,296,55,179,337,169,337,70,93,56,58,44,34,34,20,22,13,7,9,7,0,107,0,107,9,94,10,84,12,77,16,73,22,72,30,72,34,73,38,74,43,76,51,160,267,161,267,241,61,244,51,247,44,249,37,250,31,251,26,249,18,244,13,236,11,227,10,216,9,216,0,432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0, +56,58,73,22,72,30,72,30,72,34,70,93,70,93,72,34,73,38,70,93,73,38,74,43,161,267,169,337,160,267,160,267,169,337,76,51,75,47,76,51,169,337,75,47,169,337,70,93,251,26,344,0,320,17,251,26,320,17,311,26,251,26,311,26,304,38,251,26,304,38,296,55,251,26,296,55,250,31,296,55,179,337,241,61,296,55,241,61,244,51,296,55,244,51,247,44,296,55,247,44,249,37,296,55,249,37,250,31,169,337,161,267,241,61,169,337,241,61,179,337,70,93,56,58,72,30,330,12,320,17,344,0,330,12,344,0,344,9,249,18,244,13,344,0,249,18,344,0,251,26,344,0,244,13,236,11,344,0,236,11,227,10,344,0,227,10,216,9,344,0,216,9,216,0,107,0,107,9,94,10,107,0,94,10,84,12,107,0,84,12,34,20,107,0,34,20,22,13,107,0,22,13,7,9,107,0,7,9,7,0,44,34,34,20,84,12,44,34,84,12,77,16,44,34,77,16,73,22,44,34,73,22,56,58,75,47,70,93,74,43, +432,0,432,9,413,12,401,17,393,25,389,38,388,56,388,275,389,294,393,307,401,316,413,320,431,321,431,331,332,331,222,80,106,331,7,331,7,321,28,319,42,315,50,307,54,294,55,275,55,75,54,47,49,29,41,18,27,12,6,9,6,0,123,0,123,9,103,12,90,18,82,29,78,48,76,75,76,275,203,0,209,0,337,286,337,61,336,40,333,26,325,17,312,12,292,9,292,0,353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,295,247,295,331, +49,29,41,18,123,0,123,0,41,18,27,12,123,0,27,12,6,9,333,26,325,17,432,0,432,0,325,17,312,12,432,0,312,12,292,9,413,320,431,321,431,331,413,320,431,331,401,316,401,316,431,331,337,286,401,316,337,286,393,307,393,307,337,286,389,294,401,17,393,25,337,61,337,61,393,25,389,38,337,61,389,38,337,286,337,286,389,38,388,56,337,286,388,56,388,275,203,0,209,0,222,80,222,80,209,0,337,286,222,80,337,286,332,331,332,331,337,286,431,331,106,331,7,331,28,319,106,331,28,319,42,315,106,331,42,315,50,307,106,331,50,307,54,294,106,331,54,294,55,275,106,331,55,275,76,275,106,331,76,275,203,0,106,331,203,0,222,80,76,75,76,275,55,275,76,75,55,275,78,48,78,48,55,275,55,75,78,48,55,75,82,29,82,29,55,75,54,47,82,29,54,47,90,18,90,18,54,47,49,29,90,18,49,29,123,0,432,0,432,9,413,12,432,0,413,12,401,17,432,0,401,17,336,40,432,0,336,40,333,26,103,12,90,18,123,0,103,12,123,0,123,9,123,0,6,9,6,0,432,0,292,9,292,0,336,40,401,17,337,61,28,319,7,331,7,321,389,294,337,286,388,275, +353,331,235,331,235,321,247,320,256,319,263,317,275,309,278,303,281,295,283,285,284,274,284,89,91,331,6,331,6,321,19,321,29,318,37,313,46,306,55,295,55,75,54,48,49,30,41,19,27,13,6,9,6,0,123,0,123,9,103,13,90,20,82,31,78,49,76,75,76,269,297,-5,306,-5,306,274,308,289,311,299,315,307,320,313,324,315,329,318,335,319,343,320,353,321,295,247,295,331,26,331,26,246,39,246,43,263,48,276,55,284,66,289,79,290,242,290,256,289,266,284,274,276,279,263,282,247,16383,16383,252,109,252,225,240,225,239,211,235,200,229,193,219,189,207,188,114,188,102,189,93,193,87,200,83,211,81,225,70,225,70,109,81,109,84,122,87,132,93,140,101,146,113,147,205,147,218,146,227,141,234,133,239,123,240,109,16383,16383,307,0, +49,30,41,19,123,0,123,0,41,19,27,13,123,0,27,13,6,9,256,319,263,317,353,331,353,331,263,317,269,313,353,331,269,313,275,309,275,309,278,303,353,331,353,331,278,303,281,295,353,331,281,295,324,315,324,315,281,295,320,313,324,315,320,313,320,312,320,312,320,313,315,307,315,307,320,313,284,274,315,307,284,274,284,259,297,-5,284,259,284,89,297,-5,284,89,91,331,353,331,324,315,329,318,353,331,329,318,335,319,353,331,335,319,343,320,353,331,343,320,353,321,306,-5,306,253,297,-5,297,-5,306,253,306,274,297,-5,306,274,284,259,284,259,306,274,308,289,284,259,308,289,311,299,283,285,284,274,320,313,283,285,320,313,281,295,247,320,256,319,353,331,247,320,353,331,235,331,247,320,235,331,235,321,91,331,6,331,19,321,91,331,19,321,29,318,91,331,29,318,37,313,91,331,37,313,46,306,91,331,46,306,55,295,91,331,55,295,76,269,91,331,76,269,297,-5,55,295,78,49,76,75,54,48,49,30,90,20,90,20,49,30,123,0,90,20,123,0,103,13,103,13,123,0,123,9,55,75,54,48,82,31,55,75,82,31,78,49,55,75,78,49,55,295,123,0,6,9,6,0,54,48,90,20,82,31,19,321,6,331,6,321,76,269,55,295,76,75,315,307,284,259,311,299, +295,247,295,331,26,331,26,246,39,246,43,263,48,276,55,284,66,289,79,290,242,290,256,289,266,284,274,276,279,263,282,247,16383,16383,252,109,252,225,240,225,239,211,235,200,229,193,219,189,207,188,114,188,102,189,93,193,87,200,83,211,81,225,70,225,70,109,81,109,84,122,87,132,93,140,101,146,113,147,205,147,218,146,227,141,234,133,239,123,240,109,16383,16383,307,0,307,85,295,85,293,70,287,57,278,49,265,44,248,42,70,42,56,44,44,49,35,57,29,69,27,85,15,85,15,0,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201, +295,331,26,331,66,289,295,331,66,289,79,290,295,331,79,290,242,290,295,331,242,290,256,289,295,331,256,289,266,284,295,331,266,284,274,276,295,331,274,276,279,263,295,331,279,263,282,247,295,331,282,247,295,247,26,331,26,246,39,246,26,331,39,246,43,263,26,331,43,263,48,276,26,331,48,276,55,284,26,331,55,284,66,289,219,189,207,188,218,146,218,146,207,188,205,147,205,147,207,188,114,188,205,147,114,188,113,147,101,146,113,147,102,189,101,146,102,189,93,193,83,211,84,122,87,200,87,200,84,122,87,132,87,200,87,132,93,193,93,193,87,132,93,140,93,193,93,140,101,146,83,211,81,225,84,122,84,122,81,225,81,109,81,109,81,225,70,225,81,109,70,225,70,109,240,225,239,211,240,109,240,225,240,109,252,109,240,225,252,109,252,225,240,109,239,211,239,123,239,123,239,211,235,200,239,123,235,200,234,133,234,133,235,200,229,193,234,133,229,193,227,141,227,141,229,193,219,189,227,141,219,189,218,146,287,57,278,49,307,0,307,0,278,49,265,44,307,0,265,44,248,42,307,0,307,85,295,85,307,0,295,85,293,70,307,0,293,70,287,57,248,42,70,42,307,0,307,0,70,42,56,44,307,0,56,44,15,0,15,0,56,44,44,49,15,0,44,49,35,57,15,0,35,57,15,85,15,85,35,57,29,69,15,85,29,69,27,85,113,147,114,188,102,189, +344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,296,105,303,107,307,111,310,116,312,238,312,245,311,251,310,254,306,256,301,256,62,255,41,252,26,244,17,232,12,212,9,212,0,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12, +149,314,180,338,134,308,134,308,180,338,126,330,134,308,126,330,121,298,121,298,126,330,108,286,97,269,108,286,126,330,97,269,126,330,81,307,81,102,81,24,90,75,90,75,81,24,126,1,90,75,126,1,103,52,103,52,126,1,119,33,130,25,119,33,126,1,130,25,126,1,180,-6,207,316,235,330,194,319,194,319,235,330,180,320,164,318,180,320,180,338,164,318,180,338,149,314,81,307,46,271,46,61,81,307,46,61,74,166,81,307,74,166,76,194,81,307,76,194,80,222,81,307,80,222,87,247,81,307,87,247,97,269,81,102,76,132,81,24,81,24,76,132,74,166,24,109,46,61,46,271,24,109,46,271,24,224,24,109,24,224,17,167,223,19,209,15,234,1,234,1,209,15,196,12,234,1,196,12,181,11,181,11,167,12,180,-6,180,-6,167,12,154,15,180,-6,154,15,142,19,207,316,219,311,235,330,235,330,219,311,231,305,235,330,231,305,242,296,242,296,257,279,280,306,280,306,257,279,270,257,280,306,270,257,279,231,235,330,180,338,180,320,280,103,272,76,279,24,279,24,272,76,260,53,279,24,260,53,246,35,246,35,235,26,279,24,279,24,235,26,234,1,344,166,336,222,336,108,336,108,336,222,314,269,336,108,314,269,314,60,314,60,314,269,287,169,285,201,287,169,314,269,285,201,314,269,280,306,285,201,280,306,279,231,280,306,235,330,242,296,314,60,287,169,285,134,314,60,285,134,280,103,314,60,280,103,279,24,181,11,180,-6,234,1,81,24,74,166,46,61,223,19,234,1,235,26,130,25,180,-6,142,19, +352,0,352,9,333,12,320,17,312,25,308,37,307,55,307,274,308,293,312,307,320,315,333,319,352,321,352,331,9,331,9,321,28,319,41,315,49,307,53,294,54,274,54,61,53,39,49,25,42,16,29,12,9,9,9,0,148,0,148,9,129,12,117,17,109,25,105,38,104,56,104,296,105,303,107,307,111,310,116,312,238,312,245,311,251,310,254,306,256,301,256,62,255,41,252,26,244,17,232,12,212,9,212,0,8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313, +49,25,42,16,148,0,148,0,42,16,29,12,148,0,29,12,9,9,53,294,54,274,111,310,53,294,111,310,49,307,49,307,111,310,116,312,49,307,116,312,352,331,352,331,116,312,123,312,252,26,244,17,352,0,352,0,244,17,232,12,352,0,232,12,212,9,352,331,123,312,238,312,352,331,238,312,245,311,352,331,245,311,251,310,352,331,251,310,254,306,352,331,254,306,256,301,352,331,256,301,256,294,352,331,256,294,320,315,352,331,320,315,333,319,352,331,333,319,352,321,307,55,307,274,256,294,256,294,307,274,308,293,256,294,308,293,312,307,320,17,312,25,256,62,256,62,312,25,308,37,256,62,308,37,256,294,117,17,109,25,54,61,54,61,109,25,105,38,54,61,105,38,54,274,54,274,105,38,104,56,54,274,104,56,104,296,54,274,104,296,105,303,54,274,105,303,107,307,54,274,107,307,111,310,352,331,9,331,28,319,352,331,28,319,41,315,352,331,41,315,49,307,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,255,41,352,0,255,41,252,26,148,0,148,9,129,12,148,0,129,12,117,17,148,0,117,17,53,39,148,0,53,39,49,25,148,0,9,9,9,0,53,39,117,17,54,61,352,0,212,9,212,0,255,41,320,17,256,62,256,294,308,37,307,55,28,319,9,331,9,321,320,315,256,294,312,307, +8,331,8,321,27,319,39,315,46,307,49,294,50,276,50,39,47,25,40,16,27,12,8,9,8,0,148,0,148,9,128,12,114,16,106,24,102,37,101,56,101,146,109,145,115,145,122,144,136,144,164,145,188,147,208,153,225,161,243,175,253,185,260,197,266,210,270,225,271,240,270,254,267,268,262,280,255,291,246,300,231,310,213,319,191,325,166,329,137,331,16383,16383,101,295,101,302,103,307,106,310,111,312,118,313,155,310,182,302,202,288,213,266,217,238,213,213,202,192,185,177,162,167,132,164,120,164,114,165,108,165,101,166,300,102,289,102,283,82,275,66,264,56,249,49,229,47,74,47,193,184,86,312,190,312,214,310,234,305,248,294,259,276,266,251,278,251,278,331,15,331,15,324,148,162,15,7,15,0,286,0,296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,284,246,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218, +111,312,118,312,118,313,137,331,118,313,155,310,137,331,155,310,166,329,166,329,155,310,182,302,166,329,182,302,191,325,191,325,182,302,202,288,191,325,202,288,213,319,213,319,202,288,213,266,213,319,213,266,231,310,231,310,213,266,217,238,231,310,217,238,225,161,225,161,213,213,208,153,208,153,213,213,202,192,208,153,202,192,188,147,188,147,202,192,185,177,188,147,185,177,164,145,164,145,185,177,162,167,164,145,162,167,136,144,136,144,162,167,132,164,136,144,132,164,128,144,128,144,132,164,126,164,128,144,126,164,122,144,122,144,126,164,120,164,122,144,120,164,115,145,115,145,120,164,114,165,115,145,114,165,109,145,109,145,114,165,108,165,109,145,108,165,101,166,101,56,101,166,50,276,101,56,50,276,102,37,102,37,50,276,50,61,101,166,101,146,109,145,271,240,270,254,270,225,270,225,270,254,267,268,270,225,267,268,266,210,266,210,267,268,262,280,266,210,262,280,260,197,260,197,262,280,255,291,260,197,255,291,253,185,253,185,255,291,246,300,253,185,246,300,243,175,243,175,246,300,231,310,243,175,231,310,225,161,137,331,8,331,27,319,137,331,27,319,39,315,137,331,39,315,46,307,137,331,46,307,49,294,137,331,49,294,50,276,137,331,50,276,106,310,137,331,106,310,111,312,137,331,111,312,118,313,101,295,101,302,50,276,101,295,50,276,101,166,103,307,106,310,50,276,103,307,50,276,101,302,148,0,148,9,128,12,148,0,128,12,114,16,148,0,114,16,50,39,148,0,50,39,47,25,148,0,47,25,40,16,148,0,40,16,27,12,148,0,27,12,8,9,148,0,8,9,8,0,50,61,50,39,114,16,50,61,114,16,106,24,50,61,106,24,102,37,27,319,8,331,8,321,213,213,225,161,217,238,155,310,118,313,118,312, + + +300,102,289,102,283,82,275,66,264,56,249,49,229,47,74,47,193,184,86,312,190,312,214,310,234,305,248,294,259,276,266,251,278,251,278,331,15,331,15,324,148,162,15,7,15,0,286,0,296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36, +278,331,15,331,86,312,278,331,86,312,190,312,278,331,190,312,214,310,278,331,214,310,234,305,278,331,234,305,248,294,278,331,248,294,259,276,278,331,259,276,266,251,278,331,266,251,278,251,148,162,15,7,74,47,148,162,74,47,193,184,148,162,193,184,86,312,148,162,86,312,15,331,148,162,15,331,15,324,275,66,264,56,286,0,286,0,264,56,249,49,286,0,249,49,229,47,286,0,300,102,289,102,286,0,289,102,283,82,286,0,283,82,275,66,286,0,229,47,74,47,286,0,74,47,15,7,286,0,15,7,15,0, +296,246,293,331,12,331,8,246,21,246,28,274,37,292,50,303,70,309,97,310,127,310,127,61,126,39,123,25,115,16,101,12,80,9,80,0,226,0,226,9,205,11,192,16,183,23,179,36,178,55,178,310,208,310,235,309,254,303,268,292,277,274,284,246,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147, +293,331,12,331,70,309,293,331,70,309,97,310,293,331,97,310,127,310,293,331,127,310,178,310,293,331,178,310,208,310,293,331,208,310,235,309,293,331,235,309,254,303,293,331,254,303,268,292,293,331,268,292,277,274,293,331,277,274,284,246,293,331,284,246,296,246,192,16,183,23,127,61,127,61,183,23,179,36,127,61,179,36,127,310,127,310,179,36,178,55,127,310,178,55,178,310,12,331,8,246,21,246,12,331,21,246,28,274,12,331,28,274,37,292,12,331,37,292,50,303,12,331,50,303,70,309,226,0,226,9,205,11,226,0,205,11,192,16,226,0,192,16,126,39,226,0,126,39,123,25,226,0,123,25,115,16,226,0,115,16,101,12,226,0,101,12,80,9,226,0,80,9,80,0,126,39,192,16,127,61, +352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,216,290,217,301,221,310,230,316,245,320,267,321,267,331,114,331,114,321,136,320,151,317,160,311,164,302,165,290,165,280,122,276,82,263,49,241,26,209,17,165,23,128,39,97,67,72,106,57,156,51,165,51,165,42,163,29,157,20,146,14,132,10,114,9,114,0,267,0,267,9,248,11,234,15,224,20,218,29,216,43,216,51,228,51,264,56,300,69,332,91,355,123,364,165,355,209,332,241,298,263,258,276,216,280,16383,16383,215,262,250,256, +18,303,25,305,26,319,26,319,25,305,33,308,26,319,33,308,39,327,39,327,33,308,41,310,39,327,41,310,53,332,53,332,41,310,49,311,53,332,49,311,55,312,55,312,84,306,67,336,67,336,84,306,81,337,67,336,53,332,55,312,198,218,196,218,210,36,198,218,210,36,209,55,198,218,209,55,209,152,198,218,209,152,211,258,332,335,326,335,335,322,335,322,326,335,320,335,335,322,320,335,296,313,296,313,320,335,289,330,296,313,289,330,261,288,261,288,289,330,259,315,261,288,259,315,233,251,233,251,259,315,232,290,233,251,232,290,215,204,215,204,232,290,211,258,215,204,211,258,209,152,338,334,335,322,339,322,338,334,339,322,345,332,345,332,339,322,342,322,345,332,342,322,345,321,348,320,352,320,352,329,348,320,352,329,345,321,345,321,352,329,345,332,260,0,260,9,239,11,260,0,239,11,224,15,260,0,224,15,156,39,260,0,156,39,153,25,260,0,153,25,144,16,260,0,144,16,130,12,260,0,130,12,107,9,260,0,107,9,107,0,169,293,157,147,210,36,169,293,210,36,186,260,186,260,210,36,196,218,156,39,224,15,157,61,157,61,224,15,215,23,157,61,215,23,157,147,157,147,215,23,210,36,84,306,109,289,117,332,117,332,109,289,130,257,117,332,130,257,146,318,146,318,130,257,146,211,146,318,146,211,169,293,169,293,146,211,157,147,81,337,84,306,117,332,335,322,338,334,332,335,18,303,26,319,15,311, +216,290,217,301,221,310,230,316,245,320,267,321,267,331,114,331,114,321,136,320,151,317,160,311,164,302,165,290,165,280,122,276,82,263,49,241,26,209,17,165,23,128,39,97,67,72,106,57,156,51,165,51,165,42,163,29,157,20,146,14,132,10,114,9,114,0,267,0,267,9,248,11,234,15,224,20,218,29,216,43,216,51,228,51,264,56,300,69,332,91,355,123,364,165,355,209,332,241,298,263,258,276,216,280,16383,16383,215,262,250,256,276,240,295,216,306,188,310,159,304,128,290,103,268,85,243,74,215,70,16383,16383,166,70,133,75,107,88,88,107,76,132,72,159,76,189,89,216,109,240,135,256,166,262,352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20, +267,321,267,321,245,320,245,320,267,321,267,331,245,320,267,331,230,316,230,316,267,331,164,302,230,316,164,302,165,290,166,262,165,290,165,280,166,262,165,280,135,256,135,256,165,280,122,276,135,256,122,276,109,240,109,240,122,276,89,216,216,43,215,70,166,262,166,262,215,70,215,262,166,262,215,262,216,290,216,290,215,262,216,280,166,262,216,290,217,301,166,262,217,301,221,310,166,262,218,29,216,43,165,290,166,262,221,310,165,290,221,310,230,316,267,331,114,331,136,320,267,331,136,320,151,317,267,331,151,317,160,311,267,331,160,311,164,302,82,263,49,241,72,159,82,263,72,159,76,189,82,263,76,189,89,216,82,263,89,216,122,276,17,165,23,128,26,209,26,209,23,128,39,97,26,209,39,97,49,241,49,241,39,97,67,72,49,241,67,72,72,159,332,91,310,159,304,128,332,91,304,128,300,69,300,69,304,128,290,103,300,69,290,103,268,85,306,188,310,159,332,241,332,241,310,159,332,91,332,241,332,91,355,209,355,209,332,91,355,123,355,209,355,123,364,165,298,263,258,276,276,240,298,263,276,240,295,216,298,263,295,216,306,188,298,263,306,188,332,241,250,256,276,240,258,276,250,256,258,276,216,280,250,256,216,280,215,262,216,51,228,51,243,74,243,74,228,51,264,56,243,74,264,56,268,85,268,85,264,56,300,69,216,43,216,51,215,70,215,70,216,51,243,74,267,0,267,9,248,11,267,0,248,11,234,15,267,0,234,15,165,42,267,0,165,42,163,29,267,0,163,29,157,20,267,0,157,20,146,14,267,0,146,14,132,10,267,0,132,10,114,9,267,0,114,9,114,0,166,70,133,75,156,51,166,70,156,51,165,51,166,70,165,51,224,20,166,70,224,20,218,29,166,70,218,29,166,262,165,51,165,42,234,15,165,51,234,15,224,20,107,88,88,107,106,57,107,88,106,57,156,51,107,88,156,51,133,75,76,132,72,159,67,72,76,132,67,72,106,57,76,132,106,57,88,107,136,320,114,331,114,321, +352,0,352,9,338,12,327,16,317,22,307,32,296,46,200,184,272,272,289,292,303,305,316,314,331,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,263,301,260,296,257,290,251,282,243,272,188,202,166,234,151,255,139,272,131,286,126,297,124,306,125,312,128,316,133,319,139,320,147,321,161,321,161,331,11,331,11,321,29,319,44,312,59,299,78,276,103,242,156,164,78,66,58,42,43,26,31,17,19,12,5,9,5,0,121,0,121,9,106,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,100,57,109,70,169,145,217,74,226,60,233,48,238,38,241,31,242,25,241,20,238,16,233,14,226,12,217,11,204,9,204,0,362,345,332,341,310,328,295,309,287,284,285,254,283,226,278,198,267,175,248,159,218,153,212,153,212,281,214,299,221,311,232,318,246,321,263,321,263,331,110,331,110,321,128,321,142,317,152,310,159,299,161,281,161,153,156,153,125,159,106,175,95,198,90,226,89,254,86,284,78,309,64,328,42,341,11,345,11,335,21,330,28,320,32,308,34,295,35,283,34,274,34,265,33,256,33,247,32,238,39,199,59,170,87,150,122,139,161,135,161,62,160,40,156,25,147,16,132,12,110,9,110,0,263,0,263,9,244,11,229,14,220,22,214,35,212,55,212,135,251,139,286,150,314,170,333,199,340,238,340,256,339,265,339,295,341,308,345,320,352,330,362,335,358,0, +31,17,121,0,43,26,43,26,121,0,88,17,43,26,88,17,58,42,58,42,88,17,84,21,58,42,84,21,83,26,83,26,84,31,78,66,78,66,84,31,87,38,78,66,87,38,156,164,156,164,87,38,92,46,156,164,92,46,100,57,103,242,156,164,126,297,103,242,126,297,124,306,124,306,125,312,103,242,156,164,100,57,109,70,109,70,169,145,156,164,156,164,169,145,166,234,156,164,166,234,151,255,78,66,58,42,83,26,103,242,125,312,78,276,78,276,125,312,128,316,78,276,128,316,59,299,59,299,128,316,133,319,59,299,133,319,161,331,161,331,133,319,139,320,161,331,139,320,147,321,147,321,161,321,161,331,161,331,11,331,29,319,161,331,29,319,44,312,161,331,44,312,59,299,260,296,257,290,272,272,272,272,257,290,251,282,272,272,251,282,243,272,243,272,188,202,200,184,200,184,188,202,217,74,200,184,217,74,296,46,296,46,217,74,226,60,296,46,226,60,233,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,331,319,348,331,331,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,263,301,260,296,272,272,263,301,272,272,263,305,243,272,200,184,272,272,238,16,233,14,352,0,352,0,233,14,226,12,352,0,226,12,217,11,242,25,352,0,327,16,242,25,327,16,317,22,242,25,317,22,307,32,242,25,307,32,296,46,242,25,296,46,241,31,296,46,233,48,238,38,296,46,238,38,241,31,188,202,166,234,169,145,188,202,169,145,217,74,338,12,327,16,352,0,338,12,352,0,352,9,241,20,238,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,156,164,151,255,139,272,156,164,139,272,131,286,156,164,131,286,126,297,121,0,121,9,106,11,121,0,106,11,95,13,121,0,95,13,88,17,19,12,5,9,121,0,19,12,121,0,31,17,121,0,5,9,5,0,243,320,229,331,229,321,29,319,11,331,11,321, +362,345,332,341,310,328,295,309,287,284,285,254,283,226,278,198,267,175,248,159,218,153,212,153,212,281,214,299,221,311,232,318,246,321,263,321,263,331,110,331,110,321,128,321,142,317,152,310,159,299,161,281,161,153,156,153,125,159,106,175,95,198,90,226,89,254,86,284,78,309,64,328,42,341,11,345,11,335,21,330,28,320,32,308,34,295,35,283,34,274,34,265,33,256,33,247,32,238,39,199,59,170,87,150,122,139,161,135,161,62,160,40,156,25,147,16,132,12,110,9,110,0,263,0,263,9,244,11,229,14,220,22,214,35,212,55,212,135,251,139,286,150,314,170,333,199,340,238,340,256,339,265,339,295,341,308,345,320,352,330,362,335,358,0,358,84,345,84,343,71,339,61,333,53,325,49,314,47,237,47,238,66,275,80,305,100,327,126,341,159,345,199,338,242,318,280,285,310,241,331,186,338,130,330,86,309,53,277,33,239,26,199,31,159,44,126,65,100,95,80,132,66,133,47,58,47,46,48,38,52,32,59,28,70,27,85,15,85,15,0,158,0,153,80,129,93,110,114,96,140,87,170,84,200,88,235,100,268,120,295,149,313,186,320,222,314,250,298,271,273,284,239,289,200,285,168,276,138,261,112,242,92,218,80,214,0,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397, +263,321,263,321,246,321,246,321,263,321,263,331,246,321,263,331,232,318,232,318,263,331,159,299,232,318,159,299,161,281,161,135,161,281,161,153,161,135,161,153,156,153,161,135,220,22,214,35,161,135,214,35,212,55,212,153,212,135,251,139,212,153,251,139,218,153,218,153,251,139,248,159,212,55,212,281,161,135,161,135,212,281,214,299,161,135,214,299,161,281,161,281,214,299,221,311,161,281,221,311,232,318,263,331,110,331,128,321,263,331,128,321,142,317,263,331,142,317,152,310,263,331,152,310,159,299,310,328,295,309,314,170,314,170,295,309,287,284,314,170,287,284,286,150,286,150,287,284,285,254,286,150,285,254,283,226,310,328,314,170,332,341,332,341,314,170,333,199,332,341,333,199,339,295,339,295,333,199,339,283,339,274,339,283,333,199,339,274,333,199,340,238,352,330,362,335,362,345,352,330,362,345,345,320,345,320,362,345,332,341,345,320,332,341,341,308,341,308,332,341,339,295,248,159,251,139,267,175,267,175,251,139,286,150,267,175,286,150,278,198,278,198,286,150,283,226,340,238,340,247,340,256,340,238,340,256,339,265,340,238,339,265,339,274,263,0,263,9,244,11,263,0,244,11,229,14,263,0,229,14,160,40,263,0,160,40,156,25,263,0,156,25,147,16,263,0,147,16,132,12,263,0,132,12,110,9,263,0,110,9,110,0,161,62,160,40,229,14,161,62,229,14,220,22,161,62,220,22,161,135,125,159,106,175,122,139,125,159,122,139,161,135,125,159,161,135,156,153,90,226,89,254,87,150,90,226,87,150,95,198,95,198,87,150,122,139,95,198,122,139,106,175,87,150,89,254,86,284,87,150,86,284,78,309,87,150,78,309,64,328,87,150,64,328,59,170,42,341,11,345,21,330,42,341,21,330,28,320,42,341,28,320,32,308,42,341,32,308,34,295,42,341,34,295,35,283,42,341,35,283,39,199,42,341,39,199,59,170,42,341,59,170,64,328,39,199,35,283,34,274,39,199,34,274,34,265,39,199,34,265,33,256,39,199,33,256,33,247,39,199,33,247,32,238,21,330,11,345,11,335,128,321,110,331,110,321, +358,0,358,84,345,84,343,71,339,61,333,53,325,49,314,47,237,47,238,66,275,80,305,100,327,126,341,159,345,199,338,242,318,280,285,310,241,331,186,338,130,330,86,309,53,277,33,239,26,199,31,159,44,126,65,100,95,80,132,66,133,47,58,47,46,48,38,52,32,59,28,70,27,85,15,85,15,0,158,0,153,80,129,93,110,114,96,140,87,170,84,200,88,235,100,268,120,295,149,313,186,320,222,314,250,298,271,273,284,239,289,200,285,168,276,138,261,112,242,92,218,80,214,0,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,59,411,57,419,54,426,48,432,41,435,33,436,26,435,19,432,14,426,10,420,9,412,10,404,14,397,19,392,25,388,33,387,41,388,48,392,54,397,57,404,59,411,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316, +58,47,46,48,158,0,158,0,46,48,38,52,158,0,38,52,15,0,15,0,38,52,32,59,15,0,32,59,15,85,15,85,32,59,28,70,15,85,28,70,27,85,26,199,31,159,33,239,33,239,31,159,44,126,33,239,44,126,53,277,53,277,44,126,65,100,53,277,65,100,86,309,86,309,65,100,84,200,95,80,84,200,65,100,186,338,149,313,186,320,186,320,222,314,241,331,241,331,222,314,250,298,241,331,250,298,285,310,285,310,250,298,271,273,285,310,271,273,284,239,289,200,305,100,318,280,318,280,305,100,327,126,318,280,327,126,338,242,338,242,327,126,341,159,338,242,341,159,345,199,285,310,284,239,289,200,285,310,289,200,318,280,241,331,186,338,186,320,261,112,275,80,276,138,276,138,275,80,305,100,276,138,305,100,285,168,285,168,305,100,289,200,214,0,237,47,218,80,218,80,237,47,238,66,218,80,238,66,242,92,242,92,238,66,275,80,242,92,275,80,261,112,339,61,333,53,358,0,358,0,333,53,325,49,358,0,325,49,314,47,358,0,358,84,345,84,358,0,345,84,343,71,358,0,343,71,339,61,237,47,214,0,358,0,237,47,358,0,314,47,130,330,86,309,100,268,130,330,100,268,120,295,130,330,120,295,149,313,130,330,149,313,186,338,86,309,84,200,88,235,86,309,88,235,100,268,132,66,133,47,153,80,132,66,153,80,129,93,132,66,129,93,110,114,132,66,110,114,96,140,132,66,96,140,95,80,87,170,84,200,95,80,87,170,95,80,96,140,133,47,58,47,158,0,133,47,158,0,153,80, +158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,59,411,57,419,54,426,48,432,41,435,33,436,26,435,19,432,14,426,10,420,9,412,10,404,14,397,19,392,25,388,33,387,41,388,48,392,54,397,57,404,59,411,16383,16383,157,0,157,9,137,11,122,16,114,24,109,37,108,56,108,276,109,295,113,308,122,316,136,320,157,321,157,331,9,331,9,321,30,320,44,316,53,308,57,295,57,56,56,36,52,23,44,15,30,11,9,9,9,0,257,411,256,419,252,426,247,432,240,435,233,436,225,435,218,432,213,426,209,420,208,412,209,404,213,397,218,392,225,388,232,387,240,388,247,392,252,397,256,404,257,411,16383,16383,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312, +9,412,10,404,10,420,10,420,10,404,14,397,10,420,14,397,14,426,14,426,14,397,19,392,14,426,19,392,19,432,19,432,19,392,25,388,19,432,25,388,26,435,26,435,25,388,33,387,26,435,33,387,33,436,33,436,33,387,41,388,33,436,41,388,41,435,41,435,41,388,48,392,41,435,48,392,48,432,48,432,48,392,54,397,48,432,54,397,54,426,54,426,54,397,57,404,54,426,57,404,57,419,57,419,57,404,59,411,52,23,44,15,157,0,157,0,44,15,30,11,157,0,30,11,9,9,157,331,9,331,30,320,157,331,30,320,44,316,157,331,44,316,53,308,157,331,53,308,57,295,157,331,57,295,122,316,157,331,122,316,136,320,157,331,136,320,157,321,122,16,114,24,57,56,57,56,114,24,109,37,57,56,109,37,57,276,57,276,109,37,108,56,57,276,108,56,108,276,57,276,108,276,109,295,57,276,109,295,113,308,57,276,113,308,122,316,57,276,122,316,57,295,108,412,109,404,110,420,110,420,109,404,113,397,110,420,113,397,113,426,113,426,113,397,118,392,113,426,118,392,118,432,118,432,118,392,125,388,118,432,125,388,125,435,125,435,125,388,132,387,125,435,132,387,133,436,133,436,132,387,140,388,133,436,140,388,141,435,141,435,140,388,148,392,141,435,148,392,148,432,148,432,148,392,153,397,148,432,153,397,153,426,153,426,153,397,157,404,153,426,157,404,157,419,157,419,157,404,158,411,157,0,157,9,137,11,157,0,137,11,122,16,157,0,122,16,56,36,157,0,56,36,52,23,157,0,9,9,9,0,56,36,122,16,57,56,30,320,9,331,9,321, +257,411,256,419,252,426,247,432,240,435,233,436,225,435,218,432,213,426,209,420,208,412,209,404,213,397,218,392,225,388,232,387,240,388,247,392,252,397,256,404,257,411,16383,16383,158,411,157,419,153,426,148,432,141,435,133,436,125,435,118,432,113,426,110,420,108,412,109,404,113,397,118,392,125,388,132,387,140,388,148,392,153,397,157,404,158,411,16383,16383,352,329,345,332,338,334,332,335,320,335,289,330,259,315,232,290,211,258,198,218,196,218,186,260,169,293,146,318,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,152,215,204,233,251,261,288,296,313,335,322,342,322,348,320,352,320,108,253,126,253,158,294,163,299,167,304,169,309,171,313,172,316,171,322,168,326,165,329,157,331,151,330,147,329,143,327,140,324,138,320,16383,16383,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324, +18,303,25,305,26,319,26,319,25,305,33,308,26,319,33,308,39,327,39,327,33,308,41,310,39,327,41,310,53,332,53,332,41,310,49,311,53,332,49,311,55,312,55,312,84,306,67,336,67,336,84,306,81,337,67,336,53,332,55,312,198,218,196,218,210,36,198,218,210,36,209,55,198,218,209,55,209,152,198,218,209,152,211,258,260,0,260,9,239,11,260,0,239,11,224,15,260,0,224,15,156,39,260,0,156,39,153,25,260,0,153,25,144,16,260,0,144,16,130,12,260,0,130,12,107,9,260,0,107,9,107,0,169,293,157,147,210,36,169,293,210,36,186,260,186,260,210,36,196,218,156,39,224,15,157,61,157,61,224,15,215,23,157,61,215,23,157,147,157,147,215,23,210,36,332,335,326,335,335,322,335,322,326,335,320,335,335,322,320,335,296,313,296,313,320,335,289,330,296,313,289,330,261,288,261,288,289,330,259,315,261,288,259,315,233,251,233,251,259,315,232,290,233,251,232,290,215,204,215,204,232,290,211,258,215,204,211,258,209,152,338,334,335,322,339,322,338,334,339,322,345,332,345,332,339,322,342,322,345,332,342,322,345,321,348,320,352,320,352,329,348,320,352,329,345,321,345,321,352,329,345,332,208,412,209,404,209,420,209,420,209,404,213,397,209,420,213,397,213,426,213,426,213,397,218,392,213,426,218,392,218,432,218,432,218,392,225,388,218,432,225,388,225,435,225,435,225,388,232,387,225,435,232,387,233,436,233,436,232,387,240,388,233,436,240,388,240,435,240,435,240,388,247,392,240,435,247,392,247,432,247,432,247,392,252,397,247,432,252,397,252,426,252,426,252,397,256,404,252,426,256,404,256,419,256,419,256,404,257,411,108,412,109,404,110,420,110,420,109,404,113,397,110,420,113,397,113,426,113,426,113,397,118,392,113,426,118,392,118,432,118,432,118,392,125,388,118,432,125,388,125,435,125,435,125,388,132,387,125,435,132,387,133,436,133,436,132,387,140,388,133,436,140,388,141,435,141,435,140,388,148,392,141,435,148,392,148,432,148,432,148,392,153,397,148,432,153,397,153,426,153,426,153,397,157,404,153,426,157,404,157,419,157,419,157,404,158,411,84,306,109,289,117,332,117,332,109,289,130,257,117,332,130,257,146,318,146,318,130,257,146,211,146,318,146,211,169,293,169,293,146,211,157,147,81,337,84,306,117,332,335,322,338,334,332,335,18,303,26,319,15,311, +108,253,126,253,158,294,163,299,167,304,169,309,171,313,172,316,171,322,168,326,165,329,157,331,151,330,147,329,143,327,140,324,138,320,16383,16383,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,106,320,16383,16383,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223, +63,167,70,189,79,224,79,224,70,189,81,204,79,224,81,204,113,230,113,230,81,204,95,213,113,230,95,213,110,216,110,216,129,208,113,230,113,230,129,208,137,226,157,331,158,294,161,330,161,330,158,294,163,299,161,330,163,299,165,329,165,329,163,299,167,304,165,329,167,304,168,326,168,326,167,304,169,309,168,326,169,309,171,322,171,322,169,309,171,313,171,322,171,313,172,316,158,294,157,331,151,330,158,294,151,330,147,329,158,294,147,329,143,327,158,294,143,327,140,324,158,294,140,324,138,320,158,294,138,320,126,253,144,187,154,159,156,215,156,215,154,159,161,130,156,215,161,130,171,198,171,198,161,130,166,104,171,198,166,104,174,32,171,198,174,32,182,178,182,178,174,32,185,50,182,178,185,50,190,157,190,157,185,50,190,32,190,157,190,32,212,225,212,225,190,32,196,17,212,225,196,17,206,94,206,94,196,17,204,5,206,94,204,5,213,-1,137,226,129,208,144,187,137,226,144,187,156,215,174,32,166,104,162,84,174,32,162,84,162,17,162,17,162,84,155,59,162,17,155,59,147,5,147,5,155,59,145,35,147,5,145,35,131,16,78,1,108,-4,90,19,90,19,108,-4,113,9,131,16,113,9,129,-1,131,16,129,-1,147,5,210,78,206,94,213,-1,212,225,206,94,261,225,252,39,248,32,250,8,250,8,248,32,245,27,250,8,245,27,241,26,241,26,232,31,239,0,239,0,232,31,225,-4,210,78,213,-1,216,60,216,60,213,-1,225,-4,216,60,225,-4,223,43,223,43,225,-4,232,31,258,24,263,43,265,65,258,24,265,65,257,65,258,24,257,65,255,50,258,24,255,50,252,39,258,24,252,39,250,8,241,26,239,0,250,8,113,9,108,-4,129,-1,90,19,75,43,78,1,78,1,75,43,66,76,78,1,66,76,52,16,52,16,66,76,61,109,52,16,61,109,60,137,60,137,63,167,52,207,52,207,63,167,79,224,52,16,60,137,52,207,52,16,52,207,32,41,32,41,52,207,31,181,32,41,31,181,19,73,19,73,31,181,19,148,19,73,19,148,15,112,126,253,138,320,108,253, +76,253,94,253,127,294,135,304,138,309,139,313,140,316,139,322,137,326,133,329,125,331,119,330,115,329,111,327,108,324,106,320,16383,16383,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,84,253,101,253,134,294,142,304,145,309,147,313,147,316,146,322,144,326,140,329,132,331,122,329,119,327,116,324,113,320,16383,16383,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188, +37,13,65,0,47,113,47,113,65,0,57,65,63,118,57,65,61,81,63,118,61,81,70,94,72,142,67,154,70,94,70,94,67,154,65,167,63,118,65,167,60,217,63,118,60,217,49,123,49,123,60,217,40,202,49,123,40,202,39,131,39,131,40,202,31,141,142,228,121,230,127,215,127,215,121,230,112,215,96,213,112,215,121,230,96,213,121,230,87,226,125,331,127,294,129,330,129,330,127,294,131,299,129,330,131,299,133,329,133,329,131,299,135,304,133,329,135,304,137,326,137,326,135,304,138,309,137,326,138,309,139,322,139,322,138,309,139,313,139,322,139,313,140,316,127,294,125,331,119,330,127,294,119,330,115,329,127,294,115,329,111,327,127,294,111,327,108,324,127,294,108,324,106,320,127,294,106,320,94,253,194,199,181,214,182,158,194,199,182,158,188,161,194,199,188,161,194,165,194,199,194,165,198,171,194,199,198,171,199,179,158,166,163,161,163,223,163,223,163,161,168,158,163,223,168,158,181,214,181,214,168,158,175,157,181,214,175,157,182,158,127,215,140,212,142,228,142,228,140,212,148,208,142,228,148,208,163,223,163,223,148,208,154,203,163,223,154,203,156,195,156,195,158,166,163,223,156,195,155,193,158,166,158,166,155,193,155,190,158,166,155,190,155,171,155,171,155,190,154,187,155,171,154,187,154,183,87,226,60,217,67,182,87,226,67,182,74,195,87,226,74,195,83,206,87,226,83,206,96,213,67,182,60,217,65,167,28,184,24,165,26,152,28,184,26,152,31,141,28,184,31,141,40,202,83,102,97,107,92,127,92,127,97,107,108,124,115,125,108,124,111,108,83,102,92,127,80,133,83,102,80,133,72,142,83,102,72,142,70,94,63,118,70,94,65,167,111,108,108,124,97,107,117,108,121,107,121,126,121,126,121,107,125,106,121,126,125,106,126,127,126,127,125,106,128,106,126,127,128,106,131,128,131,128,128,106,133,105,131,128,133,105,138,129,138,129,133,105,142,106,138,129,142,106,145,128,145,128,142,106,148,108,145,128,148,108,150,127,150,127,148,108,153,111,150,127,153,111,154,124,154,124,153,111,156,115,154,124,156,115,156,122,156,122,156,115,157,118,115,125,111,108,117,108,115,125,117,108,121,126,80,27,108,-4,95,22,95,22,108,-4,110,20,131,22,110,20,130,-1,131,22,130,-1,151,6,69,36,60,49,65,0,69,36,65,0,108,-4,69,36,108,-4,80,27,57,65,65,0,60,49,12,61,14,46,15,77,15,77,14,46,21,29,15,77,21,29,22,91,22,91,21,29,37,13,22,91,37,13,33,103,33,103,37,13,47,113,204,68,196,73,189,40,189,40,196,73,182,54,189,40,182,54,171,20,171,20,182,54,166,39,171,20,166,39,151,6,151,6,166,39,149,29,151,6,149,29,131,22,110,20,108,-4,130,-1,47,113,57,65,63,118,155,171,154,183,153,179,94,253,106,320,76,253, +84,253,101,253,134,294,142,304,145,309,147,313,147,316,146,322,144,326,140,329,132,331,122,329,119,327,116,324,113,320,16383,16383,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264, +15,176,20,182,22,203,22,203,20,182,25,188,22,203,25,188,33,216,33,216,25,188,30,193,33,216,30,193,36,194,36,194,39,193,44,225,44,225,39,193,41,190,44,225,41,190,44,184,13,188,5,172,12,170,13,188,12,170,15,176,13,188,15,176,22,203,87,190,86,190,88,0,87,190,88,0,88,174,87,190,88,174,102,205,88,174,100,185,102,205,102,205,100,185,111,194,102,205,111,194,117,216,117,216,111,194,120,199,117,216,120,199,131,224,131,224,120,199,130,202,131,224,130,202,140,203,140,203,153,201,145,229,145,229,153,201,159,230,88,0,86,190,84,205,88,0,84,205,81,215,88,0,81,215,76,223,88,0,76,223,68,226,88,0,68,226,56,228,88,0,56,228,46,156,88,0,46,156,46,0,145,229,131,224,140,203,218,-65,218,160,216,182,218,-65,216,182,208,202,218,-65,208,202,218,-76,196,217,180,226,181,-103,196,217,181,-103,184,-107,196,217,184,-107,218,-76,196,217,218,-76,208,202,184,-107,226,-107,223,-101,184,-107,223,-101,221,-94,184,-107,221,-94,219,-86,184,-107,219,-86,218,-76,180,226,159,230,163,195,180,226,163,195,170,185,180,226,170,185,174,172,180,226,174,172,176,154,180,226,176,154,176,-79,180,226,176,-79,177,-89,180,226,177,-89,179,-97,180,226,179,-97,181,-103,176,154,176,-64,176,-79,132,331,134,294,136,330,136,330,134,294,138,299,136,330,138,299,140,329,140,329,138,299,142,304,140,329,142,304,144,326,144,326,142,304,145,309,144,326,145,309,146,322,146,322,145,309,147,313,146,322,147,313,147,316,134,294,132,331,127,330,134,294,127,330,122,329,134,294,122,329,119,327,134,294,119,327,116,324,134,294,116,324,113,320,134,294,113,320,101,253,45,173,46,156,56,228,45,173,56,228,44,225,45,173,44,225,44,184,44,225,33,216,36,194,101,253,113,320,84,253,159,230,153,201,163,195, +40,253,57,253,90,294,98,304,101,309,103,313,103,316,102,322,100,326,96,329,93,330,89,331,83,330,78,329,75,327,72,324,70,320,16383,16383,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,201,271,202,278,16383,16383,100,253,118,253,151,294,159,304,162,309,163,313,164,316,163,322,161,326,157,329,149,331,143,330,139,329,135,327,132,324,130,320,16383,16383,103,278,101,286,98,293,92,298,85,302,78,303,70,302,63,298,58,293,54,286,53,278,54,271,58,264, +89,331,90,294,93,330,93,330,90,294,94,299,93,330,94,299,96,329,96,329,94,299,98,304,96,329,98,304,100,326,100,326,98,304,101,309,100,326,101,309,102,322,102,322,101,309,103,313,102,322,103,313,103,316,90,294,89,331,83,330,90,294,83,330,78,329,90,294,78,329,75,327,90,294,75,327,72,324,90,294,72,324,70,320,90,294,70,320,57,253,45,188,57,219,42,193,42,193,57,219,41,214,42,193,41,214,37,196,37,196,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,57,4,65,-2,72,224,72,224,65,-2,77,-4,72,224,77,-4,88,230,88,230,77,-4,89,40,88,230,89,40,89,228,91,33,92,-1,93,31,93,31,92,-1,105,7,93,31,105,7,95,29,95,29,105,7,99,28,105,29,99,28,105,7,105,29,105,7,116,20,133,50,126,54,126,35,126,35,126,54,120,43,126,35,120,43,116,20,116,20,120,43,115,36,116,20,115,36,110,31,92,-1,91,33,90,36,92,-1,90,36,89,40,92,-1,89,40,77,-4,57,219,45,188,47,181,57,219,47,181,47,172,57,219,47,172,48,26,57,219,48,26,51,14,57,219,51,14,57,4,57,219,57,4,72,224,47,172,47,39,48,26,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,24,196,26,208,24,196,28,196,15,196,10,204,10,195,105,29,116,20,110,31,57,253,70,320,40,253, +202,278,201,286,197,293,192,298,185,302,177,303,169,302,163,298,157,293,154,286,152,278,154,271,157,264,163,258,169,255,177,253,185,255,192,258,197,264,201,271,202,278,16383,16383,100,253,118,253,151,294,159,304,162,309,163,313,164,316,163,322,161,326,157,329,149,331,143,330,139,329,135,327,132,324,130,320,16383,16383,103,278,101,286,98,293,92,298,85,302,78,303,70,302,63,298,58,293,54,286,53,278,54,271,58,264,63,258,70,255,78,253,85,255,92,258,98,264,101,271,103,278,16383,16383,127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324, +18,176,23,182,26,203,26,203,23,182,28,188,26,203,28,188,36,216,36,216,28,188,33,193,36,216,33,193,39,194,39,194,43,192,47,225,47,225,43,192,46,187,47,225,46,187,48,180,16,188,8,172,15,170,16,188,15,170,18,176,16,188,18,176,26,203,49,99,51,66,49,159,49,170,49,159,60,228,49,170,60,228,48,180,48,180,60,228,47,225,54,286,54,271,58,293,58,293,54,271,58,264,58,293,58,264,63,298,63,298,58,264,63,258,63,298,63,258,70,302,70,302,63,258,70,255,70,302,70,255,78,303,78,303,70,255,78,253,78,303,78,253,85,302,85,302,78,253,85,255,85,302,85,255,92,298,92,298,85,255,92,258,92,298,92,258,98,293,98,293,92,258,98,264,98,293,98,264,101,286,101,286,98,264,101,271,101,286,101,271,103,278,91,87,91,193,90,205,91,87,90,205,86,215,91,87,86,215,80,222,91,87,80,222,92,68,141,230,127,230,139,218,141,230,139,218,149,214,141,230,149,214,173,225,200,75,193,49,204,18,204,18,193,49,182,28,204,18,182,28,174,1,174,1,182,28,165,14,174,1,165,14,142,9,142,9,121,14,139,-4,139,-4,121,14,106,28,139,-4,106,28,102,0,102,0,106,28,97,47,102,0,97,47,92,68,76,15,102,0,92,68,76,15,92,68,80,222,76,15,80,222,71,226,76,15,71,226,60,228,76,15,60,228,60,38,60,228,49,159,51,66,60,228,51,66,60,38,47,225,36,216,39,194,149,214,159,209,173,225,173,225,159,209,168,201,173,225,168,201,177,191,177,191,186,176,202,211,202,211,186,176,193,159,202,211,193,159,198,141,202,211,202,104,204,18,202,211,204,18,226,188,226,188,204,18,227,43,226,188,227,43,241,155,241,155,227,43,242,75,241,155,242,75,247,113,202,211,198,141,201,122,202,211,201,122,202,104,202,211,173,225,177,191,142,9,139,-4,174,1,154,286,154,271,157,293,157,293,154,271,157,264,157,293,157,264,163,298,163,298,157,264,163,258,163,298,163,258,169,302,169,302,163,258,169,255,169,302,169,255,177,303,177,303,169,255,177,253,177,303,177,253,185,302,185,302,177,253,185,255,185,302,185,255,192,298,192,298,185,255,192,258,192,298,192,258,197,293,197,293,192,258,197,264,197,293,197,264,201,286,201,286,197,264,201,271,201,286,201,271,202,278,149,331,151,294,153,330,153,330,151,294,155,299,153,330,155,299,157,329,157,329,155,299,159,304,157,329,159,304,161,326,161,326,159,304,162,309,161,326,162,309,163,322,163,322,162,309,163,313,163,322,163,313,164,316,151,294,149,331,143,330,151,294,143,330,139,329,151,294,139,329,135,327,151,294,135,327,132,324,151,294,132,324,130,320,151,294,130,320,118,253,118,253,130,320,100,253,154,271,154,286,152,278,200,75,204,18,202,104,139,218,127,230,127,220,54,271,54,286,53,278, +257,65,255,50,252,39,248,32,245,27,241,26,232,31,223,43,216,60,210,78,206,94,261,225,212,225,190,157,182,178,171,198,156,215,137,226,113,230,79,224,52,207,31,181,19,148,15,112,19,73,32,41,52,16,78,1,108,-4,129,-1,147,5,162,17,174,32,185,50,190,32,196,17,204,5,213,-1,225,-4,239,0,250,8,258,24,263,43,265,65,16383,16383,166,104,162,84,155,59,145,35,131,16,113,9,90,19,75,43,66,76,61,109,60,137,63,167,70,189,81,204,95,213,110,216,129,208,144,187,154,159,161,130,166,104,172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,124,328,144,322,158,309,167,290,172,268,173,247,172,235,170,225,166,215,160,209,152,206,147,207,141,208, +63,167,70,189,79,224,79,224,70,189,81,204,79,224,81,204,113,230,113,230,81,204,95,213,113,230,95,213,110,216,110,216,129,208,113,230,113,230,129,208,137,226,144,187,154,159,156,215,156,215,154,159,161,130,156,215,161,130,171,198,171,198,161,130,166,104,171,198,166,104,174,32,171,198,174,32,182,178,182,178,174,32,185,50,182,178,185,50,190,157,190,157,185,50,190,32,190,157,190,32,212,225,212,225,190,32,196,17,212,225,196,17,206,94,206,94,196,17,204,5,206,94,204,5,213,-1,137,226,129,208,144,187,137,226,144,187,156,215,174,32,166,104,162,84,174,32,162,84,162,17,162,17,162,84,155,59,162,17,155,59,147,5,147,5,155,59,145,35,147,5,145,35,131,16,78,1,108,-4,90,19,90,19,108,-4,113,9,131,16,113,9,129,-1,131,16,129,-1,147,5,210,78,206,94,213,-1,212,225,206,94,261,225,252,39,248,32,250,8,250,8,248,32,245,27,250,8,245,27,241,26,241,26,232,31,239,0,239,0,232,31,225,-4,210,78,213,-1,216,60,216,60,213,-1,225,-4,216,60,225,-4,223,43,223,43,225,-4,232,31,258,24,263,43,265,65,258,24,265,65,257,65,258,24,257,65,255,50,258,24,255,50,252,39,258,24,252,39,250,8,241,26,239,0,250,8,113,9,108,-4,129,-1,90,19,75,43,78,1,78,1,75,43,66,76,78,1,66,76,52,16,52,16,66,76,61,109,52,16,61,109,60,137,60,137,63,167,52,207,52,207,63,167,79,224,52,16,60,137,52,207,52,16,52,207,32,41,32,41,52,207,31,181,32,41,31,181,19,73,19,73,31,181,19,148,19,73,19,148,15,112, +172,200,181,204,190,209,196,215,202,222,206,229,209,236,211,244,213,251,213,257,214,264,209,289,197,311,179,327,157,338,133,342,102,337,76,322,54,293,41,249,36,186,36,-67,34,-85,30,-101,27,-107,70,-107,72,-102,74,-95,76,-87,78,-67,78,16,88,7,98,1,108,-2,119,-3,131,-4,164,2,192,19,214,46,228,78,233,114,231,137,223,158,211,176,194,190,173,199,16383,16383,78,243,78,250,79,276,85,297,95,314,108,324,124,328,144,322,158,309,167,290,172,268,173,247,172,235,170,225,166,215,160,209,152,206,147,207,141,208,136,209,130,210,118,210,112,208,108,206,106,203,105,200,106,195,109,192,113,189,118,188,125,187,130,187,142,190,148,190,158,187,169,178,179,162,187,136,190,101,187,72,179,47,167,28,150,16,129,11,114,13,100,19,88,26,80,35,78,45,222,225,172,225,120,49,115,84,108,130,97,177,78,214,49,228,32,224,20,212,12,195,7,173,5,150,12,150,16,166,21,178,28,187,35,192,41,194,66,179,84,143,96,96,103,50,107,18,103,9,100,0,96,-7,90,-25,84,-47,82,-57,81,-66,81,-74,82,-85,85,-94,90,-101,96,-106,105,-108,118,-105,127,-98,133,-87,135,-73,136,-58,136,-45,135,-32,133,-19,131,-8,129,0,110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,81,334,61,324, +108,324,124,328,124,328,133,342,124,328,144,322,133,342,144,322,157,338,157,338,144,322,158,309,157,338,158,309,179,327,179,327,158,309,167,290,179,327,167,290,172,268,172,200,181,204,172,235,172,200,172,235,170,225,172,200,170,225,169,178,172,200,169,178,179,162,172,200,179,162,173,199,233,114,231,137,228,78,228,78,231,137,223,158,228,78,223,158,214,46,214,46,223,158,211,176,214,46,211,176,194,190,192,19,214,46,194,190,192,19,194,190,190,101,192,19,190,101,187,72,192,19,187,72,179,47,192,19,179,47,167,28,192,19,167,28,164,2,194,190,173,199,179,162,194,190,179,162,187,136,194,190,187,136,190,101,170,225,166,215,169,178,169,178,166,215,160,209,169,178,160,209,158,187,158,187,160,209,152,206,129,11,131,-4,150,16,150,16,131,-4,164,2,150,16,164,2,167,28,85,297,95,314,102,337,102,337,95,314,108,324,102,337,108,324,133,342,133,342,108,324,124,328,78,250,79,276,76,322,78,250,76,322,76,-87,78,250,76,-87,77,-77,78,250,77,-77,78,-67,76,322,79,276,85,297,76,322,85,297,102,337,76,322,54,293,70,-107,76,322,70,-107,72,-102,76,322,72,-102,74,-95,76,322,74,-95,76,-87,70,-107,54,293,41,249,70,-107,41,249,36,186,70,-107,36,186,36,-67,70,-107,36,-67,35,-76,70,-107,35,-76,34,-85,70,-107,34,-85,32,-93,70,-107,32,-93,30,-101,70,-107,30,-101,27,-107,114,13,100,19,108,-2,114,13,108,-2,119,-3,114,13,119,-3,129,11,108,-2,100,19,98,1,98,1,100,19,88,26,98,1,88,26,88,7,88,7,88,26,80,35,88,7,80,35,78,45,78,45,78,16,88,7,148,190,152,206,147,207,148,190,147,207,142,190,118,188,125,187,127,210,127,210,125,187,130,187,127,210,130,187,130,210,130,210,130,187,134,188,130,210,134,188,136,209,136,209,134,188,138,189,136,209,138,189,141,208,141,208,138,189,142,190,141,208,142,190,147,207,106,203,106,195,108,206,108,206,106,195,109,192,108,206,109,192,112,208,112,208,109,192,113,189,112,208,113,189,118,210,118,210,113,189,118,188,118,210,118,188,127,210,173,247,181,204,179,327,173,247,179,327,172,268,206,229,209,236,209,289,209,289,209,236,211,244,209,289,211,244,214,264,214,264,211,244,213,251,214,264,213,251,213,257,190,209,196,215,197,311,197,311,196,215,202,222,197,311,202,222,209,289,209,289,202,222,206,229,197,311,179,327,181,204,197,311,181,204,190,209,172,235,181,204,173,247,148,190,158,187,152,206,131,-4,129,11,119,-3,106,195,106,203,105,200, +222,225,172,225,120,49,115,84,108,130,97,177,78,214,49,228,32,224,20,212,12,195,7,173,5,150,12,150,16,166,21,178,28,187,35,192,41,194,66,179,84,143,96,96,103,50,107,18,103,9,100,0,96,-7,90,-25,84,-47,82,-57,81,-66,81,-74,82,-85,85,-94,90,-101,96,-106,105,-108,118,-105,127,-98,133,-87,135,-73,136,-58,136,-45,135,-32,133,-19,131,-8,129,0,110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340, +35,192,41,194,41,194,49,228,41,194,66,179,49,228,66,179,78,214,78,214,66,179,84,143,78,214,84,143,97,177,97,177,84,143,96,96,97,177,96,96,103,50,120,49,115,84,118,-105,118,-105,115,84,108,130,118,-105,108,130,107,18,107,18,108,130,103,50,103,50,108,130,97,177,118,-105,127,-98,120,49,120,49,127,-98,129,0,120,49,129,0,172,225,172,225,129,0,222,225,107,18,103,9,105,-108,107,18,105,-108,118,-105,100,0,96,-7,96,-106,100,0,96,-106,105,-108,100,0,105,-108,103,9,96,-7,93,-16,96,-106,96,-106,93,-16,90,-25,96,-106,90,-25,90,-101,90,-101,90,-25,87,-36,90,-101,87,-36,85,-94,85,-94,87,-36,84,-47,85,-94,84,-47,82,-57,82,-85,85,-94,82,-57,82,-85,82,-57,81,-66,82,-85,81,-66,81,-74,135,-73,136,-58,136,-45,135,-73,136,-45,135,-32,135,-73,135,-32,133,-19,135,-73,133,-19,133,-87,133,-87,133,-19,131,-8,133,-87,131,-8,129,0,133,-87,129,0,127,-98,21,178,28,187,32,224,32,224,28,187,35,192,32,224,35,192,49,228,49,228,35,192,41,194,20,212,12,195,12,150,20,212,12,150,16,166,20,212,16,166,21,178,20,212,21,178,32,224,7,173,5,150,12,150,7,173,12,150,12,195, +110,213,77,203,50,187,31,164,19,137,15,108,20,74,34,44,56,18,86,1,123,-4,161,1,192,17,215,43,230,76,235,116,232,141,225,164,213,184,197,202,176,217,145,233,114,248,87,261,68,274,61,290,64,302,72,310,83,316,95,319,106,320,137,316,154,307,165,296,176,286,191,282,198,284,203,288,206,293,208,299,209,304,203,318,188,328,168,336,145,340,124,342,102,340,81,334,61,324,47,309,42,289,45,269,54,251,68,237,87,224,110,213,16383,16383,190,104,187,71,180,45,168,25,151,13,130,9,121,10,111,13,101,19,93,26,85,35,76,52,69,70,64,88,61,106,60,121,62,144,70,165,84,183,103,195,127,200,149,190,167,172,179,149,187,126,190,104,196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77, +42,289,45,269,47,309,47,309,45,269,54,251,47,309,54,251,61,324,61,324,54,251,61,290,68,237,61,290,54,251,64,302,72,310,81,334,81,334,72,310,83,316,81,334,83,316,102,340,102,340,83,316,95,319,102,340,95,319,106,320,106,320,137,316,124,342,124,342,137,316,145,340,61,324,61,290,64,302,61,324,64,302,81,334,198,284,203,288,203,318,203,318,203,288,206,293,203,318,206,293,209,304,209,304,206,293,208,299,154,307,165,296,168,336,168,336,165,296,176,286,168,336,176,286,188,328,188,328,176,286,191,282,188,328,191,282,203,318,203,318,191,282,198,284,145,340,137,316,154,307,145,340,154,307,168,336,235,116,232,141,230,76,230,76,232,141,225,164,230,76,225,164,215,43,215,43,225,164,213,184,215,43,213,184,197,202,192,17,215,43,197,202,192,17,197,202,190,104,192,17,190,104,187,71,192,17,187,71,180,45,192,17,180,45,168,25,192,17,168,25,161,1,197,202,176,217,179,149,197,202,179,149,187,126,197,202,187,126,190,104,145,233,127,200,149,190,145,233,149,190,176,217,176,217,149,190,167,172,176,217,167,172,179,149,111,13,123,-4,121,10,121,10,123,-4,130,9,151,13,130,9,161,1,151,13,161,1,168,25,130,9,123,-4,161,1,124,342,102,340,106,320,69,70,86,1,76,52,76,52,86,1,85,35,93,26,85,35,86,1,93,26,86,1,123,-4,68,274,68,237,87,261,87,261,68,237,87,224,87,261,87,224,114,248,114,248,87,224,110,213,114,248,110,213,127,200,62,144,70,165,77,203,77,203,70,165,84,183,77,203,84,183,110,213,110,213,84,183,103,195,110,213,103,195,127,200,77,203,50,187,62,144,62,144,50,187,60,121,61,106,60,121,56,18,61,106,56,18,64,88,64,88,56,18,86,1,64,88,86,1,69,70,56,18,60,121,50,187,56,18,50,187,34,44,34,44,50,187,31,164,34,44,31,164,20,74,20,74,31,164,19,137,20,74,19,137,15,108,101,19,93,26,123,-4,101,19,123,-4,111,13,61,290,68,237,68,274,127,200,145,233,114,248, +196,73,182,54,166,39,149,29,131,22,110,20,95,22,80,27,69,36,60,49,57,65,61,81,70,94,83,102,97,107,111,108,117,108,125,106,128,106,133,105,142,106,148,108,153,111,156,115,157,118,156,122,154,124,150,127,145,128,138,129,131,128,121,126,115,125,108,124,92,127,80,133,72,142,67,154,65,167,67,182,74,195,83,206,96,213,112,215,127,215,140,212,148,208,154,203,156,195,155,193,155,190,154,187,154,183,153,179,155,171,158,166,163,161,168,158,175,157,182,158,188,161,194,165,198,171,199,179,194,199,181,214,163,223,142,228,121,230,87,226,60,217,40,202,28,184,24,165,26,152,31,141,39,131,49,123,63,118,47,113,33,103,22,91,15,77,12,61,14,46,21,29,37,13,65,0,108,-4,130,-1,151,6,171,20,189,40,204,68,76,342,59,335,45,327,35,318,29,308,27,296,30,283,38,272,48,265,60,260,71,259,72,257,52,225,36,196,25,166,19,135,17,100,21,58,33,28,49,9,71,-1,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,117,41,113,40,103,40,78,44,61,55,49,72,43,93,41,117,44,151,53,184,65,213,80,238,94,257,119,262,142,271,161,283,174,297,179,311,178,316,175,321,171,325,166,327,159,328,142,325,125,315,108,302,94,287,84,273,74,274,65,277,57,281,52,288, +37,13,65,0,47,113,47,113,65,0,57,65,63,118,57,65,61,81,63,118,61,81,70,94,72,142,67,154,70,94,70,94,67,154,65,167,63,118,65,167,60,217,63,118,60,217,49,123,49,123,60,217,40,202,49,123,40,202,39,131,39,131,40,202,31,141,142,228,121,230,127,215,127,215,121,230,112,215,96,213,112,215,121,230,96,213,121,230,87,226,194,199,181,214,182,158,194,199,182,158,188,161,194,199,188,161,194,165,194,199,194,165,198,171,194,199,198,171,199,179,158,166,163,161,163,223,163,223,163,161,168,158,163,223,168,158,181,214,181,214,168,158,175,157,181,214,175,157,182,158,127,215,140,212,142,228,142,228,140,212,148,208,142,228,148,208,163,223,163,223,148,208,154,203,163,223,154,203,156,195,156,195,158,166,163,223,156,195,155,193,158,166,158,166,155,193,155,190,158,166,155,190,155,171,155,171,155,190,154,187,155,171,154,187,154,183,87,226,60,217,67,182,87,226,67,182,74,195,87,226,74,195,83,206,87,226,83,206,96,213,67,182,60,217,65,167,28,184,24,165,26,152,28,184,26,152,31,141,28,184,31,141,40,202,83,102,97,107,92,127,92,127,97,107,108,124,115,125,108,124,111,108,83,102,92,127,80,133,83,102,80,133,72,142,83,102,72,142,70,94,63,118,70,94,65,167,111,108,108,124,97,107,117,108,121,107,121,126,121,126,121,107,125,106,121,126,125,106,126,127,126,127,125,106,128,106,126,127,128,106,131,128,131,128,128,106,133,105,131,128,133,105,138,129,138,129,133,105,142,106,138,129,142,106,145,128,145,128,142,106,148,108,145,128,148,108,150,127,150,127,148,108,153,111,150,127,153,111,154,124,154,124,153,111,156,115,154,124,156,115,156,122,156,122,156,115,157,118,115,125,111,108,117,108,115,125,117,108,121,126,80,27,108,-4,95,22,95,22,108,-4,110,20,131,22,110,20,130,-1,131,22,130,-1,151,6,69,36,60,49,65,0,69,36,65,0,108,-4,69,36,108,-4,80,27,57,65,65,0,60,49,12,61,14,46,15,77,15,77,14,46,21,29,15,77,21,29,22,91,22,91,21,29,37,13,22,91,37,13,33,103,33,103,37,13,47,113,204,68,196,73,189,40,189,40,196,73,182,54,189,40,182,54,171,20,171,20,182,54,166,39,171,20,166,39,151,6,151,6,166,39,149,29,151,6,149,29,131,22,110,20,108,-4,130,-1,47,113,57,65,63,118,155,171,154,183,153,179, +76,342,59,335,45,327,35,318,29,308,27,296,30,283,38,272,48,265,60,260,71,259,72,257,52,225,36,196,25,166,19,135,17,100,21,58,33,28,49,9,71,-1,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,117,41,113,40,103,40,78,44,61,55,49,72,43,93,41,117,44,151,53,184,65,213,80,238,94,257,119,262,142,271,161,283,174,297,179,311,178,316,175,321,171,325,166,327,159,328,142,325,125,315,108,302,94,287,84,273,74,274,65,277,57,281,52,288,50,298,51,305,55,312,61,320,70,328,81,334,226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383, +43,93,41,117,41,117,36,196,41,117,44,151,36,196,44,151,52,225,52,225,44,151,53,184,52,225,53,184,72,257,72,257,53,184,65,213,72,257,65,213,80,238,48,265,50,298,45,327,48,265,45,327,38,272,38,272,45,327,35,318,38,272,35,318,30,283,30,283,35,318,29,308,30,283,29,308,27,296,51,305,55,312,59,335,59,335,55,312,61,320,59,335,61,320,76,342,76,342,61,320,70,328,76,342,70,328,81,334,51,305,59,335,45,327,51,305,45,327,50,298,108,302,94,287,94,257,94,257,94,287,84,273,94,257,84,273,80,238,80,238,84,273,74,274,80,238,74,274,72,257,72,257,74,274,71,259,166,327,159,328,161,283,161,283,159,328,142,325,161,283,142,325,142,271,142,271,142,325,125,315,142,271,125,315,119,262,119,262,125,315,108,302,119,262,108,302,94,257,65,277,57,281,60,260,65,277,60,260,71,259,65,277,71,259,74,274,52,288,50,298,48,265,52,288,48,265,60,260,52,288,60,260,57,281,71,-1,95,-4,78,44,78,44,95,-4,103,40,108,40,103,40,105,-4,108,40,105,-4,117,-2,61,55,49,72,49,9,61,55,49,9,71,-1,61,55,71,-1,78,44,43,93,41,117,33,28,43,93,33,28,49,9,43,93,49,9,49,72,41,117,36,196,33,28,33,28,36,196,25,166,33,28,25,166,21,58,21,58,25,166,19,135,21,58,19,135,17,100,177,30,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-1,137,0,128,41,128,-1,128,41,123,41,128,-1,123,41,117,41,128,-1,117,41,117,-2,113,40,108,40,117,-2,113,40,117,-2,117,41,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-29,201,-3,199,-55,199,-55,201,-3,192,16,199,-55,192,16,188,-34,188,-34,187,-76,199,-55,158,-1,170,-5,177,30,177,30,170,-5,180,-12,177,30,180,-12,192,16,192,16,180,-12,186,-22,192,16,186,-22,188,-34,187,-76,188,-34,186,-47,187,-76,186,-47,180,-58,187,-76,180,-58,170,-67,187,-76,170,-67,170,-93,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,175,321,171,325,174,297,175,321,174,297,179,311,175,321,179,311,178,316,166,327,161,283,174,297,166,327,174,297,171,325,103,40,95,-4,105,-4,98,-90,97,-73,96,-80,159,-72,170,-93,170,-67, +226,-107,223,-101,221,-94,219,-86,218,-76,218,160,216,182,208,202,196,217,180,226,159,230,145,229,131,224,117,216,102,205,87,190,86,190,84,205,81,215,76,223,68,226,56,228,44,225,33,216,22,203,13,188,5,172,12,170,15,176,25,188,30,193,36,194,39,193,41,190,44,184,45,173,46,156,46,0,88,0,88,174,100,185,111,194,120,199,130,202,140,203,153,201,163,195,170,185,174,172,176,154,176,-79,177,-89,179,-97,181,-103,184,-107,234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,189,158,187,109,180,67,168,36,151,16,128,9,98,18,78,42,67,77,61,118, +15,176,20,182,22,203,22,203,20,182,25,188,22,203,25,188,33,216,33,216,25,188,30,193,33,216,30,193,36,194,36,194,39,193,44,225,44,225,39,193,41,190,44,225,41,190,44,184,13,188,5,172,12,170,13,188,12,170,15,176,13,188,15,176,22,203,87,190,86,190,88,0,87,190,88,0,88,174,87,190,88,174,102,205,88,174,100,185,102,205,102,205,100,185,111,194,102,205,111,194,117,216,117,216,111,194,120,199,117,216,120,199,131,224,131,224,120,199,130,202,131,224,130,202,140,203,140,203,153,201,145,229,145,229,153,201,159,230,88,0,86,190,84,205,88,0,84,205,81,215,88,0,81,215,76,223,88,0,76,223,68,226,88,0,68,226,56,228,88,0,56,228,46,156,88,0,46,156,46,0,145,229,131,224,140,203,218,-65,218,160,216,182,218,-65,216,182,208,202,218,-65,208,202,218,-76,196,217,180,226,181,-103,196,217,181,-103,184,-107,196,217,184,-107,218,-76,196,217,218,-76,208,202,184,-107,226,-107,223,-101,184,-107,223,-101,221,-94,184,-107,221,-94,219,-86,184,-107,219,-86,218,-76,180,226,159,230,163,195,180,226,163,195,170,185,180,226,170,185,174,172,180,226,174,172,176,154,180,226,176,154,176,-79,180,226,176,-79,177,-89,180,226,177,-89,179,-97,180,226,179,-97,181,-103,176,154,176,-64,176,-79,45,173,46,156,56,228,45,173,56,228,44,225,45,173,44,225,44,184,44,225,33,216,36,194,159,230,153,201,163,195, +234,166,233,198,230,228,226,254,220,277,211,296,199,313,185,325,169,334,150,340,126,342,87,333,55,310,32,273,18,226,13,170,14,144,15,120,18,100,23,81,28,64,40,41,55,21,74,7,96,-1,122,-4,161,3,192,27,215,63,229,110,234,166,16383,16383,59,177,59,193,62,247,70,285,83,310,99,324,119,328,150,318,171,292,182,256,188,216,189,177,16383,16383,189,158,187,109,180,67,168,36,151,16,128,9,98,18,78,42,67,77,61,118,59,161,189,161,126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206, +150,340,126,342,150,318,150,318,126,342,119,328,99,324,119,328,126,342,99,324,126,342,87,333,230,228,226,254,229,110,230,228,229,110,234,166,230,228,234,166,233,198,220,277,211,296,215,63,220,277,215,63,229,110,220,277,229,110,226,254,23,81,28,64,32,273,32,273,28,64,40,41,32,273,40,41,55,310,55,310,40,41,55,21,55,310,55,21,59,193,59,193,55,21,59,161,59,193,59,161,59,177,59,177,59,161,189,177,189,177,59,161,189,161,189,177,189,161,192,27,189,177,192,27,199,313,199,313,192,27,215,63,199,313,215,63,211,296,171,292,182,256,185,325,185,325,182,256,188,216,185,325,188,216,199,313,199,313,188,216,189,177,169,334,150,340,150,318,169,334,150,318,171,292,169,334,171,292,185,325,187,109,180,67,192,27,192,27,180,67,168,36,192,27,168,36,161,3,161,3,168,36,151,16,161,3,151,16,128,9,128,9,98,18,122,-4,122,-4,98,18,96,-1,78,42,67,77,74,7,78,42,74,7,96,-1,78,42,96,-1,98,18,59,161,55,21,61,118,61,118,55,21,74,7,61,118,74,7,67,77,189,158,187,109,192,27,189,158,192,27,189,161,128,9,122,-4,161,3,59,193,62,247,55,310,55,310,62,247,70,285,55,310,70,285,87,333,87,333,70,285,83,310,87,333,83,310,99,324,14,144,15,120,18,226,18,226,15,120,18,100,18,226,18,100,32,273,32,273,18,100,23,81,14,144,18,226,13,170, +126,54,120,43,115,36,110,31,105,29,99,28,95,29,91,33,90,36,89,40,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,37,196,42,193,45,188,47,181,47,39,48,26,51,14,57,4,65,-2,77,-4,92,-1,105,7,116,20,126,35,133,50,252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,244,214,240,220,234,225,226,229,215,230,202,228,184,222,160,205,127,176,83,129,83,229, +45,188,57,219,42,193,42,193,57,219,41,214,42,193,41,214,37,196,37,196,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,57,4,65,-2,72,224,72,224,65,-2,77,-4,72,224,77,-4,88,230,88,230,77,-4,89,40,88,230,89,40,89,228,91,33,92,-1,93,31,93,31,92,-1,105,7,93,31,105,7,95,29,95,29,105,7,99,28,105,29,99,28,105,7,105,29,105,7,116,20,133,50,126,54,126,35,126,35,126,54,120,43,126,35,120,43,116,20,116,20,120,43,115,36,116,20,115,36,110,31,92,-1,91,33,90,36,92,-1,90,36,89,40,92,-1,89,40,77,-4,57,219,45,188,47,181,57,219,47,181,47,172,57,219,47,172,48,26,57,219,48,26,51,14,57,219,51,14,57,4,57,219,57,4,72,224,47,172,47,39,48,26,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,24,196,26,208,24,196,28,196,15,196,10,204,10,195,105,29,116,20,110,31, +252,0,252,7,239,10,228,13,219,19,209,27,199,39,113,140,131,158,147,172,161,181,174,185,188,187,194,186,201,185,207,183,213,182,220,181,227,182,233,185,239,189,243,196,245,206,244,214,240,220,234,225,226,229,215,230,202,228,184,222,160,205,127,176,83,129,83,229,81,230,70,226,48,220,35,216,18,212,3,208,3,200,10,200,14,201,20,201,28,200,34,197,38,192,40,183,41,171,41,0,83,0,83,113,148,34,151,30,155,24,156,22,156,20,155,15,153,12,149,9,144,8,137,7,133,7,133,0,238,69,235,53,229,42,222,35,215,31,209,30,200,32,193,38,186,47,181,58,176,71,121,266,113,292,104,313,95,329,83,338,68,342,51,337,39,325,32,308,28,288,26,268,34,268,38,284,43,295,49,302,56,305,64,306,74,304,83,296,92,283,100,267,107,248,113,225,6,0,56,0,128,177,164,45,169,29,176,15,184,4,193,-2,204,-5,219,-1,230,8,239,24,244,45,246,69,251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48, +10,200,14,201,18,212,18,212,14,201,17,201,18,212,17,201,20,201,20,201,28,200,35,216,35,216,28,200,34,197,35,216,34,197,38,192,7,200,10,200,18,212,7,200,18,212,3,208,7,200,3,208,3,200,35,216,38,192,48,220,48,220,38,192,40,183,48,220,40,183,41,171,83,0,41,171,41,0,35,216,18,212,20,201,83,129,83,229,81,230,83,129,81,230,83,0,83,129,83,0,83,113,83,129,83,113,127,176,131,158,147,172,160,205,160,205,147,172,161,181,160,205,161,181,184,222,184,222,161,181,174,185,184,222,174,185,188,187,188,187,194,186,202,228,202,228,194,186,201,185,202,228,201,185,207,183,127,176,83,113,113,140,127,176,113,140,131,158,127,176,131,158,160,205,83,0,81,230,70,226,83,0,70,226,59,223,83,0,59,223,48,220,83,0,48,220,41,171,227,182,233,185,234,225,234,225,233,185,239,189,234,225,239,189,240,220,240,220,239,189,243,196,240,220,243,196,244,214,244,214,243,196,245,206,207,183,213,182,215,230,215,230,213,182,220,181,215,230,220,181,226,229,226,229,220,181,227,182,226,229,227,182,234,225,202,228,184,222,188,187,153,12,149,9,252,0,252,0,149,9,144,8,252,0,144,8,137,7,156,20,252,0,228,13,156,20,228,13,219,19,156,20,219,19,209,27,156,20,209,27,199,39,156,20,199,39,156,22,199,39,113,140,148,34,199,39,148,34,151,30,199,39,151,30,153,27,199,39,153,27,155,24,199,39,155,24,156,22,239,10,228,13,252,0,239,10,252,0,252,7,155,15,153,12,252,0,155,15,252,0,156,20,133,7,133,0,252,0,133,7,252,0,137,7,148,34,113,140,83,113,202,228,207,183,215,230, +238,69,235,53,229,42,222,35,215,31,209,30,200,32,193,38,186,47,181,58,176,71,121,266,113,292,104,313,95,329,83,338,68,342,51,337,39,325,32,308,28,288,26,268,34,268,38,284,43,295,49,302,56,305,64,306,74,304,83,296,92,283,100,267,107,248,113,225,6,0,56,0,128,177,164,45,169,29,176,15,184,4,193,-2,204,-5,219,-1,230,8,239,24,244,45,246,69,251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,166,44,161,40,153,33,144,29,136,26,128,24,121,24,108,26,96,32,87,41,80,53,78,69,78,225,36,225,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,69,-107,71,-102,73,-94,75,-85,76,-75,76,9,78,9,81,4,87,0,93,-2,101,-4,109,-4, +56,305,64,306,64,306,68,342,64,306,74,304,68,342,74,304,83,338,83,338,74,304,83,296,83,338,83,296,95,329,95,329,83,296,92,283,95,329,92,283,100,267,113,292,107,248,113,225,113,292,113,225,121,266,121,266,113,225,128,177,121,266,128,177,176,71,176,71,128,177,164,45,176,71,164,45,169,29,104,313,95,329,100,267,104,313,100,267,107,248,104,313,107,248,113,292,176,71,169,29,176,15,176,71,176,15,184,4,113,225,6,0,56,0,113,225,56,0,128,177,200,32,193,38,193,-2,193,-2,193,38,186,47,193,-2,186,47,184,4,184,4,186,47,181,58,184,4,181,58,176,71,235,53,229,42,230,8,230,8,229,42,222,35,230,8,222,35,219,-1,219,-1,222,35,215,31,219,-1,215,31,209,30,209,30,200,32,204,-5,204,-5,200,32,193,-2,239,24,244,45,246,69,239,24,246,69,238,69,239,24,238,69,235,53,239,24,235,53,230,8,209,30,204,-5,219,-1,43,295,49,302,51,337,51,337,49,302,56,305,51,337,56,305,68,342,68,342,56,305,64,306,39,325,32,308,34,268,39,325,34,268,38,284,39,325,38,284,43,295,39,325,43,295,51,337,28,288,26,268,34,268,28,288,34,268,32,308, +251,53,244,42,239,35,234,31,230,29,224,28,221,29,218,31,216,36,215,45,214,56,214,225,172,225,172,59,171,53,169,48,166,44,161,40,153,33,144,29,136,26,128,24,121,24,108,26,96,32,87,41,80,53,78,69,78,225,36,225,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,69,-107,71,-102,73,-94,75,-85,76,-75,76,9,78,9,81,4,87,0,93,-2,101,-4,109,-4,119,-3,131,0,144,7,158,19,171,36,172,36,173,23,177,12,182,3,191,-2,203,-4,217,-1,230,7,241,20,250,35,258,50,212,230,206,188,189,141,163,97,129,63,90,45,89,45,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,31,196,37,195,42,192,45,188,47,181,47,-6,59,-6,100,7,134,28,163,55,186,84,203,116,212,141,217,166,220,189,221,211,222,230,89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4, +78,225,36,225,69,-107,78,225,69,-107,71,-102,78,225,71,-102,73,-94,78,225,73,-94,75,-85,78,225,75,-85,76,-75,78,225,76,-75,76,9,78,225,76,9,78,9,69,-107,36,225,36,-65,69,-107,36,-65,35,-75,69,-107,35,-75,34,-84,69,-107,34,-84,32,-93,69,-107,32,-93,30,-101,69,-107,30,-101,27,-107,87,0,93,-2,96,32,96,32,93,-2,101,-4,96,32,101,-4,108,26,108,26,101,-4,109,-4,108,26,109,-4,121,24,121,24,109,-4,119,-3,121,24,119,-3,131,0,171,53,169,48,171,36,171,36,169,48,166,44,171,36,166,44,161,40,161,40,153,33,158,19,158,19,153,33,144,29,158,19,144,29,144,7,144,7,144,29,136,26,144,7,136,26,131,0,131,0,136,26,128,24,131,0,128,24,121,24,87,41,80,53,81,4,87,41,81,4,87,0,87,41,87,0,96,32,81,4,80,53,78,69,81,4,78,69,78,9,214,225,172,225,173,23,173,23,172,225,172,68,173,23,172,68,172,36,172,36,172,68,172,59,172,36,172,59,171,36,171,36,172,59,171,53,161,40,158,19,171,36,214,225,173,23,177,12,214,225,177,12,182,3,214,225,182,3,191,-2,214,225,191,-2,203,-4,214,225,203,-4,214,56,244,42,239,35,241,20,241,20,239,35,234,31,241,20,234,31,230,7,230,7,234,31,230,29,230,7,230,29,224,28,224,28,221,29,230,7,230,7,221,29,218,31,230,7,218,31,217,-1,217,-1,218,31,216,36,217,-1,216,36,215,45,250,35,258,50,251,53,250,35,251,53,244,42,250,35,244,42,241,20,215,45,214,56,203,-4,215,45,203,-4,217,-1,76,9,76,-75,76,-64, +212,230,206,188,189,141,163,97,129,63,90,45,89,45,89,228,88,230,72,224,57,219,41,214,26,208,10,204,10,195,15,196,31,196,37,195,42,192,45,188,47,181,47,-6,59,-6,100,7,134,28,163,55,186,84,203,116,212,141,217,166,220,189,221,211,222,230,89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,107,-4,117,-2, +45,188,57,219,42,192,42,192,57,219,41,214,42,192,41,214,37,195,37,195,41,214,31,196,28,196,31,196,41,214,28,196,41,214,26,208,89,228,88,230,89,45,89,45,88,230,72,224,89,45,72,224,59,-6,59,-6,72,224,57,219,59,-6,57,219,47,172,47,172,57,219,47,181,26,208,10,204,15,196,26,208,15,196,20,196,26,208,20,196,25,196,26,208,25,196,28,196,186,84,189,141,163,55,163,55,189,141,163,97,163,55,163,97,134,28,134,28,163,97,129,63,134,28,129,63,100,7,100,7,129,63,90,45,189,141,203,116,206,188,206,188,203,116,212,141,206,188,212,141,212,230,212,230,212,141,217,166,212,230,217,166,222,230,222,230,217,166,220,189,222,230,220,189,221,211,89,45,59,-6,100,7,89,45,100,7,90,45,47,172,47,-6,59,-6,15,196,10,204,10,195,189,141,186,84,203,116,57,219,45,188,47,181, +89,342,71,335,57,328,48,319,43,309,41,297,42,286,47,278,53,272,61,268,69,266,63,259,58,251,54,242,52,233,51,224,52,215,55,206,59,198,65,190,73,184,54,168,39,150,27,129,20,106,17,81,20,53,29,29,44,11,67,0,98,-4,107,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-59,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-53,204,-26,201,-3,192,15,177,29,156,38,128,41,118,41,111,40,98,40,79,42,63,48,51,59,43,75,40,98,43,118,50,136,62,152,77,164,94,174,102,172,110,171,117,170,142,170,157,173,171,178,181,186,185,197,184,204,179,210,172,214,164,216,153,217,140,216,127,213,113,208,101,202,89,194,83,199,78,204,74,211,72,218,71,225,73,235,77,243,83,251,93,256,106,258,126,260,144,264,160,271,171,280,175,291,174,297,171,301,166,305,160,307,151,307,139,306,125,303,111,297,96,290,83,281,76,283,70,286,66,291,64,297,63,305,64,310,66,316,72,322,80,328,93,334,237,114,232,151,218,183,197,208,167,224,129,230,91,223,60,203,37,174,22,139,17,101,23,67,38,38,62,15,92,0,126,-4,161,2,191,20,215,47,231,79,237,114,16383,16383,192,95,190,74,183,52,172,31,156,17,134,11,107,19,87,38,73,65,65,95,62,122,64,145,70,169,80,191,97,207,119,214,148,205,168,184,182,155,190,124,192,95,233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,23,6,30,0,39,-5,52,-6,77,9,91,48,98,99,100,148,100,183,147,183,145,160,143,136,139,82,139,56,141,37,147,20,156,7,169,-1,185,-4,205,0,220,12,232,29,239,49,241,69,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225, +51,59,43,75,44,11,44,11,43,75,40,98,39,150,40,98,43,118,39,150,43,118,54,168,54,168,43,118,50,136,54,168,50,136,62,152,61,268,63,305,57,328,61,268,57,328,53,272,53,272,57,328,48,319,53,272,48,319,47,278,47,278,48,319,43,309,47,278,43,309,42,286,42,286,43,309,41,297,64,310,66,316,71,335,71,335,66,316,72,322,71,335,72,322,89,342,89,342,72,322,80,328,89,342,80,328,93,334,64,310,71,335,57,328,64,310,57,328,63,305,73,235,76,283,71,225,71,225,70,286,69,266,69,266,70,286,66,291,69,266,66,291,64,297,83,281,76,283,77,243,83,281,77,243,83,251,83,281,83,251,96,290,72,218,73,184,74,211,74,211,73,184,77,164,74,211,77,164,78,204,78,204,77,164,94,174,78,204,94,174,83,199,83,199,94,174,89,194,101,202,94,174,102,172,101,202,102,172,113,208,113,208,102,172,110,171,113,208,110,171,117,170,73,184,54,168,62,152,73,184,62,152,77,164,73,184,72,218,71,225,73,184,71,225,69,266,73,184,69,266,65,190,52,233,52,215,54,242,54,242,52,215,55,206,54,242,55,206,58,251,58,251,55,206,59,198,58,251,59,198,63,259,63,259,59,198,65,190,63,259,65,190,69,266,64,297,63,305,61,268,64,297,61,268,69,266,128,41,124,41,128,-1,128,-1,124,41,118,41,128,-1,118,41,117,-2,117,-2,118,41,111,40,117,-2,111,40,107,-4,107,-4,111,40,104,40,107,-4,104,40,98,-4,98,-4,104,40,98,40,177,29,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-26,201,-3,199,-53,199,-53,201,-3,192,15,199,-53,192,15,188,-34,188,-34,187,-76,199,-53,158,-1,170,-5,177,29,177,29,170,-5,180,-12,177,29,180,-12,192,15,192,15,180,-12,186,-22,192,15,186,-22,188,-34,188,-34,186,-47,187,-76,187,-76,186,-47,180,-59,187,-76,180,-59,170,-93,170,-93,180,-59,170,-67,170,-93,170,-67,159,-72,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,181,186,185,197,184,204,181,186,184,204,179,210,181,186,179,210,172,214,181,186,172,214,171,178,117,170,124,170,127,213,127,213,124,170,131,170,127,213,131,170,140,216,140,216,131,170,142,170,140,216,142,170,153,217,153,217,142,170,157,173,153,217,157,173,164,216,164,216,157,173,171,178,164,216,171,178,172,214,160,307,160,271,166,305,166,305,160,271,171,280,166,305,171,280,171,301,171,301,171,280,175,291,171,301,175,291,174,297,125,303,126,260,139,306,139,306,126,260,144,264,139,306,144,264,151,307,151,307,144,264,160,271,151,307,160,271,160,307,83,251,93,256,96,290,96,290,93,256,106,258,96,290,106,258,111,297,111,297,106,258,126,260,111,297,126,260,125,303,79,42,63,48,67,0,79,42,67,0,98,-4,79,42,98,-4,98,40,51,59,44,11,67,0,51,59,67,0,63,48,29,29,44,11,40,98,29,29,40,98,39,150,29,29,39,150,27,129,29,29,27,129,20,53,20,106,17,81,20,53,20,106,20,53,27,129,113,208,117,170,127,213,98,-90,97,-73,96,-80,128,41,128,-1,137,0,52,215,52,233,51,224,94,174,101,202,89,194,70,286,71,225,76,283,76,283,73,235,77,243, +237,114,232,151,218,183,197,208,167,224,129,230,91,223,60,203,37,174,22,139,17,101,23,67,38,38,62,15,92,0,126,-4,161,2,191,20,215,47,231,79,237,114,16383,16383,192,95,190,74,183,52,172,31,156,17,134,11,107,19,87,38,73,65,65,95,62,122,64,145,70,169,80,191,97,207,119,214,148,205,168,184,182,155,190,124,192,95,233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15, +97,207,119,214,119,214,129,230,119,214,148,205,129,230,148,205,167,224,167,224,148,205,168,184,167,224,168,184,197,208,197,208,168,184,182,155,197,208,182,155,190,124,190,74,183,52,191,20,191,20,183,52,172,31,191,20,172,31,161,2,161,2,172,31,156,17,161,2,156,17,134,11,134,11,107,19,126,-4,126,-4,107,19,92,0,107,19,87,38,92,0,92,0,87,38,73,65,92,0,73,65,62,15,62,15,73,65,65,95,62,15,65,95,62,122,80,191,91,223,70,169,70,169,91,223,60,203,70,169,60,203,64,145,64,145,60,203,62,122,62,15,62,122,60,203,62,15,60,203,38,38,38,38,60,203,37,174,38,38,37,174,23,67,23,67,37,174,22,139,23,67,22,139,17,101,237,114,232,151,231,79,231,79,232,151,218,183,231,79,218,183,215,47,215,47,218,183,197,208,215,47,197,208,192,95,192,95,191,20,215,47,134,11,126,-4,161,2,97,207,119,214,129,230,97,207,129,230,91,223,97,207,91,223,80,191,190,74,191,20,192,95,197,208,190,124,192,95, +233,69,229,55,223,45,216,40,209,37,203,36,194,38,188,41,184,47,180,54,178,61,177,69,176,78,175,88,175,109,176,127,176,144,178,160,179,173,180,183,239,183,239,225,97,225,68,222,46,214,29,200,16,180,4,155,12,155,23,167,35,176,47,180,62,183,78,183,72,119,64,77,54,54,42,42,30,36,26,35,20,31,18,25,20,15,23,6,30,0,39,-5,52,-6,77,9,91,48,98,99,100,148,100,183,147,183,145,160,143,136,139,82,139,56,141,37,147,20,156,7,169,-1,185,-4,205,0,220,12,232,29,239,49,241,69,36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,129,230,101,225,75,210,54,182,41,138,36,76,16383,16383,78,137,79,163,85,185,94,202,107,212,123,216,145,211,163,197,177,175,186,144,190,106,187,75,179,49,166,29,150,16,129,11,115,13,101,18,89,26,81,35,78,44,216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45, +72,119,64,77,77,9,77,9,64,77,54,54,77,9,54,54,52,-6,52,-6,54,54,42,42,52,-6,42,42,39,-5,39,-5,42,42,30,36,39,-5,30,36,30,0,30,0,30,36,26,35,30,0,26,35,23,6,23,6,26,35,23,33,23,6,23,33,20,31,20,15,23,6,20,31,20,15,20,31,19,28,20,15,19,28,18,25,97,225,68,222,78,183,78,183,91,48,97,225,97,225,91,48,98,99,97,225,98,99,100,183,100,183,98,99,100,148,180,183,239,183,239,225,180,183,239,225,147,183,147,183,239,225,100,183,176,78,175,88,169,-1,169,-1,175,88,175,99,169,-1,175,99,175,109,175,109,176,127,169,-1,169,-1,176,127,176,144,169,-1,176,144,156,7,156,7,176,144,178,160,156,7,178,160,179,173,147,20,180,183,147,183,147,20,147,183,145,160,179,173,180,183,147,20,179,173,147,20,156,7,97,225,100,183,239,225,4,155,12,155,16,180,16,180,12,155,23,167,16,180,23,167,29,200,29,200,23,167,35,176,29,200,35,176,46,214,46,214,35,176,47,180,46,214,47,180,68,222,68,222,47,180,62,183,68,222,62,183,78,183,188,41,184,47,185,-4,185,-4,184,47,180,54,185,-4,180,54,178,61,178,61,177,69,185,-4,185,-4,177,69,169,-1,188,41,205,0,194,38,194,38,205,0,203,36,209,37,203,36,205,0,209,37,205,0,220,12,233,69,229,55,232,29,233,69,232,29,239,49,233,69,239,49,241,69,223,45,216,40,220,12,223,45,220,12,232,29,223,45,232,29,229,55,143,136,141,109,141,37,143,136,141,37,147,20,143,136,147,20,145,160,139,82,139,56,141,37,139,82,141,37,141,109,78,183,72,119,77,9,78,183,77,9,91,48,176,78,169,-1,177,69,188,41,185,-4,205,0,209,37,220,12,216,40, +36,-65,35,-75,34,-84,32,-93,30,-101,27,-107,70,-107,72,-102,74,-95,76,-85,77,-75,78,-64,78,15,88,7,98,1,108,-2,118,-4,130,-4,164,1,192,19,214,47,228,82,233,123,228,158,214,188,191,210,163,225,129,230,101,225,75,210,54,182,41,138,36,76,16383,16383,78,137,79,163,85,185,94,202,107,212,123,216,145,211,163,197,177,175,186,144,190,106,187,75,179,49,166,29,150,16,129,11,115,13,101,18,89,26,81,35,78,44,216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,33,20,50,5,71,-2,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38, +107,212,123,216,123,216,129,230,123,216,145,211,129,230,145,211,163,225,163,225,145,211,163,197,163,225,163,197,191,210,191,210,163,197,177,175,191,210,177,175,186,144,191,210,190,106,192,19,191,210,192,19,214,188,214,188,192,19,214,47,214,188,214,47,228,158,228,158,214,47,228,82,228,158,228,82,233,123,192,19,190,106,187,75,192,19,187,75,179,49,192,19,179,49,166,29,192,19,166,29,164,1,129,11,130,-4,150,16,150,16,130,-4,164,1,150,16,164,1,166,29,130,-4,129,11,118,-4,118,-4,129,11,115,13,118,-4,115,13,108,-2,108,-2,115,13,101,18,108,-2,101,18,98,1,98,1,101,18,89,26,98,1,89,26,88,7,88,7,89,26,81,35,88,7,81,35,78,44,85,185,94,202,101,225,101,225,94,202,107,212,101,225,107,212,129,230,129,230,107,212,123,216,78,137,79,163,75,210,78,137,75,210,76,-85,78,137,76,-85,77,-75,78,137,77,-75,78,-64,75,210,79,163,85,185,75,210,85,185,101,225,75,210,54,182,70,-107,75,210,70,-107,72,-102,75,210,72,-102,74,-95,75,210,74,-95,76,-85,70,-107,54,182,41,138,70,-107,41,138,36,76,70,-107,36,76,36,-65,70,-107,36,-65,35,-75,70,-107,35,-75,34,-84,70,-107,34,-84,32,-93,70,-107,32,-93,30,-101,70,-107,30,-101,27,-107,78,44,78,15,88,7,191,210,186,144,190,106, +216,176,213,191,205,206,190,218,169,227,142,230,107,223,73,202,45,171,25,130,17,83,21,45,33,20,50,5,71,-2,95,-4,105,-4,117,-2,128,-1,137,0,143,0,158,-1,170,-5,180,-12,186,-22,188,-34,186,-47,180,-58,170,-67,159,-72,147,-74,140,-72,134,-69,128,-64,123,-61,117,-59,110,-60,104,-63,99,-68,97,-73,96,-80,98,-90,103,-98,111,-103,121,-107,132,-108,151,-104,170,-93,187,-76,199,-55,204,-29,201,-3,192,16,177,30,156,38,128,41,119,41,115,40,103,40,78,45,60,54,48,68,42,85,41,105,45,135,58,158,76,174,97,183,118,186,141,182,158,174,170,163,181,155,192,151,201,153,208,157,212,163,215,169,216,176,259,183,259,225,119,225,87,220,58,207,35,184,20,151,15,108,20,73,35,42,58,18,87,1,119,-4,156,1,187,16,212,38,228,65,233,94,229,121,218,138,203,152,186,165,171,183,16383,16383,189,85,186,63,180,42,168,25,152,13,131,9,110,15,90,30,75,54,64,84,60,117,65,145,78,164,97,176,118,182,137,183,153,172,167,155,178,134,186,110,189,85,221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42, +60,54,48,68,50,5,50,5,48,68,42,85,50,5,42,85,33,20,33,20,42,85,41,105,45,171,41,105,45,135,45,171,45,135,73,202,73,202,45,135,58,158,73,202,58,158,76,174,73,202,76,174,107,223,107,223,76,174,97,183,107,223,97,183,118,186,118,186,141,182,142,230,142,230,141,182,158,174,142,230,158,174,169,227,169,227,158,174,170,163,169,227,170,163,190,218,190,218,170,163,181,155,190,218,181,155,192,151,17,83,21,45,25,130,25,130,21,45,33,20,25,130,33,20,45,171,45,171,33,20,41,105,177,30,156,38,158,-1,158,-1,156,38,143,0,137,0,143,0,156,38,137,0,156,38,128,41,128,-1,137,0,128,41,128,-1,128,41,123,41,128,-1,123,41,119,41,128,-1,119,41,117,-2,105,-4,117,-2,107,40,111,40,107,40,117,-2,111,40,117,-2,115,40,115,40,117,-2,119,41,60,54,71,-2,78,45,78,45,71,-2,95,-4,78,45,95,-4,103,40,103,40,95,-4,105,-4,103,40,105,-4,107,40,128,-64,132,-108,134,-69,134,-69,132,-108,151,-104,134,-69,151,-104,140,-72,140,-72,151,-104,147,-74,159,-72,147,-74,151,-104,159,-72,151,-104,170,-93,204,-29,201,-3,199,-55,199,-55,201,-3,192,16,199,-55,192,16,188,-34,188,-34,187,-76,199,-55,158,-1,170,-5,177,30,177,30,170,-5,180,-12,177,30,180,-12,192,16,192,16,180,-12,186,-22,192,16,186,-22,188,-34,187,-76,188,-34,186,-47,187,-76,186,-47,180,-58,187,-76,180,-58,170,-67,187,-76,170,-67,170,-93,110,-60,111,-103,117,-59,117,-59,111,-103,121,-107,117,-59,121,-107,123,-61,123,-61,121,-107,132,-108,123,-61,132,-108,128,-64,97,-73,98,-90,99,-68,99,-68,98,-90,103,-98,99,-68,103,-98,104,-63,104,-63,103,-98,111,-103,104,-63,111,-103,110,-60,213,191,205,206,208,157,213,191,208,157,212,163,213,191,212,163,215,169,213,191,215,169,216,176,205,206,190,218,192,151,205,206,192,151,201,153,205,206,201,153,208,157,142,230,107,223,118,186,98,-90,97,-73,96,-80,159,-72,170,-93,170,-67,60,54,50,5,71,-2, +259,183,259,225,119,225,87,220,58,207,35,184,20,151,15,108,20,73,35,42,58,18,87,1,119,-4,156,1,187,16,212,38,228,65,233,94,229,121,218,138,203,152,186,165,171,183,16383,16383,189,85,186,63,180,42,168,25,152,13,131,9,110,15,90,30,75,54,64,84,60,117,65,145,78,164,97,176,118,182,137,183,153,172,167,155,178,134,186,110,189,85,221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,161,38,151,36,141,39,133,47,128,59,125,74,124,91,125,113,128,135,131,155,134,172, +186,63,180,42,187,16,187,16,180,42,168,25,187,16,168,25,156,1,156,1,168,25,152,13,156,1,152,13,131,9,131,9,110,15,119,-4,119,-4,110,15,90,30,119,-4,90,30,87,1,87,1,90,30,75,54,87,1,75,54,64,84,58,207,60,117,65,145,58,207,65,145,87,220,87,220,65,145,78,164,87,220,78,164,97,176,58,18,87,1,64,84,58,18,64,84,60,117,58,18,60,117,58,207,58,18,58,207,35,184,58,18,35,184,35,42,20,151,15,108,20,73,20,151,20,73,35,42,20,151,35,42,35,184,153,172,167,155,171,183,171,183,167,155,178,134,171,183,259,225,137,183,119,225,87,220,97,176,119,225,97,176,118,182,119,225,118,182,137,183,119,225,137,183,259,225,137,183,153,172,171,183,233,94,229,121,228,65,228,65,229,121,218,138,228,65,218,138,212,38,212,38,218,138,203,152,212,38,203,152,189,85,189,85,203,152,186,165,189,85,186,165,186,110,186,165,171,183,178,134,186,165,178,134,186,110,189,85,187,16,212,38,131,9,119,-4,156,1,186,63,187,16,189,85,259,225,171,183,259,183, +221,183,221,225,81,225,55,219,34,204,18,183,7,160,2,138,9,138,16,153,25,166,37,175,50,181,66,183,107,183,102,164,96,142,92,119,88,95,87,71,89,49,94,28,103,11,118,0,138,-4,157,0,172,10,183,27,191,48,193,71,185,71,182,59,176,49,169,42,161,38,151,36,141,39,133,47,128,59,125,74,124,91,125,113,128,135,131,155,134,172,136,183,127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15, +9,138,16,153,18,183,18,183,16,153,25,166,18,183,25,166,34,204,34,204,25,166,37,175,34,204,37,175,55,219,55,219,37,175,50,181,55,219,50,181,66,183,81,225,66,183,107,183,81,225,107,183,221,225,221,225,107,183,136,183,221,225,136,183,221,183,7,160,2,138,9,138,7,160,9,138,18,183,118,0,125,74,124,91,124,91,125,113,118,0,118,0,125,113,107,183,118,0,107,183,103,11,103,11,107,183,102,164,103,11,102,164,96,142,128,135,131,155,107,183,107,183,131,155,134,172,107,183,134,172,136,183,138,-4,157,0,141,39,141,39,157,0,151,36,161,38,151,36,157,0,161,38,157,0,172,10,185,71,182,59,183,27,185,71,183,27,191,48,185,71,191,48,193,71,176,49,169,42,172,10,176,49,172,10,183,27,176,49,183,27,182,59,138,-4,141,39,133,47,138,-4,133,47,128,59,138,-4,128,59,125,74,138,-4,125,74,118,0,103,11,96,142,94,28,94,28,96,142,92,119,94,28,92,119,89,49,89,49,92,119,88,95,89,49,88,95,87,71,161,38,172,10,169,42,66,183,81,225,55,219,128,135,107,183,125,113, +127,230,127,220,139,218,149,214,159,209,168,201,177,191,186,176,193,159,198,141,201,122,202,104,200,75,193,49,182,28,165,14,142,9,121,14,106,28,97,47,92,68,91,87,91,193,90,205,86,215,80,222,71,226,60,228,47,225,36,216,26,203,16,188,8,172,15,170,18,176,28,188,33,193,39,194,43,192,46,187,48,180,49,170,49,99,51,66,60,38,76,15,102,0,139,-4,174,1,204,18,227,43,242,75,247,113,241,155,226,188,202,211,173,225,141,230,134,9,124,10,114,13,104,18,94,25,86,34,76,52,68,72,63,94,61,116,60,137,63,166,73,189,88,206,109,216,134,221,134,228,132,229,129,229,126,230,121,230,84,224,54,207,33,181,19,150,15,114,19,78,33,46,55,20,85,3,123,-3,134,-4,134,-107,176,-107,176,-4,220,1,254,18,277,43,292,75,296,111,291,151,278,184,258,209,233,224,207,230,195,229,184,226,175,221,167,215,160,208,148,187,141,162,137,134,135,105,134,76,16383,16383,176,9,176,129, +18,176,23,182,26,203,26,203,23,182,28,188,26,203,28,188,36,216,36,216,28,188,33,193,36,216,33,193,39,194,39,194,43,192,47,225,47,225,43,192,46,187,47,225,46,187,48,180,16,188,8,172,15,170,16,188,15,170,18,176,16,188,18,176,26,203,49,99,51,66,49,159,49,170,49,159,60,228,49,170,60,228,48,180,48,180,60,228,47,225,91,87,91,193,90,205,91,87,90,205,86,215,91,87,86,215,80,222,91,87,80,222,92,68,141,230,127,230,139,218,141,230,139,218,149,214,141,230,149,214,173,225,200,75,193,49,204,18,204,18,193,49,182,28,204,18,182,28,174,1,174,1,182,28,165,14,174,1,165,14,142,9,142,9,121,14,139,-4,139,-4,121,14,106,28,139,-4,106,28,102,0,102,0,106,28,97,47,102,0,97,47,92,68,76,15,102,0,92,68,76,15,92,68,80,222,76,15,80,222,71,226,76,15,71,226,60,228,76,15,60,228,60,38,60,228,49,159,51,66,60,228,51,66,60,38,47,225,36,216,39,194,149,214,159,209,173,225,173,225,159,209,168,201,173,225,168,201,177,191,177,191,186,176,202,211,202,211,186,176,193,159,202,211,193,159,198,141,202,211,202,104,204,18,202,211,204,18,226,188,226,188,204,18,227,43,226,188,227,43,241,155,241,155,227,43,242,75,241,155,242,75,247,113,202,211,198,141,201,122,202,211,201,122,202,104,202,211,173,225,177,191,142,9,139,-4,174,1,200,75,204,18,202,104,139,218,127,230,127,220, +134,9,124,10,114,13,104,18,94,25,86,34,76,52,68,72,63,94,61,116,60,137,63,166,73,189,88,206,109,216,134,221,134,228,132,229,129,229,126,230,121,230,84,224,54,207,33,181,19,150,15,114,19,78,33,46,55,20,85,3,123,-3,134,-4,134,-107,176,-107,176,-4,220,1,254,18,277,43,292,75,296,111,291,151,278,184,258,209,233,224,207,230,195,229,184,226,175,221,167,215,160,208,148,187,141,162,137,134,135,105,134,76,16383,16383,176,9,176,129,177,155,178,179,182,198,189,211,201,216,218,209,232,190,243,164,249,134,252,103,250,74,243,49,231,28,214,14,191,9,243,225,194,225,123,93,113,139,103,177,92,206,79,224,63,230,49,227,38,217,31,202,27,182,26,156,34,156,37,171,41,182,46,190,51,194,56,195,67,192,77,183,85,168,93,147,101,119,110,78,6,-104,55,-104,126,26,136,-34,141,-57,148,-78,157,-94,168,-105,182,-109,198,-104,209,-90,216,-71,219,-52,220,-34,213,-34,210,-49,206,-61,201,-68,195,-72,187,-74,188,-74,177,-71,168,-63,160,-48,153,-27,147,1,138,41,342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137, +61,116,60,137,60,137,55,20,60,137,54,207,55,20,54,207,33,46,33,46,54,207,33,181,33,46,33,181,19,78,19,78,33,181,19,150,19,78,19,150,15,114,63,94,55,20,68,72,68,72,55,20,85,3,68,72,85,3,76,52,76,52,85,3,86,34,94,25,86,34,85,3,94,25,85,3,123,-3,61,116,60,137,55,20,61,116,55,20,63,94,135,105,134,76,176,-107,176,-107,134,76,134,9,176,-107,134,9,134,-4,134,-4,134,9,124,10,134,-4,124,10,123,-3,123,-3,124,10,114,13,123,-3,114,13,104,18,134,221,134,228,132,229,134,221,132,229,129,229,134,221,129,229,126,230,134,221,126,230,124,230,134,221,124,230,121,230,134,221,121,230,109,216,175,221,176,-107,176,129,176,9,176,-4,220,1,176,9,220,1,191,9,191,9,220,1,214,14,207,230,201,216,218,209,207,230,218,209,233,224,233,224,218,209,232,190,233,224,232,190,243,164,178,179,182,198,184,226,184,226,182,198,189,211,184,226,189,211,195,229,195,229,189,211,201,216,195,229,201,216,207,230,175,221,176,129,177,155,175,221,177,155,178,179,175,221,178,179,184,226,176,-107,175,221,167,215,176,-107,167,215,160,208,176,-107,160,208,148,187,176,-107,148,187,141,162,176,-107,141,162,137,134,176,-107,137,134,135,105,296,111,291,151,292,75,292,75,291,151,278,184,292,75,278,184,277,43,277,43,278,184,258,209,277,43,258,209,254,18,254,18,258,209,252,103,254,18,252,103,250,74,254,18,250,74,243,49,258,209,233,224,243,164,258,209,243,164,249,134,258,209,249,134,252,103,231,28,214,14,220,1,231,28,220,1,254,18,231,28,254,18,243,49,63,166,73,189,84,224,84,224,73,189,88,206,84,224,88,206,121,230,121,230,88,206,109,216,63,166,84,224,54,207,63,166,54,207,60,137,176,-107,134,-4,134,-107,94,25,123,-3,104,18, +243,225,194,225,123,93,113,139,103,177,92,206,79,224,63,230,49,227,38,217,31,202,27,182,26,156,34,156,37,171,41,182,46,190,51,194,56,195,67,192,77,183,85,168,93,147,101,119,110,78,6,-104,55,-104,126,26,136,-34,141,-57,148,-78,157,-94,168,-105,182,-109,198,-104,209,-90,216,-71,219,-52,220,-34,213,-34,210,-49,206,-61,201,-68,195,-72,187,-74,188,-74,177,-71,168,-63,160,-48,153,-27,147,1,138,41,342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,96,163,90,188,78,210,61,224,36,230,31,230,25,229,14,229,10,228,10,220,30,210,42,190,49,164,52,137,52,114,55,72,65,39,84,15,114,0,155,-4,155,-107,197,-107,197,-4,236,0,265,16,285,41,296,74,300,114,300,137,303,164,310,190, +79,224,63,230,67,192,67,192,63,230,56,195,51,194,56,195,63,230,51,194,63,230,49,227,194,225,123,93,126,26,126,26,123,93,113,139,126,26,113,139,110,78,110,78,113,139,103,177,110,78,103,177,101,119,67,192,77,183,79,224,79,224,77,183,85,168,79,224,85,168,92,206,92,206,85,168,93,147,92,206,93,147,103,177,103,177,93,147,101,119,138,41,243,225,194,225,138,41,194,225,126,26,138,41,126,26,136,-34,138,41,136,-34,141,-57,138,41,141,-57,147,1,110,78,6,-104,55,-104,110,78,55,-104,126,26,210,-49,206,-61,209,-90,209,-90,206,-61,201,-68,209,-90,201,-68,198,-104,198,-104,201,-68,195,-72,198,-104,195,-72,188,-74,187,-74,188,-74,177,-71,187,-74,177,-71,182,-109,182,-109,177,-71,168,-105,177,-71,168,-63,168,-105,168,-105,168,-63,160,-48,168,-105,160,-48,157,-94,157,-94,160,-48,153,-27,157,-94,153,-27,148,-78,148,-78,153,-27,147,1,148,-78,147,1,141,-57,216,-71,219,-52,220,-34,216,-71,220,-34,213,-34,216,-71,213,-34,210,-49,216,-71,210,-49,209,-90,187,-74,182,-109,198,-104,187,-74,198,-104,188,-74,34,156,37,171,38,217,38,217,37,171,41,182,38,217,41,182,49,227,49,227,41,182,46,190,49,227,46,190,51,194,34,156,38,217,31,202,34,156,31,202,27,182,34,156,27,182,26,156, +342,228,332,230,316,230,290,224,273,209,262,187,256,162,254,136,253,103,249,69,239,39,223,17,197,9,197,225,155,225,155,9,129,17,112,39,103,69,99,104,98,137,96,163,90,188,78,210,61,224,36,230,31,230,25,229,14,229,10,228,10,220,30,210,42,190,49,164,52,137,52,114,55,72,65,39,84,15,114,0,155,-4,155,-107,197,-107,197,-4,236,0,265,16,285,41,296,74,300,114,300,137,303,164,310,190,322,211,342,221,180,223,206,218,226,203,240,179,249,146,252,104,252,76,248,51,242,29,229,14,210,9,200,12,190,20,181,33,174,51,170,73,173,85,177,105,178,115,179,127,177,145,174,158,169,168,163,173,156,175,149,173,143,168,138,159,135,145,133,126,134,114,135,103,137,94,139,84,142,73,138,51,132,33,123,20,113,12,100,9,82,15,71,31,64,54,61,81,60,109,63,149,73,180,88,204,108,218,132,223,132,230,94,225,62,211,37,186, +239,39,223,17,236,0,236,0,223,17,197,9,197,-107,197,9,155,-4,197,225,155,225,155,-4,197,225,155,-4,197,9,155,225,155,9,155,-4,155,-4,155,9,129,17,155,-4,129,17,114,0,114,0,129,17,112,39,114,0,112,39,103,69,99,104,98,137,96,163,99,104,96,163,90,188,99,104,90,188,84,15,99,104,84,15,103,69,52,114,55,72,61,224,61,224,55,72,65,39,61,224,65,39,78,210,78,210,65,39,84,15,78,210,84,15,90,188,42,190,49,164,61,224,61,224,49,164,52,137,61,224,52,137,52,114,61,224,36,230,42,190,42,190,36,230,31,230,42,190,31,230,30,210,30,210,31,230,25,229,30,210,25,229,19,229,14,229,10,228,30,210,14,229,30,210,19,229,262,187,256,162,265,16,265,16,256,162,254,136,265,16,254,136,253,103,342,221,342,228,337,229,342,221,337,229,332,230,342,221,332,230,327,230,342,221,327,230,322,211,303,164,310,190,316,230,316,230,310,190,322,211,316,230,322,211,321,230,321,230,322,211,327,230,262,187,265,16,273,209,273,209,265,16,285,41,273,209,285,41,290,224,290,224,285,41,296,74,290,224,296,74,300,137,300,137,296,74,300,114,290,224,300,137,303,164,290,224,303,164,316,230,265,16,253,103,249,69,265,16,249,69,239,39,265,16,239,39,236,0,197,9,197,-4,236,0,197,-107,155,-4,155,-107,30,210,10,228,10,220,103,69,84,15,114,0, +180,223,206,218,226,203,240,179,249,146,252,104,252,76,248,51,242,29,229,14,210,9,200,12,190,20,181,33,174,51,170,73,173,85,177,105,178,115,179,127,177,145,174,158,169,168,163,173,156,175,149,173,143,168,138,159,135,145,133,126,134,114,135,103,137,94,139,84,142,73,138,51,132,33,123,20,113,12,100,9,82,15,71,31,64,54,61,81,60,109,63,149,73,180,88,204,108,218,132,223,132,230,94,225,62,211,37,186,20,151,15,104,15,84,18,66,23,50,30,35,39,23,49,13,59,5,70,0,81,-3,93,-4,109,-2,123,3,136,12,147,26,156,43,164,26,175,12,187,3,202,-2,218,-4,230,-3,242,0,253,5,263,13,273,23,282,35,289,49,294,66,296,85,297,105,292,152,275,187,250,211,218,225,180,230,158,286,157,294,153,301,148,306,141,310,133,311,125,310,118,306,113,301,110,294,108,286,109,278,113,272,118,266,125,263,132,262,140,263,148,266,153,272,157,278,158,286,16383,16383,59,286,57,294,54,301,48,306,41,310,33,311,26,310,19,306,14,301,10,294,9,286,10,278,14,272,19,266,25,263,33,262,41,263,48,266,54,272,57,278,59,286,16383,16383,138,54,132,43,127,36,122,31,118,29,112,28,108,29,105,31,103,33,102,36,102,228,99,230,84,224,68,219,53,214,37,208,22,204,22,195,27,196,49,196,54,193,57,188,59,181,60,172,60,39,61,26,63,14,69,4,77,-2,89,-4,104,-1,117,7,128,20,138,35,146,50,202,286,201,294,197,301,192,306,185,310,177,311,169,310,162,306,157,301,154,294,152,286,154,278, +71,31,64,54,70,0,70,0,64,54,61,81,70,0,61,81,59,5,59,5,61,81,60,109,62,211,60,109,63,149,62,211,63,149,73,180,108,218,132,223,132,230,108,218,132,230,94,225,108,218,94,225,88,204,94,225,62,211,73,180,94,225,73,180,88,204,23,50,30,35,37,186,37,186,30,35,39,23,37,186,39,23,62,211,62,211,39,23,49,13,62,211,49,13,60,109,60,109,49,13,59,5,20,151,15,104,15,84,20,151,15,84,18,66,20,151,18,66,23,50,20,151,23,50,37,186,81,-3,93,-4,82,15,82,15,93,-4,100,9,113,12,100,9,109,-2,113,12,109,-2,123,3,71,31,70,0,81,-3,71,31,81,-3,82,15,174,51,170,73,175,12,174,158,170,73,173,85,174,158,173,85,175,95,177,145,174,158,175,95,177,145,175,95,177,105,177,145,177,105,178,115,177,145,178,115,179,127,156,175,156,43,163,173,163,173,156,43,164,26,163,173,164,26,169,168,169,168,164,26,170,73,169,168,170,73,174,158,174,51,175,12,181,33,181,33,175,12,187,3,181,33,187,3,190,20,190,20,187,3,202,-2,190,20,202,-2,200,12,200,12,202,-2,210,9,229,14,210,9,218,-4,229,14,218,-4,230,-3,282,35,289,49,292,152,292,152,289,49,294,66,292,152,294,66,297,105,297,105,294,66,296,85,275,187,250,211,252,104,275,187,252,104,253,5,275,187,253,5,263,13,275,187,263,13,273,23,275,187,273,23,282,35,275,187,282,35,292,152,240,179,249,146,250,211,250,211,249,146,252,104,253,5,252,104,252,76,240,179,250,211,226,203,226,203,250,211,218,225,226,203,218,225,206,218,206,218,218,225,180,230,206,218,180,230,180,223,229,14,230,-3,242,29,242,29,230,-3,242,0,242,29,242,0,248,51,248,51,242,0,253,5,248,51,253,5,252,76,210,9,202,-2,218,-4,139,84,142,73,143,168,143,168,142,73,147,26,143,168,147,26,149,173,149,173,147,26,156,43,149,173,156,43,156,175,147,26,142,73,138,51,147,26,138,51,136,12,136,12,138,51,132,33,136,12,132,33,123,3,123,3,132,33,123,20,123,3,123,20,113,12,138,159,135,145,135,103,138,159,135,103,137,94,138,159,137,94,139,84,138,159,139,84,143,168,135,145,133,126,134,114,135,145,134,114,135,103,100,9,93,-4,109,-2,170,73,164,26,175,12, +272,145,263,146,255,146,246,147,238,148,230,150,229,176,225,203,220,230,212,257,201,281,191,300,179,316,163,329,144,338,121,342,100,339,80,331,63,316,50,294,46,264,53,226,74,194,104,168,142,149,185,137,186,133,186,116,185,85,180,56,171,32,157,15,137,9,115,14,101,28,91,46,87,66,85,84,85,110,84,131,81,145,76,154,67,159,55,160,43,158,31,151,20,140,9,125,0,105,7,100,15,114,20,123,25,128,29,131,33,132,37,131,39,128,42,123,43,115,44,104,44,93,46,61,55,34,72,13,97,0,133,-4,172,3,200,26,217,58,227,95,230,134,247,134,256,135,272,137,16383,16383,185,161,141,182,112,208,95,235,86,260,84,280,86,295,91,307,99,316,109,321,119,323,135,320,149,310,162,289,173,253,181,200,181,198,182,193,183,184,184,174,185,161,198,208,186,255,169,291,146,317,117,332,81,337,67,336,53,332,39,327,26,319,15,311,18,303,25,305,33,308,41,310,49,311,55,312,84,306,109,289,130,257,146,211,157,147,157,61,156,39,153,25,144,16,130,12,107,9,107,0,260,0,260,9,239,11,224,15,215,23,210,36,209,55,209,126,211,167,220,219,236,270,261,309,296,325,299,325,305,323,308,321,309,319,307,315,296,304,291,295,289,285,290,276,294,268,301,262,308,259,318,257,329,259,338,265,344,273,348,284,349,295,346,309,339,320,329,330,317,336,303,338,268,330,241,308,221,277,207,242,199,208,176,342,134,342,134,230,126,230,86,224,55,206,32,180,19,149,15,114,19,79,33,47,55,20,85,2,123,-4,134,-4,134,-107,176,-107,176,-4,223,2,257,21,280,48,292,81,296,116,294,143,286,168,272,190, +20,123,25,128,31,151,31,151,25,128,29,131,31,151,29,131,33,132,33,132,37,131,43,158,43,158,37,131,39,128,43,158,39,128,42,123,0,105,7,100,9,125,9,125,7,100,15,114,9,125,15,114,20,140,20,140,15,114,20,123,20,140,20,123,31,151,44,104,46,61,55,160,55,160,46,61,55,34,55,160,55,34,67,159,67,159,55,34,72,13,67,159,72,13,76,154,76,154,72,13,87,66,76,154,87,66,85,84,85,84,85,110,84,131,85,84,84,131,81,145,85,84,81,145,76,154,121,342,119,323,135,320,121,342,135,320,144,338,144,338,135,320,149,310,144,338,149,310,163,329,163,329,149,310,162,289,163,329,162,289,173,253,180,56,171,32,172,3,172,3,171,32,157,15,172,3,157,15,137,9,137,9,115,14,133,-4,133,-4,115,14,101,28,133,-4,101,28,97,0,97,0,101,28,91,46,97,0,91,46,87,66,43,115,44,104,55,160,43,115,55,160,43,158,43,115,43,158,42,123,43,158,31,151,33,132,272,137,272,145,264,136,264,136,272,145,263,146,264,136,263,146,256,135,256,135,263,146,255,146,256,135,255,146,247,134,247,134,255,146,246,147,247,134,246,147,238,134,238,134,246,147,238,148,238,134,238,148,230,150,230,150,229,176,230,134,230,134,229,176,227,95,229,176,225,203,227,95,227,95,225,203,220,230,227,95,220,230,217,58,217,58,220,230,212,257,217,58,212,257,201,281,217,58,201,281,200,26,200,26,201,281,191,300,200,26,191,300,186,116,186,116,185,85,200,26,200,26,185,85,180,56,200,26,180,56,172,3,137,9,133,-4,172,3,238,134,230,150,230,134,91,307,99,316,100,339,100,339,99,316,109,321,100,339,109,321,121,342,121,342,109,321,119,323,80,331,84,280,86,295,80,331,86,295,100,339,100,339,86,295,91,307,191,300,179,316,181,200,191,300,181,200,181,198,191,300,181,198,182,193,191,300,182,193,183,184,191,300,183,184,184,174,191,300,184,174,185,161,191,300,185,161,185,137,191,300,185,137,186,133,191,300,186,133,186,129,191,300,186,129,186,124,191,300,186,124,186,120,191,300,186,120,186,116,185,161,141,182,142,149,185,161,142,149,185,137,112,208,95,235,104,168,112,208,104,168,142,149,112,208,142,149,141,182,86,260,84,280,74,194,86,260,74,194,104,168,86,260,104,168,95,235,84,280,80,331,74,194,74,194,80,331,63,316,74,194,63,316,53,226,53,226,63,316,50,294,53,226,50,294,46,264,173,253,181,200,179,316,173,253,179,316,163,329,46,61,44,104,44,93,87,66,72,13,97,0, +176,342,134,342,134,230,126,230,86,224,55,206,32,180,19,149,15,114,19,79,33,47,55,20,85,2,123,-4,134,-4,134,-107,176,-107,176,-4,223,2,257,21,280,48,292,81,296,116,294,143,286,168,272,190,254,208,230,222,221,225,211,228,189,230,176,230,16383,16383,176,9,176,216,203,210,225,193,240,168,249,137,252,102,249,73,243,48,231,27,214,14,191,9,16383,16383,135,9,125,10,114,13,104,18,95,25,86,34,77,51,69,70,64,91,61,113,60,137,62,164,70,186,82,202,99,212,120,216,135,216,363,183,363,225,77,225,53,219,33,204,18,183,8,160,3,137,11,137,18,152,27,164,36,174,48,181,61,183,84,183,76,169,69,153,64,137,61,120,60,103,64,64,76,34,92,12,112,0,134,-4,153,-2,169,3,182,12,193,26,201,43,210,25,221,12,233,2,247,-2,261,-4,286,0,309,12,327,33,339,63,343,102,342,119,340,136,336,153,329,169,320,183,16383,16383,279,183,285,171,291,155,295,138,297,120,298,103,297,76,293,51,286,29,275,15,258,9,246,12,236,20,226,33,219,51,215,74,218,82, +296,116,294,143,292,81,292,81,294,143,286,168,292,81,286,168,280,48,280,48,286,168,272,190,280,48,272,190,257,21,257,21,272,190,254,208,257,21,254,208,252,102,221,225,225,193,230,222,230,222,225,193,240,168,230,222,240,168,254,208,254,208,240,168,249,137,254,208,249,137,252,102,211,228,200,229,203,210,211,228,203,210,225,193,211,228,225,193,221,225,200,229,189,230,203,210,203,210,189,230,176,230,203,210,176,230,176,216,176,216,176,230,176,342,176,216,176,342,135,216,135,216,176,342,134,342,135,216,134,342,134,230,257,21,252,102,249,73,257,21,249,73,243,48,257,21,243,48,231,27,257,21,231,27,223,2,231,27,214,14,223,2,223,2,214,14,191,9,223,2,191,9,176,-4,176,-4,191,9,176,9,176,-4,176,9,176,-107,176,-107,176,9,135,216,176,-107,135,216,135,9,134,-4,134,-107,176,-107,134,-4,176,-107,135,9,134,-4,135,9,125,10,134,-4,125,10,123,-4,69,70,85,2,77,51,77,51,85,2,86,34,95,25,86,34,85,2,95,25,85,2,123,-4,82,202,86,224,70,186,70,186,86,224,55,206,70,186,55,206,62,164,62,164,55,206,60,137,61,113,60,137,55,20,61,113,55,20,64,91,64,91,55,20,85,2,64,91,85,2,69,70,123,-4,125,10,114,13,123,-4,114,13,104,18,123,-4,104,18,95,25,126,230,86,224,99,212,126,230,99,212,120,216,126,230,120,216,135,216,126,230,135,216,134,230,55,20,60,137,55,206,55,20,55,206,33,47,33,47,55,206,32,180,33,47,32,180,19,79,19,79,32,180,19,149,19,79,19,149,15,114,86,224,82,202,99,212,176,216,135,216,176,9, +363,183,363,225,77,225,53,219,33,204,18,183,8,160,3,137,11,137,18,152,27,164,36,174,48,181,61,183,84,183,76,169,69,153,64,137,61,120,60,103,64,64,76,34,92,12,112,0,134,-4,153,-2,169,3,182,12,193,26,201,43,210,25,221,12,233,2,247,-2,261,-4,286,0,309,12,327,33,339,63,343,102,342,119,340,136,336,153,329,169,320,183,16383,16383,279,183,285,171,291,155,295,138,297,120,298,103,297,76,293,51,286,29,275,15,258,9,246,12,236,20,226,33,219,51,215,74,218,82,220,90,222,99,224,115,223,126,221,138,217,149,211,156,202,159,193,156,186,149,182,139,180,127,179,116,180,107,181,99,185,81,188,74,183,51,176,33,167,19,156,12,143,9,126,15,115,30,108,52,106,76,105,99,106,118,108,137,112,153,118,169,125,183,155,-46,154,-68,151,-83,143,-91,129,-96,108,-98,108,-107,254,-107,254,-98,233,-96,219,-92,211,-84,207,-71,206,-52,206,-4,252,8,290,33,319,68,337,113,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,23,114,42,69,71,33,109,8,155,-4,16383,16383,287,169,285,134,280,103,272,76,260,53,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,52,90,75,81,102,76,132,74,166,76,194,80,222,87,247,97,269,108,286,121,298,134,308,149,314,164,318,180,320,194,319,207,316,219,311,231,305,242,296,257,279,270,257,279,231,285,201,287,169,103,-107,146,-107,146,-2,176,7,200,26,219,50,231,81,235,116,230,154,215,186,191,210,162,225,127,230,90,225,58,209,35,185,20,153,15,114, +11,137,18,152,18,183,18,183,18,152,27,164,18,183,27,164,33,204,33,204,27,164,36,174,33,204,36,174,53,219,53,219,36,174,48,181,53,219,48,181,61,183,77,225,61,183,84,183,77,225,84,183,363,225,363,225,84,183,125,183,363,225,125,183,279,183,8,160,3,137,11,137,8,160,11,137,18,183,108,137,112,153,84,183,84,183,112,153,118,169,84,183,118,169,125,183,108,52,112,0,115,30,115,30,112,0,134,-4,115,30,134,-4,126,15,126,15,134,-4,143,9,156,12,143,9,153,-2,156,12,153,-2,169,3,105,99,92,12,106,76,106,76,92,12,112,0,106,76,112,0,108,52,219,51,215,74,221,12,217,149,215,74,218,82,217,149,218,82,221,138,221,138,218,82,220,90,221,138,220,90,222,99,223,126,221,138,222,99,223,126,222,99,223,107,223,126,223,107,224,115,188,74,193,26,193,156,193,156,193,26,201,43,193,156,201,43,202,159,202,159,201,43,210,25,202,159,210,25,211,156,211,156,210,25,215,74,211,156,215,74,217,149,219,51,221,12,226,33,226,33,221,12,233,2,226,33,233,2,236,20,236,20,233,2,247,-2,236,20,247,-2,246,12,246,12,247,-2,258,9,275,15,258,9,261,-4,275,15,261,-4,286,0,363,225,279,183,285,171,363,225,285,171,291,155,363,225,291,155,320,183,363,225,320,183,363,183,340,136,336,153,339,63,339,63,336,153,329,169,339,63,329,169,327,33,327,33,329,169,320,183,327,33,320,183,309,12,309,12,320,183,298,103,291,155,295,138,320,183,320,183,295,138,297,120,320,183,297,120,298,103,106,118,108,137,84,183,106,118,84,183,92,12,106,118,92,12,105,99,340,136,339,63,343,102,340,136,343,102,342,119,309,12,298,103,297,76,309,12,297,76,293,51,309,12,293,51,286,29,309,12,286,29,286,0,258,9,247,-2,261,-4,186,149,182,139,183,90,186,149,183,90,185,81,186,149,185,81,188,74,186,149,188,74,193,156,179,116,180,107,180,127,180,127,180,107,181,99,180,127,181,99,182,139,182,139,181,99,183,90,193,26,188,74,183,51,193,26,183,51,182,12,182,12,183,51,176,33,182,12,176,33,169,3,169,3,176,33,167,19,169,3,167,19,156,12,143,9,134,-4,153,-2,76,169,69,153,76,34,76,169,76,34,92,12,76,169,92,12,84,183,64,137,61,120,64,64,64,137,64,64,76,34,64,137,76,34,69,153,64,64,61,120,60,103,275,15,286,0,286,29,61,183,77,225,53,219,215,74,210,25,221,12, +257,225,206,225,111,104,110,104,112,114,114,125,115,138,117,150,117,160,115,183,108,202,97,217,82,226,64,230,53,229,43,225,35,219,29,210,27,198,28,193,31,188,35,184,40,181,46,180,54,181,60,184,63,188,67,191,71,192,81,190,89,184,95,174,99,162,100,148,99,136,98,121,96,107,94,94,91,85,21,0,73,0,170,121,171,121,168,111,166,100,164,88,163,76,162,65,164,46,170,27,180,11,194,0,214,-4,225,-3,236,0,244,5,250,14,252,26,251,32,248,37,244,41,239,43,233,44,225,43,219,40,213,34,209,33,199,35,191,40,185,50,181,64,180,85,180,98,181,111,183,122,186,132,189,141,213,-107,214,-103,216,-93,217,-89,217,-86,202,-54,166,-40,119,-30,75,-8,44,40,45,40,55,24,69,11,86,2,106,-2,131,-4,166,1,195,18,217,44,230,75,235,110,230,150,217,183,195,208,166,224,129,230,83,221,50,197,29,163,18,126,15,89,15,69,16,49,18,29,22,10,28,-6,65,-50,110,-71,154,-79,189,-88,205,-107,16383,16383,190,108,188,82,183,55,173,32,157,15,133,9,105,17,85,37,70,66,62,101,60,137,63,166,71,188,83,203,100,213,120,216,141,210,160,195,175,171,186,142,190,108,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24, +95,174,97,217,89,184,89,184,97,217,82,226,89,184,82,226,81,190,81,190,82,226,71,192,67,191,71,192,82,226,67,191,82,226,64,230,206,225,111,104,170,121,170,121,111,104,94,94,170,121,94,94,91,85,91,85,21,0,73,0,112,114,114,125,115,183,115,183,114,125,115,138,115,183,115,138,117,160,117,160,115,138,117,150,110,104,112,114,115,183,110,104,115,183,108,202,110,104,108,202,100,148,110,104,100,148,99,136,110,104,99,136,98,121,110,104,98,121,96,107,110,104,96,107,94,94,110,104,94,94,111,104,191,40,185,50,194,0,194,0,185,50,181,64,194,0,181,64,180,11,180,11,181,64,180,85,171,121,180,85,180,98,171,121,180,98,181,111,186,132,189,141,206,225,186,132,206,225,183,122,183,122,206,225,171,121,183,122,171,121,181,111,206,225,189,141,257,225,99,162,100,148,108,202,99,162,108,202,97,217,91,85,73,0,170,121,225,43,219,40,225,-3,225,-3,219,40,216,37,225,-3,216,37,214,-4,214,-4,216,37,213,34,214,-4,213,34,209,33,209,33,199,35,214,-4,214,-4,199,35,194,0,252,26,251,32,250,14,250,14,251,32,248,37,250,14,248,37,244,5,244,5,248,37,244,41,244,5,244,41,239,43,225,43,225,-3,233,44,233,44,225,-3,236,0,233,44,236,0,239,43,239,43,236,0,244,5,171,121,168,111,170,27,171,121,170,27,180,11,171,121,180,11,180,85,166,100,164,88,164,46,166,100,164,46,170,27,166,100,170,27,168,111,163,76,162,65,164,46,163,76,164,46,164,88,64,230,53,229,54,181,64,230,54,181,60,184,64,230,60,184,63,188,64,230,63,188,67,191,35,184,40,181,43,225,43,225,40,181,46,180,43,225,46,180,53,229,53,229,46,180,54,181,27,198,28,193,29,210,29,210,28,193,31,188,29,210,31,188,35,219,35,219,31,188,35,184,35,219,35,184,43,225,97,217,95,174,99,162,191,40,194,0,199,35,206,225,170,121,171,121, +213,-107,214,-103,216,-93,217,-89,217,-86,202,-54,166,-40,119,-30,75,-8,44,40,45,40,55,24,69,11,86,2,106,-2,131,-4,166,1,195,18,217,44,230,75,235,110,230,150,217,183,195,208,166,224,129,230,83,221,50,197,29,163,18,126,15,89,15,69,16,49,18,29,22,10,28,-6,65,-50,110,-71,154,-79,189,-88,205,-107,16383,16383,190,108,188,82,183,55,173,32,157,15,133,9,105,17,85,37,70,66,62,101,60,137,63,166,71,188,83,203,100,213,120,216,141,210,160,195,175,171,186,142,190,108,344,166,336,222,314,269,280,306,235,330,180,338,126,330,81,307,46,271,24,224,17,167,24,109,46,61,81,24,126,1,180,-6,234,1,279,24,314,60,336,108,344,166,16383,16383,74,180,77,205,82,229,88,251,97,271,108,286,121,299,134,308,149,315,164,318,180,320,194,319,207,316,219,311,231,305,242,296,256,281,268,261,277,237,284,210,286,180,16383,16383,287,157,285,126,279,98,271,73,260,52,246,35,235,26,223,19,209,15,196,12,181,11,167,12,154,15,142,19,130,25,119,33,103,51,91,73,82,98, +28,-6,65,-50,44,40,44,40,65,-50,75,-8,75,-8,65,-50,110,-71,75,-8,110,-71,119,-30,119,-30,110,-71,154,-79,119,-30,154,-79,166,-40,166,-40,154,-79,189,-88,166,-40,189,-88,202,-54,202,-54,189,-88,205,-107,202,-54,205,-107,217,-86,217,-86,205,-107,213,-107,217,-86,213,-107,214,-103,55,24,69,11,60,137,60,137,63,166,50,197,50,197,63,166,71,188,50,197,71,188,83,221,83,221,71,188,83,203,83,221,83,203,129,230,129,230,83,203,100,213,129,230,100,213,120,216,120,216,141,210,129,230,129,230,141,210,166,224,133,9,106,-2,131,-4,133,9,131,-4,166,1,133,9,105,17,106,-2,86,2,106,-2,105,17,86,2,105,17,85,37,86,2,85,37,70,66,86,2,70,66,69,11,62,101,60,137,69,11,62,101,69,11,70,66,188,82,183,55,195,18,195,18,183,55,173,32,195,18,173,32,166,1,166,1,173,32,157,15,166,1,157,15,133,9,175,171,186,142,195,208,195,208,186,142,190,108,195,18,190,108,188,82,166,224,141,210,160,195,166,224,160,195,175,171,166,224,175,171,195,208,195,18,217,44,217,183,217,183,217,44,230,75,217,183,230,75,230,150,230,150,230,75,235,110,195,208,190,108,195,18,195,208,195,18,217,183,217,-86,214,-103,215,-98,217,-86,215,-98,216,-93,217,-86,216,-93,217,-89,16,49,18,29,18,126,18,126,18,29,22,10,18,126,22,10,29,163,29,163,22,10,28,-6,29,163,28,-6,44,40,18,126,15,89,15,69,18,126,15,69,16,49,44,40,45,40,50,197,50,197,45,40,55,24,50,197,55,24,60,137,50,197,29,163,44,40, +196,56,183,41,169,29,155,22,139,17,123,16,100,21,82,35,68,56,60,82,57,112,155,112,155,127,57,127,61,151,69,175,82,196,99,210,119,215,142,212,158,203,169,191,177,177,183,162,191,162,184,230,176,230,174,224,173,222,171,220,167,220,160,221,152,223,144,226,133,229,118,230,82,223,53,205,31,178,17,145,12,108,17,74,30,44,50,18,78,1,112,-4,136,-1,157,5,176,17,191,33,204,52,23,169,37,184,50,195,65,203,80,208,97,209,119,204,138,190,151,169,159,143,162,113,65,113,65,98,162,98,159,73,150,50,137,29,120,15,100,9,77,13,61,21,50,34,42,48,36,63,28,63,36,-4,44,-4,44,-1,46,3,52,5,60,4,67,1,76,0,87,-3,101,-4,137,2,167,20,189,47,202,80,207,117,203,150,190,181,169,207,142,224,108,230,84,227,62,220,44,208,28,192,16,172,243,411, +155,112,155,127,57,112,57,112,57,127,53,205,53,205,57,127,61,151,53,205,61,151,82,223,82,223,61,151,69,175,82,223,69,175,82,196,68,56,78,1,82,35,82,35,78,1,112,-4,82,35,112,-4,100,21,100,21,112,-4,123,16,139,17,123,16,136,-1,139,17,136,-1,157,5,60,82,57,112,50,18,60,82,50,18,78,1,60,82,78,1,68,56,12,108,17,74,17,145,17,145,17,74,30,44,17,145,30,44,31,178,31,178,30,44,50,18,31,178,50,18,53,205,53,205,50,18,57,112,158,203,169,191,160,221,160,221,169,191,167,220,171,220,167,220,169,191,171,220,169,191,177,177,184,230,176,230,177,177,184,230,177,177,183,162,184,230,183,162,191,162,177,177,176,230,175,227,177,177,175,227,174,224,177,177,174,224,173,222,177,177,173,222,171,220,133,229,119,215,142,212,133,229,142,212,144,226,144,226,142,212,158,203,144,226,158,203,152,223,152,223,158,203,160,221,204,52,196,56,191,33,191,33,196,56,183,41,191,33,183,41,176,17,176,17,183,41,169,29,176,17,169,29,157,5,157,5,169,29,155,22,157,5,155,22,139,17,123,16,112,-4,136,-1,118,230,82,223,82,196,118,230,82,196,99,210,118,230,99,210,119,215,118,230,119,215,133,229,57,127,57,112,155,127, +350,0,350,9,337,12,327,17,319,26,311,38,304,55,180,337,171,337,68,93,52,58,41,34,31,20,19,13,4,9,4,0,104,0,104,9,91,10,81,12,74,16,70,22,69,30,69,34,70,38,71,43,72,47,74,51,97,108,228,108,248,61,254,45,256,38,257,31,257,23,256,21,255,18,251,14,247,12,239,10,232,10,223,9,223,0,16383,16383,220,128,105,128,162,266,108,183,108,294,109,301,111,306,114,310,119,311,126,312,188,312,202,311,217,307,230,300,242,287,251,267,252,263,253,258,255,254,256,250,256,247,268,247,266,331,9,331,9,321,30,320,44,315,52,308,56,295,57,275,57,56,56,37,52,24,43,16,29,11,9,9,9,0,169,0,209,4,242,16,267,35,283,60,289,91,280,132,256,159,223,174,185,181,146,183,16383,16383,108,163, +52,58,70,22,69,30,69,30,69,34,68,93,68,93,69,34,70,38,68,93,70,38,71,43,243,11,239,10,350,0,350,0,239,10,232,10,350,0,232,10,223,9,72,47,74,51,171,337,171,337,74,51,97,108,171,337,97,108,105,128,105,128,97,108,228,108,105,128,228,108,220,128,220,128,228,108,304,55,220,128,304,55,180,337,256,21,255,18,350,0,350,0,255,18,253,16,350,0,253,16,251,14,251,14,247,12,350,0,350,0,247,12,243,11,257,26,350,0,327,17,257,26,327,17,319,26,257,26,319,26,311,38,257,26,311,38,304,55,257,26,304,55,257,31,304,55,228,108,248,61,304,55,248,61,251,53,304,55,251,53,254,45,304,55,254,45,256,38,304,55,256,38,257,31,171,337,105,128,162,266,171,337,162,266,220,128,171,337,220,128,180,337,68,93,52,58,69,30,72,47,171,337,68,93,72,47,68,93,71,43,337,12,327,17,350,0,337,12,350,0,350,9,257,23,256,21,350,0,257,23,350,0,257,26,104,0,104,9,91,10,104,0,91,10,81,12,104,0,81,12,41,34,104,0,41,34,31,20,104,0,31,20,19,13,104,0,19,13,4,9,104,0,4,9,4,0,41,34,81,12,74,16,41,34,74,16,70,22,41,34,70,22,52,58,350,0,223,9,223,0, +108,183,108,294,109,301,111,306,114,310,119,311,126,312,188,312,202,311,217,307,230,300,242,287,251,267,252,263,253,258,255,254,256,250,256,247,268,247,266,331,9,331,9,321,30,320,44,315,52,308,56,295,57,275,57,56,56,37,52,24,43,16,29,11,9,9,9,0,169,0,209,4,242,16,267,35,283,60,289,91,280,132,256,159,223,174,185,181,146,183,16383,16383,108,163,138,163,166,161,191,154,212,141,226,120,231,89,226,59,212,39,190,27,162,21,131,19,120,20,113,22,110,26,108,33,108,41,212,180,226,183,237,187,245,190,253,195,260,200,267,208,273,218,277,229,280,240,281,252,275,281,259,303,233,318,196,328,150,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,178,0,218,4,251,17,276,37,292,63,297,94,296,107,293,120,289,131,282,142,273,151,264,159,255,165,244,171,230,175,212,179,16383,16383,108,188,108,296,109,302,110,307,113,310,116,311,121,312,141,312,173,310,198,302,215,290,226,273,229,250,226,228,217,210,203,198, +52,24,43,16,169,0,169,0,43,16,29,11,169,0,29,11,9,9,44,315,52,308,266,331,266,331,52,308,119,311,266,331,119,311,126,312,266,331,126,312,188,312,266,331,188,312,202,311,217,307,230,300,266,331,266,331,230,300,242,287,266,331,242,287,251,267,251,267,252,263,266,331,266,331,252,263,253,258,266,331,253,258,255,254,266,331,255,254,256,250,266,331,256,250,256,247,266,331,256,247,268,247,57,275,108,33,108,41,108,183,108,163,138,163,108,183,138,163,146,183,146,183,138,163,166,161,146,183,166,161,185,181,185,181,166,161,191,154,185,181,191,154,223,174,223,174,191,154,212,141,223,174,212,141,226,120,57,275,108,41,108,294,57,275,108,294,109,301,57,275,109,301,111,306,57,275,111,306,114,310,57,275,114,310,56,295,119,311,52,308,56,295,119,311,56,295,114,310,30,320,44,315,266,331,30,320,266,331,9,331,30,320,9,331,9,321,231,89,226,59,242,16,242,16,226,59,212,39,242,16,212,39,209,4,209,4,212,39,190,27,209,4,190,27,169,0,169,0,190,27,162,21,169,0,162,21,131,19,131,19,120,20,169,0,169,0,120,20,113,22,169,0,113,22,56,37,56,37,113,22,57,56,231,89,242,16,256,159,256,159,242,16,267,35,256,159,267,35,280,132,280,132,267,35,283,60,280,132,283,60,289,91,226,120,231,89,256,159,226,120,256,159,223,174,57,56,113,22,110,26,57,56,110,26,108,33,57,56,108,33,57,275,169,0,9,9,9,0,52,24,169,0,56,37,266,331,202,311,217,307, +212,180,226,183,237,187,245,190,253,195,260,200,267,208,273,218,277,229,280,240,281,252,275,281,259,303,233,318,196,328,150,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,178,0,218,4,251,17,276,37,292,63,297,94,296,107,293,120,289,131,282,142,273,151,264,159,255,165,244,171,230,175,212,179,16383,16383,108,188,108,296,109,302,110,307,113,310,116,311,121,312,141,312,173,310,198,302,215,290,226,273,229,250,226,228,217,210,203,198,182,191,155,188,16383,16383,108,168,139,168,163,167,182,164,199,158,217,148,225,141,232,131,237,120,239,108,240,94,239,82,237,69,233,58,228,48,221,41,208,31,195,25,180,21,162,19,140,19,127,20,119,22,113,26,109,33,108,41,272,242,270,331,9,331,9,321,28,320,41,315,48,307,52,294,53,275,53,57,52,37,48,24,41,16,28,12,9,9,9,0,150,0,150,9,130,12,117,16,109,24,105,37,104,56,104,302,106,307,109,310,114,312,192,312,206,311,221,307,234,300,246,286,255,267,256,262,258,256,259,250,260,245,260,242,323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,259,0,274,-5,287,-15,298,-29,306,-49,307,-54,308,-60,309,-67,310,-72,311,-75,16383,16383,228,41,227,33,225,27,222,22,217,20, +52,24,43,16,178,0,178,0,43,16,30,11,178,0,30,11,9,9,56,295,57,275,113,310,56,295,113,310,150,331,150,331,113,310,116,311,150,331,116,311,121,312,150,331,121,312,141,312,150,331,141,312,173,310,208,31,195,25,218,4,218,4,195,25,180,21,218,4,180,21,178,0,178,0,180,21,162,19,178,0,162,19,140,19,140,19,127,20,178,0,178,0,127,20,119,22,178,0,119,22,56,37,56,37,119,22,57,56,259,303,233,318,237,187,237,187,233,318,229,250,237,187,229,250,226,228,237,187,226,228,226,183,226,183,226,228,217,210,226,183,217,210,212,180,212,180,217,210,203,198,212,180,203,198,212,179,212,179,203,198,217,148,212,179,217,148,230,175,230,175,217,148,225,141,155,188,163,167,182,191,182,191,163,167,182,164,182,191,182,164,203,198,203,198,182,164,199,158,203,198,199,158,217,148,237,69,233,58,251,17,251,17,233,58,228,48,251,17,228,48,221,41,221,41,208,31,218,4,163,167,155,188,139,168,139,168,155,188,108,188,139,168,108,188,108,168,109,33,108,41,57,275,109,33,57,275,57,56,57,56,119,22,113,26,57,56,113,26,109,33,273,151,264,159,276,37,276,37,264,159,255,165,276,37,255,165,251,17,251,17,255,165,244,171,251,17,244,171,240,94,240,94,239,82,251,17,251,17,239,82,237,69,244,171,230,175,232,131,244,171,232,131,237,120,244,171,237,120,239,108,244,171,239,108,240,94,233,318,196,328,198,302,233,318,198,302,215,290,233,318,215,290,226,273,233,318,226,273,229,250,196,328,150,331,173,310,196,328,173,310,198,302,57,275,108,41,108,296,57,275,108,296,109,302,57,275,109,302,110,307,57,275,110,307,113,310,150,331,9,331,30,320,150,331,30,320,44,316,150,331,44,316,52,308,150,331,52,308,56,295,267,208,273,218,275,281,275,281,273,218,277,229,275,281,277,229,281,252,281,252,277,229,280,240,245,190,253,195,259,303,259,303,253,195,260,200,259,303,260,200,275,281,275,281,260,200,267,208,293,120,289,131,292,63,293,120,292,63,297,94,293,120,297,94,296,107,282,142,273,151,276,37,282,142,276,37,292,63,282,142,292,63,289,131,221,41,218,4,251,17,259,303,237,187,245,190,30,320,9,331,9,321,230,175,225,141,232,131,178,0,9,9,9,0,52,24,178,0,56,37, +272,242,270,331,9,331,9,321,28,320,41,315,48,307,52,294,53,275,53,57,52,37,48,24,41,16,28,12,9,9,9,0,150,0,150,9,130,12,117,16,109,24,105,37,104,56,104,302,106,307,109,310,114,312,192,312,206,311,221,307,234,300,246,286,255,267,256,262,258,256,259,250,260,245,260,242,323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0, +48,24,41,16,150,0,150,0,41,16,28,12,150,0,28,12,9,9,52,294,53,275,109,310,52,294,109,310,48,307,48,307,109,310,114,312,48,307,114,312,270,331,270,331,114,312,122,312,221,307,234,300,270,331,270,331,234,300,246,286,270,331,246,286,255,267,255,267,256,262,270,331,270,331,256,262,258,256,270,331,258,256,259,250,270,331,259,250,260,245,270,331,260,245,260,242,270,331,260,242,272,242,270,331,122,312,192,312,270,331,192,312,206,311,270,331,206,311,221,307,117,16,109,24,53,57,53,57,109,24,105,37,53,57,105,37,53,275,53,275,105,37,104,56,53,275,104,56,104,294,53,275,104,294,104,302,53,275,104,302,106,307,53,275,106,307,109,310,270,331,9,331,28,320,270,331,28,320,41,315,270,331,41,315,48,307,150,0,150,9,130,12,150,0,130,12,117,16,150,0,117,16,52,37,150,0,52,37,48,24,150,0,9,9,9,0,52,37,117,16,53,57,28,320,9,331,9,321, +323,-75,323,9,303,11,291,17,283,27,279,40,278,57,278,274,280,293,283,307,291,315,304,319,323,321,323,331,47,331,47,321,62,320,75,316,83,308,88,295,90,275,87,172,79,97,65,46,45,18,17,9,7,9,7,-75,19,-75,19,-72,20,-67,21,-60,23,-54,24,-49,32,-29,43,-15,56,-5,71,0,259,0,274,-5,287,-15,298,-29,306,-49,307,-54,308,-60,309,-67,310,-72,311,-75,16383,16383,228,41,227,33,225,27,222,22,217,20,209,19,76,19,91,48,101,88,108,141,112,209,113,294,113,303,115,308,119,311,124,312,210,312,217,311,222,310,225,306,227,301,228,294,304,84,290,84,276,57,260,38,239,27,211,21,174,19,137,19,122,21,113,25,107,32,105,42,105,164,181,164,203,162,218,158,227,150,234,136,238,115,249,115,249,232,238,232,234,211,227,198,218,189,203,185,181,184,105,184,105,294,106,302,108,307,111,310,116,312,189,312,218,311,239,306,252,297,261,282,266,259,278,259,276,331,11,331,11,321,30,320,43,315,50,307,54,294,55,275,55,57,54,37,50,24,43,16,30,12,11,9,11,0,281,0,507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193, +20,-67,21,-60,17,9,17,9,21,-60,23,-54,17,9,23,-54,24,-49,24,-49,32,-29,45,18,45,18,32,-29,43,-15,45,18,43,-15,56,-5,62,320,75,316,323,331,323,331,75,316,124,312,323,331,124,312,131,312,323,331,131,312,210,312,323,331,210,312,217,311,87,172,91,48,90,275,90,275,91,48,113,303,113,303,91,48,113,294,71,0,87,0,76,19,71,0,76,19,79,97,79,97,76,19,91,48,79,97,91,48,87,172,65,46,45,18,56,-5,65,46,56,-5,71,0,65,46,71,0,79,97,45,18,17,9,24,-49,17,9,7,9,19,-75,17,9,19,-75,19,-72,17,9,19,-72,20,-67,323,331,217,311,222,310,323,331,222,310,225,306,323,331,225,306,227,301,323,331,227,301,228,294,323,331,228,294,291,315,323,331,291,315,304,319,323,331,304,319,323,321,291,17,283,27,287,-15,287,-15,283,27,279,40,287,-15,279,40,274,-5,274,-5,279,40,278,57,274,-5,278,57,278,274,228,294,243,0,280,293,280,293,243,0,259,0,280,293,259,0,278,274,278,274,259,0,274,-5,283,307,291,315,228,294,283,307,228,294,280,293,113,294,91,48,101,88,113,294,101,88,108,141,113,294,108,141,112,209,124,312,83,308,119,311,119,311,83,308,88,295,119,311,88,295,115,308,115,308,88,295,90,275,115,308,90,275,113,303,47,331,47,321,62,320,47,331,62,320,323,331,308,-60,323,9,307,-54,307,-54,323,9,306,-49,298,-29,306,-49,303,11,298,-29,303,11,291,17,323,9,308,-60,309,-67,323,9,309,-67,310,-72,323,9,310,-72,311,-75,323,9,311,-75,323,-75,323,9,303,11,306,-49,209,19,76,19,87,0,209,19,87,0,243,0,209,19,243,0,217,20,243,0,228,294,228,41,243,0,228,41,227,33,243,0,227,33,225,27,243,0,225,27,222,22,243,0,222,22,217,20,19,-75,7,9,7,-75,291,17,287,-15,298,-29,124,312,75,316,83,308, +304,84,290,84,276,57,260,38,239,27,211,21,174,19,137,19,122,21,113,25,107,32,105,42,105,164,181,164,203,162,218,158,227,150,234,136,238,115,249,115,249,232,238,232,234,211,227,198,218,189,203,185,181,184,105,184,105,294,106,302,108,307,111,310,116,312,189,312,218,311,239,306,252,297,261,282,266,259,278,259,276,331,11,331,11,321,30,320,43,315,50,307,54,294,55,275,55,57,54,37,50,24,43,16,30,12,11,9,11,0,281,0,507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,364,209,373,228,382,251,388,266,394,280,401,293,410,301,419,305,425,302,430,295,435,286,443,279,457,276,466,278,473,283,478,289,481,297,482,305,480,315,475,324,467,331,456,336,442,338,419,335,401,325,388,309,376,290,367,267,356,239,345,216,331,197,310,185,280,181,280,293,283,307,291,315,304,319,325,321,325,331,186,331,186,321, +50,24,43,16,281,0,281,0,43,16,30,12,281,0,30,12,11,9,54,294,55,275,111,310,54,294,111,310,50,307,50,307,111,310,116,312,50,307,116,312,276,331,276,331,116,312,123,312,50,24,122,21,54,37,54,37,122,21,113,25,54,37,113,25,55,57,55,57,113,25,107,32,55,57,107,32,55,275,55,275,107,32,105,42,55,275,105,42,105,294,105,184,105,164,181,164,105,184,181,164,181,184,203,185,181,184,203,162,203,185,203,162,218,189,218,189,203,162,218,158,218,189,218,158,227,198,227,198,218,158,227,150,227,198,227,150,234,211,234,211,227,150,234,136,234,211,234,136,238,232,238,232,234,136,238,115,238,232,238,115,249,115,276,331,123,312,189,312,276,331,189,312,218,311,276,331,218,311,239,306,276,331,239,306,252,297,276,331,252,297,261,282,276,331,261,282,266,259,276,331,266,259,278,259,55,275,105,294,106,302,55,275,106,302,108,307,55,275,108,307,111,310,276,331,11,331,30,320,276,331,30,320,43,315,276,331,43,315,50,307,260,38,239,27,281,0,281,0,239,27,211,21,281,0,211,21,174,19,281,0,304,84,290,84,281,0,290,84,276,57,281,0,276,57,260,38,281,0,174,19,156,19,281,0,156,19,137,19,281,0,137,19,122,21,281,0,122,21,50,24,281,0,11,9,11,0,30,320,11,331,11,321,181,184,181,164,203,162,238,232,249,115,249,232, +507,0,507,9,476,18,453,32,435,52,417,79,394,113,382,130,370,144,359,155,345,164,330,172,329,173,342,181,354,193,364,209,373,228,382,251,388,266,394,280,401,293,410,301,419,305,425,302,430,295,435,286,443,279,457,276,466,278,473,283,478,289,481,297,482,305,480,315,475,324,467,331,456,336,442,338,419,335,401,325,388,309,376,290,367,267,356,239,345,216,331,197,310,185,280,181,280,293,283,307,291,315,304,319,325,321,325,331,186,331,186,321,206,320,220,315,227,307,230,294,231,275,231,181,203,185,182,197,167,216,154,239,143,267,134,290,123,309,109,325,91,335,68,338,54,336,43,331,35,324,30,315,28,305,29,297,32,289,37,283,44,278,53,276,67,279,75,286,80,295,85,302,91,305,100,301,109,293,115,280,122,266,128,251,137,228,146,209,156,193,168,181,181,173,180,172,165,164,152,155,140,144,129,130,117,113,94,79,75,52,57,32,35,18,4,9,4,0,99,0,109,10,120,23,131,40,144,60,158,84,177,116,190,138,201,152,213,159,231,161,231,55,230,36,228,23,222,16,210,11,193,9,193,0,323,0,323,9,305,12,292,16,284,23,281,36,280,55,280,161,297,159,309,152,320,138,333,116,352,84,367,60,380,40,391,23,401,10,411,0,177,175,201,180,222,192,240,208,251,229,256,253,252,281,239,304,217,322,185,334,142,338,131,338,121,337,111,335,100,333,89,330,83,328,67,324,60,322,54,321,49,322,44,324,40,328,37,332,35,338,25,338,23,220,35,220,43,253,56,280,76,301,101,314,131,319,156,316,176,308,191,294,201,277,204,257,204,245,201,232,196,219,188,207,175,196,165,191,155,187,143,185,127,183,104,183,104,163,128,163,146,161,160,158,172,153,184,146,194,138,202,129,209,118,213,105,215,91,211,64,201,43,183,28,159,18,128,15,105,17,85,23,65,33,44,47,23,65,14,57,32,35,54,17,80,4,109,-3,141,-6,160,-6,177,-3,193,0,208,5,223,13,239,25,253,39,264,55,270,74,272,95,267,121,252,142,230,158,204,169,177,174,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17, +75,52,57,32,99,0,99,0,57,32,35,18,99,0,35,18,4,9,75,286,80,295,91,335,91,335,80,295,85,302,91,335,85,302,91,305,91,305,100,301,109,325,109,325,100,301,109,293,109,325,109,293,115,280,44,278,53,276,54,336,54,336,53,276,67,279,54,336,67,279,68,338,68,338,67,279,75,286,68,338,75,286,91,335,28,305,29,297,30,315,30,315,29,297,32,289,30,315,32,289,35,324,35,324,32,289,37,283,35,324,37,283,43,331,43,331,37,283,44,278,43,331,44,278,54,336,115,280,122,266,123,309,123,309,122,266,128,251,123,309,128,251,134,290,134,290,128,251,137,228,134,290,137,228,143,267,143,267,137,228,146,209,143,267,146,209,154,239,154,239,146,209,156,193,154,239,156,193,167,216,167,216,156,193,168,181,167,216,168,181,182,197,182,197,168,181,181,173,182,197,181,173,190,138,190,138,181,173,180,172,228,23,222,16,323,0,323,0,222,16,210,11,323,0,210,11,193,9,304,319,325,321,325,331,304,319,325,331,291,315,291,315,325,331,230,294,291,315,230,294,231,275,231,161,231,275,231,181,231,161,284,23,281,36,323,0,323,9,305,12,323,0,305,12,292,16,323,0,292,16,230,36,323,0,230,36,228,23,280,55,280,181,231,161,280,55,231,161,281,36,231,55,230,36,292,16,231,55,292,16,284,23,231,55,284,23,231,161,280,161,297,159,280,181,280,181,280,274,231,161,231,161,280,274,280,293,231,161,280,293,283,307,283,307,291,315,231,275,283,307,231,275,231,161,325,331,186,331,206,320,325,331,206,320,220,315,325,331,220,315,227,307,325,331,227,307,230,294,453,32,435,52,411,0,411,0,435,52,417,79,411,0,417,79,401,10,401,10,417,79,394,113,401,10,394,113,391,23,391,23,394,113,382,130,391,23,382,130,380,40,380,40,382,130,370,144,380,40,370,144,367,60,367,60,370,144,359,155,367,60,359,155,352,84,352,84,359,155,345,164,352,84,345,164,333,116,333,116,345,164,330,172,333,116,330,172,329,173,476,18,453,32,411,0,476,18,411,0,507,0,476,18,507,0,507,9,320,138,329,173,331,197,331,197,329,173,342,181,331,197,342,181,345,216,345,216,342,181,354,193,345,216,354,193,356,239,356,239,354,193,364,209,356,239,364,209,367,267,367,267,364,209,373,228,367,267,373,228,376,290,376,290,373,228,382,251,376,290,382,251,388,309,388,309,382,251,388,266,388,309,388,266,401,325,401,325,388,266,394,280,401,325,394,280,401,293,310,185,280,181,297,159,310,185,297,159,309,152,310,185,309,152,320,138,310,185,320,138,331,197,442,338,419,335,425,302,425,302,419,335,419,305,410,301,419,305,419,335,410,301,419,335,401,325,457,276,466,278,467,331,467,331,466,278,473,283,467,331,473,283,475,324,475,324,473,283,478,289,475,324,478,289,480,315,480,315,478,289,481,297,480,315,481,297,482,305,430,295,435,286,442,338,442,338,435,286,443,279,442,338,443,279,456,336,456,336,443,279,457,276,456,336,457,276,467,331,190,138,201,152,203,185,203,185,201,152,213,159,203,185,213,159,231,181,231,181,213,159,231,161,99,0,109,10,117,113,117,113,109,10,120,23,117,113,120,23,129,130,129,130,120,23,131,40,129,130,131,40,140,144,140,144,131,40,144,60,140,144,144,60,152,155,152,155,144,60,158,84,152,155,158,84,165,164,165,164,158,84,177,116,165,164,177,116,180,172,180,172,177,116,190,138,94,79,75,52,99,0,94,79,99,0,117,113,109,325,91,335,91,305,109,325,115,280,123,309,99,0,4,9,4,0,182,197,190,138,203,185,333,116,329,173,320,138,442,338,425,302,430,295,401,325,401,293,410,301,206,320,186,331,186,321,323,0,193,9,193,0, +177,175,201,180,222,192,240,208,251,229,256,253,252,281,239,304,217,322,185,334,142,338,131,338,121,337,111,335,100,333,89,330,83,328,67,324,60,322,54,321,49,322,44,324,40,328,37,332,35,338,25,338,23,220,35,220,43,253,56,280,76,301,101,314,131,319,156,316,176,308,191,294,201,277,204,257,204,245,201,232,196,219,188,207,175,196,165,191,155,187,143,185,127,183,104,183,104,163,128,163,146,161,160,158,172,153,184,146,194,138,202,129,209,118,213,105,215,91,211,64,201,43,183,28,159,18,128,15,105,17,85,23,65,33,44,47,23,65,14,57,32,35,54,17,80,4,109,-3,141,-6,160,-6,177,-3,193,0,208,5,223,13,239,25,253,39,264,55,270,74,272,95,267,121,252,142,230,158,204,169,177,174,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457, +40,328,43,253,44,324,44,324,43,253,56,280,44,324,56,280,49,322,49,322,56,280,54,321,60,322,54,321,56,280,60,322,56,280,76,301,201,232,196,219,201,180,201,180,196,219,188,207,201,180,188,207,177,175,177,175,188,207,175,196,177,175,175,196,177,174,177,174,175,196,172,153,172,153,175,196,165,191,172,153,165,191,160,158,160,158,165,191,155,187,160,158,155,187,146,161,146,161,155,187,143,185,146,161,143,185,128,163,128,163,143,185,127,183,128,163,127,183,104,183,23,65,32,35,44,47,44,47,32,35,54,17,44,47,54,17,65,33,65,33,54,17,80,4,65,33,80,4,85,23,85,23,80,4,109,-3,85,23,109,-3,105,17,105,17,109,-3,128,15,159,18,128,15,141,-6,159,18,141,-6,160,-6,131,319,121,337,111,335,131,319,111,335,101,314,131,319,131,338,121,337,101,314,111,335,100,333,101,314,100,333,89,330,101,314,89,330,83,328,101,314,83,328,76,301,76,301,83,328,75,326,76,301,75,326,67,324,76,301,67,324,60,322,156,316,176,308,185,334,185,334,176,308,191,294,185,334,191,294,217,322,217,322,191,294,201,277,217,322,201,277,204,257,204,257,204,245,222,192,222,192,204,245,201,232,222,192,201,232,201,180,156,316,185,334,142,338,156,316,142,338,131,338,156,316,131,338,131,319,217,322,222,192,239,304,239,304,222,192,240,208,239,304,240,208,252,281,252,281,240,208,251,229,252,281,251,229,256,253,204,257,222,192,217,322,177,174,172,153,184,146,184,146,194,138,204,169,204,169,194,138,202,129,204,169,202,129,209,118,267,121,252,142,253,39,267,121,253,39,264,55,267,121,264,55,270,74,267,121,270,74,272,95,160,-6,177,-3,183,28,183,28,177,-3,193,0,183,28,193,0,201,43,201,43,193,0,208,5,201,43,208,5,211,64,211,64,208,5,223,13,211,64,223,13,215,91,215,91,223,13,230,158,230,158,223,13,239,25,230,158,239,25,252,142,252,142,239,25,253,39,204,169,209,118,230,158,230,158,209,118,213,105,230,158,213,105,215,91,204,169,177,174,184,146,128,15,109,-3,141,-6,40,328,37,332,43,253,43,253,37,332,35,338,43,253,35,338,35,220,35,220,35,338,25,338,35,220,25,338,23,220,32,35,23,65,14,57,159,18,160,-6,183,28,128,163,104,183,104,163, +352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,315,251,309,255,299,257,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,118,16,110,23,106,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,144,458,135,456,127,452,120,445,115,436,113,424,117,408,129,395,145,386,163,380,180,378,198,380,216,385,232,395,243,407,248,424,16383,16383,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293, +50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,257,285,105,82,105,48,105,48,105,274,54,274,54,274,105,274,106,294,54,274,106,294,110,307,150,331,9,331,29,319,150,331,29,319,42,315,150,331,42,315,50,307,150,331,50,307,53,294,150,331,53,294,118,315,150,331,118,315,131,319,150,331,131,319,150,321,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,242,315,251,309,352,331,352,331,251,309,255,299,352,331,255,299,257,285,257,285,257,252,309,37,309,37,257,252,257,62,309,37,257,62,312,25,312,25,257,62,320,17,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,257,285,320,315,257,285,312,307,312,307,257,285,309,293,307,55,307,274,257,285,307,55,257,285,309,37,230,319,242,315,352,331,230,319,352,331,212,331,230,319,212,331,212,321,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,149,0,148,9,131,11,149,0,131,11,118,16,149,0,118,16,53,39,149,0,53,39,50,25,106,33,105,48,54,274,106,33,54,274,54,61,106,33,54,61,110,23,54,61,53,39,118,16,54,61,118,16,110,23,149,0,9,9,9,0,352,0,213,9,213,0,256,41,320,17,257,62,309,293,257,285,307,274,257,285,105,48,257,252,29,319,9,331,9,321, +248,424,246,436,242,445,235,452,227,456,219,458,211,456,208,453,206,450,205,445,207,438,213,434,225,430,227,425,226,418,221,413,212,408,199,406,180,405,162,406,149,408,140,413,135,418,134,425,136,430,148,434,154,438,156,445,156,450,154,453,151,456,148,457,144,458,135,456,127,452,120,445,115,436,113,424,117,408,129,395,145,386,163,380,180,378,198,380,216,385,232,395,243,407,248,424,16383,16383,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,212,331,212,321,230,319,242,316,250,310,254,300,256,285,105,82,105,274,106,294,110,307,118,315,131,319,150,321,150,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,148,9,131,11,119,15,111,22,107,33,105,48,257,252,257,62,256,41,252,26,245,17,232,12,213,9,213,0,343,0,343,9,321,13,312,17,302,23,292,30,282,40,271,54,259,71,246,92,230,114,218,131,206,145,193,155,180,164,164,171,164,172,178,181,190,193,201,208,211,227,220,251,225,266,232,281,239,294,247,303,257,306,263,303,267,296,272,287,281,280,294,277,303,279,310,284,315,291,318,299,319,306,317,317,313,325,305,332,295,337,281,338,257,335,239,325,224,309,213,290,204,267,196,245,187,226,176,209,162,195,142,185,137,183,131,182,124,181,106,181,106,274,107,293,110,307,117,315,130,319,151,321,151,331,10,331,10,321,30,319,43,315,51,306,54,293,55,275,55,65,54,42,51,27,43,17,29,12,9,9,9,0,151,0,151,9,132,12,119,16,111,23,107,36,106,55,106,161,113,161,119,160,125,158,130,156,134,154,140,149,149,140,160,126,174,108,189,85,203,61,216,40,227,24,238,10,248,0,332,0,332,9,313,12,300,17,292,25,288,37,287,55, +149,408,140,413,145,386,145,386,140,413,135,418,145,386,135,418,129,395,129,395,135,418,134,425,135,456,134,425,136,430,135,456,136,430,144,458,144,458,136,430,142,432,144,458,142,432,148,434,148,457,148,434,151,456,151,456,148,434,154,438,151,456,154,438,154,453,154,453,154,438,156,445,154,453,156,445,156,450,129,395,134,425,135,456,129,395,135,456,127,452,129,395,127,452,120,445,129,395,120,445,117,408,115,436,113,424,117,408,115,436,117,408,120,445,149,408,163,380,162,406,162,406,163,380,180,405,199,406,180,405,180,378,199,406,180,378,198,380,246,436,242,445,243,407,243,407,242,445,235,452,243,407,235,452,232,395,232,395,235,452,227,456,232,395,227,456,227,425,227,456,219,458,219,432,227,456,219,432,225,430,227,456,225,430,227,425,215,457,211,456,213,434,215,457,213,434,219,432,215,457,219,432,219,458,208,453,206,450,207,438,208,453,207,438,213,434,208,453,213,434,211,456,227,425,226,418,232,395,232,395,226,418,221,413,232,395,221,413,216,385,216,385,221,413,212,408,216,385,212,408,199,406,180,405,163,380,180,378,50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,119,15,111,22,54,61,54,61,111,22,107,33,54,61,107,33,54,274,54,274,107,33,105,48,105,82,105,48,256,285,150,331,9,331,29,319,150,331,29,319,42,315,150,331,42,315,50,307,150,331,50,307,53,294,150,331,53,294,118,315,150,331,118,315,131,319,150,331,131,319,150,321,105,274,106,294,54,274,105,274,54,274,105,48,105,274,105,48,105,82,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,352,331,212,331,230,319,352,331,230,319,242,316,352,331,242,316,250,310,352,331,250,310,254,300,352,331,254,300,256,285,352,331,256,285,320,315,352,331,320,315,333,319,352,331,333,319,352,321,320,17,312,25,257,62,257,62,312,25,309,37,257,62,309,37,257,252,257,252,309,37,307,55,257,252,307,55,307,274,257,252,307,274,309,293,257,252,309,293,312,307,257,252,312,307,320,315,257,252,320,315,256,285,257,252,256,285,105,48,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,149,0,148,9,131,11,149,0,131,11,119,15,149,0,119,15,53,39,149,0,53,39,50,25,149,0,9,9,9,0,53,39,119,15,54,61,352,0,213,9,213,0,256,41,320,17,257,62,230,319,212,331,212,321,29,319,9,331,9,321,199,406,198,380,216,385,246,436,243,407,248,424,207,438,206,450,205,445,149,408,145,386,163,380,144,458,148,434,148,457, +343,0,343,9,321,13,312,17,302,23,292,30,282,40,271,54,259,71,246,92,230,114,218,131,206,145,193,155,180,164,164,171,164,172,178,181,190,193,201,208,211,227,220,251,225,266,232,281,239,294,247,303,257,306,263,303,267,296,272,287,281,280,294,277,303,279,310,284,315,291,318,299,319,306,317,317,313,325,305,332,295,337,281,338,257,335,239,325,224,309,213,290,204,267,196,245,187,226,176,209,162,195,142,185,137,183,131,182,124,181,106,181,106,274,107,293,110,307,117,315,130,319,151,321,151,331,10,331,10,321,30,319,43,315,51,306,54,293,55,275,55,65,54,42,51,27,43,17,29,12,9,9,9,0,151,0,151,9,132,12,119,16,111,23,107,36,106,55,106,161,113,161,119,160,125,158,130,156,134,154,140,149,149,140,160,126,174,108,189,85,203,61,216,40,227,24,238,10,248,0,332,0,332,9,313,12,300,17,292,25,288,37,287,55,287,274,288,293,292,307,300,315,313,319,332,321,332,331,65,331,65,321,80,320,93,316,101,308,107,295,108,275,108,112,105,78,100,47,89,26,73,17,65,21,54,43,46,53,32,57,25,56,18,53,11,48,6,40,4,30,7,14,14,4,25,-2,39,-5,55,-6,92,2,114,27,126,60,130,97,131,131,131,292,132,300,133,305,136,309,141,311,148,312,219,312,226,311,231,309,234,305,236,300,237,292,237,63,236,41,232,26,225,17,212,12,193,9,193,0,435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29, +151,0,151,9,132,12,151,0,132,12,119,16,151,0,119,16,54,42,151,0,54,42,51,27,151,0,51,27,43,17,151,0,43,17,29,12,151,0,29,12,9,9,151,0,9,9,9,0,55,275,107,36,106,55,106,181,106,161,113,161,55,275,106,55,106,181,106,181,113,161,116,181,116,181,113,161,119,160,116,181,119,160,124,181,124,181,119,160,125,158,124,181,125,158,131,182,131,182,125,158,130,156,131,182,130,156,134,154,134,154,140,149,137,183,137,183,140,149,142,185,162,195,142,185,149,140,162,195,149,140,160,126,55,65,54,42,119,16,55,65,119,16,111,23,55,65,111,23,107,36,55,65,107,36,55,275,151,331,10,331,30,319,151,331,30,319,43,315,151,331,43,315,51,306,151,331,51,306,54,293,151,331,54,293,117,315,151,331,117,315,130,319,151,331,130,319,151,321,106,274,107,293,55,275,106,274,55,275,106,181,55,275,107,293,110,307,55,275,110,307,117,315,55,275,117,315,54,293,137,183,131,182,134,154,196,245,187,226,190,193,196,245,190,193,201,208,196,245,201,208,204,267,190,193,187,226,178,181,178,181,187,226,176,209,178,181,176,209,164,172,164,172,176,209,162,195,164,172,162,195,164,171,164,171,162,195,160,126,164,171,160,126,174,108,225,266,232,281,239,325,239,325,232,281,239,294,239,325,239,294,257,335,257,335,239,294,247,303,257,335,247,303,257,306,257,306,263,303,257,335,257,335,263,303,281,338,204,267,211,227,213,290,213,290,211,227,220,251,213,290,220,251,224,309,224,309,220,251,225,266,224,309,225,266,239,325,332,11,321,13,343,0,343,0,321,13,312,17,343,0,312,17,248,0,248,0,312,17,302,23,248,0,302,23,292,30,292,30,282,40,248,0,248,0,282,40,271,54,248,0,271,54,259,71,193,155,189,85,203,61,193,155,203,61,206,145,206,145,203,61,216,40,206,145,216,40,218,131,218,131,216,40,227,24,218,131,227,24,230,114,230,114,227,24,238,10,230,114,238,10,246,92,246,92,238,10,248,0,246,92,248,0,259,71,272,287,281,280,281,338,281,338,281,280,294,277,281,338,294,277,295,337,295,337,294,277,303,279,295,337,303,279,305,332,305,332,303,279,310,284,305,332,310,284,313,325,313,325,310,284,315,291,313,325,315,291,317,317,317,317,315,291,318,299,317,317,318,299,319,306,281,338,263,303,267,296,281,338,267,296,272,287,180,164,164,171,174,108,180,164,174,108,189,85,180,164,189,85,193,155,142,185,140,149,149,140,332,11,343,0,343,9,211,227,204,267,201,208,30,319,10,331,10,321, +332,0,332,9,313,12,300,17,292,25,288,37,287,55,287,274,288,293,292,307,300,315,313,319,332,321,332,331,65,331,65,321,80,320,93,316,101,308,107,295,108,275,108,112,105,78,100,47,89,26,73,17,65,21,54,43,46,53,32,57,25,56,18,53,11,48,6,40,4,30,7,14,14,4,25,-2,39,-5,55,-6,92,2,114,27,126,60,130,97,131,131,131,292,132,300,133,305,136,309,141,311,148,312,219,312,226,311,231,309,234,305,236,300,237,292,237,63,236,41,232,26,225,17,212,12,193,9,193,0,435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,81,48,80,75,80,275,206,0,213,0,340,286,340,40,336,26,328,17,315,12,296,9,296,0,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321, +108,112,105,78,114,27,114,27,105,78,100,47,114,27,100,47,92,2,92,2,100,47,89,26,92,2,89,26,73,17,73,17,65,21,92,2,92,2,65,21,55,-6,107,295,108,275,136,309,107,295,136,309,101,308,101,308,136,309,141,311,101,308,141,311,332,331,332,331,141,311,148,312,232,26,225,17,332,0,332,0,225,17,212,12,332,0,212,12,193,9,332,331,148,312,219,312,332,331,219,312,226,311,332,331,226,311,231,309,332,331,231,309,234,305,332,331,234,305,236,300,332,331,236,300,237,292,332,331,237,292,300,315,332,331,300,315,313,319,332,331,313,319,332,321,287,55,287,274,237,292,237,292,287,274,288,293,237,292,288,293,292,307,300,17,292,25,237,63,237,63,292,25,288,37,237,63,288,37,237,292,131,292,132,300,114,27,131,292,114,27,126,60,131,292,126,60,130,97,131,292,130,97,131,131,108,275,108,145,114,27,108,275,114,27,132,300,108,275,132,300,133,305,108,275,133,305,136,309,332,331,65,331,80,320,332,331,80,320,93,316,332,331,93,316,101,308,332,0,332,9,313,12,332,0,313,12,300,17,332,0,300,17,236,41,332,0,236,41,232,26,55,-6,65,21,60,31,55,-6,60,31,54,43,55,-6,54,43,46,53,55,-6,46,53,39,-5,46,53,32,57,39,-5,39,-5,32,57,25,56,39,-5,25,56,25,-2,25,-2,25,56,18,53,25,-2,18,53,14,4,14,4,18,53,11,48,14,4,11,48,7,14,7,14,11,48,6,40,7,14,6,40,4,30,108,112,114,27,108,145,332,0,193,9,193,0,236,41,300,17,237,63,237,292,288,37,287,55,80,320,65,331,65,321,300,315,237,292,292,307, +435,0,435,9,417,12,404,17,397,25,393,38,392,56,392,275,393,294,397,307,404,316,417,320,435,321,435,331,335,331,225,80,109,331,11,331,11,321,31,319,45,315,53,307,57,294,58,275,58,75,57,47,53,29,44,18,30,12,9,9,9,0,127,0,127,9,107,12,94,18,85,29,81,48,80,75,80,275,206,0,213,0,340,286,340,40,336,26,328,17,315,12,296,9,296,0,352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,232,319,245,315,252,307,256,294,257,274,257,180,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17, +53,29,44,18,127,0,127,0,44,18,30,12,127,0,30,12,9,9,336,26,328,17,435,0,435,0,328,17,315,12,435,0,315,12,296,9,417,320,435,321,435,331,417,320,435,331,404,316,404,316,435,331,340,286,404,316,340,286,397,307,397,307,340,286,393,294,404,17,397,25,340,61,340,61,397,25,393,38,340,61,393,38,340,286,340,286,393,38,392,56,340,286,392,56,392,275,206,0,213,0,225,80,225,80,213,0,340,286,225,80,340,286,335,331,335,331,340,286,435,331,109,331,11,331,31,319,109,331,31,319,45,315,109,331,45,315,53,307,109,331,53,307,57,294,109,331,57,294,58,275,109,331,58,275,80,275,109,331,80,275,206,0,109,331,206,0,225,80,80,75,80,275,58,275,80,75,58,275,81,48,81,48,58,275,58,75,81,48,58,75,85,29,85,29,58,75,57,47,85,29,57,47,94,18,94,18,57,47,53,29,94,18,53,29,127,0,435,0,435,9,417,12,435,0,417,12,404,17,435,0,404,17,340,40,435,0,340,40,336,26,107,12,94,18,127,0,107,12,127,0,127,9,127,0,9,9,9,0,435,0,296,9,296,0,340,40,404,17,340,61,31,319,11,331,11,321,393,294,340,286,392,275, +352,0,352,9,333,12,320,17,312,25,309,37,307,55,307,274,309,293,312,307,320,315,333,319,352,321,352,331,213,331,213,321,232,319,245,315,252,307,256,294,257,274,257,180,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,257,157,257,62,256,41,252,26,245,17,232,12,213,9,213,0,345,166,337,222,316,269,281,306,236,330,181,338,127,330,82,307,47,271,26,224,18,167,26,109,47,61,82,24,127,1,181,-6,235,1,280,24,315,60,337,108,345,166,16383,16383,288,169,286,134,281,103,273,76,261,53,247,35,235,26,223,19,210,15,197,12,182,11,168,12,155,15,143,19,131,25,120,33,103,52,91,75,82,102,77,132,75,166,76,194,81,222,88,247,98,269,109,286,122,298,135,308,150,314,165,318,181,320,194,319,207,316,220,311,231,305,243,296,258,279,271,257, +50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,149,331,9,331,29,319,149,331,29,319,42,315,149,331,42,315,50,307,149,331,50,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,54,274,106,38,105,56,105,180,105,157,257,157,105,180,257,157,257,180,257,180,257,157,312,25,257,180,312,25,309,37,54,274,105,56,105,274,54,274,105,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,252,26,245,17,352,0,352,0,245,17,232,12,352,0,232,12,213,9,333,319,352,321,352,331,333,319,352,331,320,315,320,315,352,331,256,294,320,315,256,294,257,274,309,37,257,274,257,180,307,55,307,274,257,274,257,274,307,274,309,293,257,274,309,293,312,307,352,331,213,331,232,319,352,331,232,319,245,315,352,331,245,315,252,307,352,331,252,307,256,294,352,0,352,9,333,12,352,0,333,12,320,17,352,0,320,17,256,41,352,0,256,41,252,26,257,62,256,41,320,17,257,62,320,17,312,25,257,62,312,25,257,157,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,54,61,53,39,118,17,54,61,118,17,110,25,54,61,110,25,106,38,54,61,106,38,54,274,149,0,9,9,9,0,352,0,213,9,213,0,257,274,309,37,307,55,232,319,213,331,213,321,320,315,257,274,312,307,29,319,9,331,9,321, +345,166,337,222,316,269,281,306,236,330,181,338,127,330,82,307,47,271,26,224,18,167,26,109,47,61,82,24,127,1,181,-6,235,1,280,24,315,60,337,108,345,166,16383,16383,288,169,286,134,281,103,273,76,261,53,247,35,235,26,223,19,210,15,197,12,182,11,168,12,155,15,143,19,131,25,120,33,103,52,91,75,82,102,77,132,75,166,76,194,81,222,88,247,98,269,109,286,122,298,135,308,150,314,165,318,181,320,194,319,207,316,220,311,231,305,243,296,258,279,271,257,280,231,286,201,288,169,353,0,353,9,333,12,321,17,313,25,309,37,308,55,308,274,309,293,313,307,321,315,334,319,353,321,353,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,300,107,306,111,309,116,311,124,312,238,312,246,311,251,309,255,306,257,300,257,62,256,41,253,26,246,17,233,12,213,9,213,0,9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9, +150,314,181,338,135,308,135,308,181,338,127,330,135,308,127,330,122,298,122,298,127,330,109,286,98,269,109,286,127,330,98,269,127,330,82,307,82,102,82,24,91,75,91,75,82,24,127,1,91,75,127,1,103,52,103,52,127,1,120,33,131,25,120,33,127,1,131,25,127,1,181,-6,236,330,181,338,194,319,194,319,181,338,181,320,165,318,181,320,181,338,165,318,181,338,150,314,223,19,210,15,235,1,235,1,210,15,197,12,235,1,197,12,182,11,182,11,168,12,181,-6,181,-6,168,12,155,15,181,-6,155,15,143,19,207,316,220,311,236,330,236,330,220,311,231,305,236,330,231,305,243,296,243,296,258,279,281,306,281,306,258,279,271,257,281,306,271,257,280,231,281,103,273,76,280,24,280,24,273,76,261,53,280,24,261,53,247,35,247,35,235,26,280,24,280,24,235,26,235,1,345,166,337,222,337,108,337,108,337,222,316,269,337,108,316,269,315,60,315,60,316,269,288,169,286,201,288,169,316,269,286,201,316,269,281,306,286,201,281,306,280,231,281,306,236,330,243,296,315,60,288,169,286,134,315,60,286,134,281,103,315,60,281,103,280,24,182,11,181,-6,235,1,82,307,47,271,47,61,82,307,47,61,75,166,82,307,75,166,76,194,82,307,76,194,81,222,82,307,81,222,88,247,82,307,88,247,98,269,82,102,77,132,82,24,82,24,77,132,75,166,26,109,47,61,47,271,26,109,47,271,26,224,26,109,26,224,18,167,82,24,75,166,47,61,223,19,235,1,235,26,236,330,194,319,207,316,131,25,181,-6,143,19, +353,0,353,9,333,12,321,17,313,25,309,37,308,55,308,274,309,293,313,307,321,315,334,319,353,321,353,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,300,107,306,111,309,116,311,124,312,238,312,246,311,251,309,255,306,257,300,257,62,256,41,253,26,246,17,233,12,213,9,213,0,9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,9,0,150,0,150,9,129,12,115,16,107,24,104,37,103,56,103,146,110,145,115,145,120,144,132,144,161,145,184,147,204,153,221,161,239,175,249,185,257,197,263,210,266,225,267,240,266,254,263,268,258,280,252,291,243,300,227,310,209,319,187,325,162,329,134,331,16383,16383,103,294,103,301,105,306,108,310,113,311,120,312,156,309, +50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,42,315,50,307,353,331,353,331,50,307,116,311,353,331,116,311,124,312,353,331,124,312,238,312,353,331,238,312,246,311,253,26,246,17,353,0,353,0,246,17,233,12,353,0,233,12,213,9,353,331,246,311,251,309,353,331,251,309,255,306,353,331,255,306,257,300,353,331,257,300,257,292,353,331,257,292,321,315,353,331,321,315,334,319,353,331,334,319,353,321,308,55,308,274,257,292,257,292,308,274,309,293,257,292,309,293,313,307,321,17,313,25,257,62,257,62,313,25,309,37,257,62,309,37,257,292,118,17,110,25,54,61,54,61,110,25,106,38,54,61,106,38,54,274,54,274,106,38,105,56,54,274,105,56,105,291,54,274,105,291,105,300,54,274,105,300,107,306,54,274,107,306,111,309,54,274,111,309,53,294,116,311,50,307,53,294,116,311,53,294,111,309,29,319,42,315,353,331,29,319,353,331,9,331,29,319,9,331,9,321,353,0,353,9,333,12,353,0,333,12,321,17,353,0,321,17,256,41,353,0,256,41,253,26,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,149,0,9,9,9,0,53,39,118,17,54,61,353,0,213,9,213,0,256,41,321,17,257,62,257,292,309,37,308,55,321,315,257,292,313,307, +9,331,9,321,28,319,40,315,47,307,51,294,51,39,48,25,41,16,29,12,9,9,9,0,150,0,150,9,129,12,115,16,107,24,104,37,103,56,103,146,110,145,115,145,120,144,132,144,161,145,184,147,204,153,221,161,239,175,249,185,257,197,263,210,266,225,267,240,266,254,263,268,258,280,252,291,243,300,227,310,209,319,187,325,162,329,134,331,16383,16383,103,294,103,301,105,306,108,310,113,311,120,312,156,309,182,302,200,287,210,266,213,238,210,213,199,192,182,177,158,167,128,164,118,164,113,165,109,165,103,166,311,65,289,47,269,32,248,23,226,17,201,15,180,17,161,21,143,28,126,38,112,51,99,68,89,88,82,112,77,140,76,171,81,219,96,260,121,291,154,311,196,318,215,316,232,311,248,304,263,293,276,280,283,272,289,263,294,252,299,240,302,224,314,224,310,338,300,338,297,332,289,324,284,322,278,321,273,322,266,324,258,326,244,330,232,333,208,337,196,338,185,338,157,336,131,330,106,320,83,305,63,286,47,266,35,243,26,218,20,191,18,162,20,133,26,106,36,80,49,57,66,37,85,22,107,9,131,0,157,-4, +113,311,120,312,120,312,134,331,120,312,156,309,134,331,156,309,162,329,162,329,156,309,182,302,162,329,182,302,187,325,187,325,182,302,200,287,187,325,200,287,209,319,209,319,200,287,210,266,209,319,210,266,227,310,227,310,210,266,213,238,227,310,213,238,221,161,221,161,210,213,204,153,204,153,210,213,199,192,204,153,199,192,184,147,184,147,199,192,182,177,184,147,182,177,161,145,161,145,182,177,158,167,161,145,158,167,132,144,132,144,158,167,128,164,132,144,128,164,125,144,125,144,128,164,122,164,125,144,122,164,120,144,120,144,122,164,118,164,120,144,118,164,115,145,115,145,118,164,113,165,115,145,113,165,110,145,110,145,113,165,109,165,110,145,109,165,103,146,103,146,109,165,103,166,103,146,103,166,103,56,103,56,103,166,51,276,103,56,51,276,104,37,104,37,51,276,51,61,267,240,266,254,266,225,266,225,266,254,263,268,266,225,263,268,263,210,263,210,263,268,258,280,263,210,258,280,257,197,257,197,258,280,252,291,257,197,252,291,249,185,249,185,252,291,243,300,249,185,243,300,239,175,239,175,243,300,227,310,239,175,227,310,221,161,134,331,9,331,28,319,134,331,28,319,40,315,134,331,40,315,47,307,134,331,47,307,51,294,134,331,51,294,51,276,134,331,51,276,108,310,134,331,108,310,113,311,134,331,113,311,120,312,103,294,103,301,51,276,103,294,51,276,103,166,105,306,108,310,51,276,105,306,51,276,103,301,150,0,150,9,129,12,150,0,129,12,115,16,150,0,115,16,51,39,150,0,51,39,48,25,150,0,48,25,41,16,150,0,41,16,29,12,150,0,29,12,9,9,150,0,9,9,9,0,51,61,51,39,115,16,51,61,115,16,107,24,51,61,107,24,104,37,28,319,9,331,9,321,210,213,221,161,213,238, +311,65,289,47,269,32,248,23,226,17,201,15,180,17,161,21,143,28,126,38,112,51,99,68,89,88,82,112,77,140,76,171,81,219,96,260,121,291,154,311,196,318,215,316,232,311,248,304,263,293,276,280,283,272,289,263,294,252,299,240,302,224,314,224,310,338,300,338,297,332,289,324,284,322,278,321,273,322,266,324,258,326,244,330,232,333,208,337,196,338,185,338,157,336,131,330,106,320,83,305,63,286,47,266,35,243,26,218,20,191,18,162,20,133,26,106,36,80,49,57,66,37,85,22,107,9,131,0,157,-4,184,-6,218,-4,249,3,277,16,301,34,320,56,296,246,292,331,18,331,15,246,27,246,33,274,42,292,54,303,73,309,100,310,130,310,130,61,129,39,125,25,117,16,104,12,83,9,83,0,229,0,229,9,208,11,194,16,186,23,182,36,181,55,181,310,210,310,237,309,256,303,269,292,277,274,284,246,347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,51,294,61,278,181,67,172,53,163,41,154,33,146,28, +66,37,77,140,76,171,76,171,83,305,66,37,66,37,83,305,63,286,66,37,63,286,49,57,49,57,63,286,47,266,49,57,47,266,36,80,36,80,47,266,35,243,36,80,35,243,26,106,26,106,35,243,26,218,26,106,26,218,20,133,20,133,26,218,20,191,20,133,20,191,18,162,82,112,85,22,89,88,89,88,85,22,107,9,89,88,107,9,99,68,99,68,107,9,112,51,126,38,112,51,131,0,126,38,131,0,143,28,143,28,131,0,157,-4,143,28,157,-4,161,21,161,21,157,-4,184,-6,161,21,184,-6,180,17,180,17,184,-6,201,15,226,17,201,15,218,-4,226,17,218,-4,249,3,77,140,66,37,85,22,77,140,85,22,82,112,112,51,107,9,131,0,258,326,263,293,266,324,266,324,263,293,276,280,266,324,276,280,273,322,273,322,276,280,278,321,284,322,278,321,283,272,284,322,283,272,289,263,278,321,276,280,283,272,232,333,232,311,244,330,244,330,232,311,248,304,244,330,248,304,251,328,251,328,248,304,263,293,251,328,263,293,258,326,220,335,208,337,215,316,220,335,215,316,232,311,220,335,232,311,232,333,208,337,196,338,215,316,215,316,196,338,196,318,154,311,196,318,157,336,154,311,157,336,131,330,314,224,310,338,302,224,302,224,310,338,300,338,302,224,300,338,299,240,299,240,300,338,297,332,299,240,297,332,294,252,294,252,297,332,293,328,294,252,293,328,289,263,289,263,293,328,289,324,289,263,289,324,284,322,320,56,311,65,301,34,301,34,311,65,289,47,301,34,289,47,277,16,277,16,289,47,269,32,277,16,269,32,249,3,249,3,269,32,248,23,249,3,248,23,226,17,201,15,184,-6,218,-4,196,318,196,338,185,338,196,318,185,338,157,336,76,171,81,219,83,305,83,305,81,219,96,260,83,305,96,260,106,320,106,320,96,260,121,291,106,320,121,291,131,330,131,330,121,291,154,311, +296,246,292,331,18,331,15,246,27,246,33,274,42,292,54,303,73,309,100,310,130,310,130,61,129,39,125,25,117,16,104,12,83,9,83,0,229,0,229,9,208,11,194,16,186,23,182,36,181,55,181,310,210,310,237,309,256,303,269,292,277,274,284,246,347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300, +292,331,18,331,73,309,292,331,73,309,100,310,292,331,100,310,130,310,292,331,130,310,181,310,292,331,181,310,210,310,292,331,210,310,237,309,292,331,237,309,256,303,292,331,256,303,269,292,292,331,269,292,277,274,292,331,277,274,284,246,292,331,284,246,296,246,194,16,186,23,130,61,130,61,186,23,182,36,130,61,182,36,130,310,130,310,182,36,181,55,130,310,181,55,181,310,18,331,15,246,27,246,18,331,27,246,33,274,18,331,33,274,42,292,18,331,42,292,54,303,18,331,54,303,73,309,229,0,229,9,208,11,229,0,208,11,194,16,229,0,194,16,129,39,229,0,129,39,125,25,229,0,125,25,117,16,229,0,117,16,104,12,229,0,104,12,83,9,229,0,83,9,83,0,129,39,194,16,130,61, +347,331,243,331,243,322,254,320,263,316,269,312,273,306,274,299,273,292,271,284,268,273,263,260,257,245,204,118,132,245,123,262,110,288,107,297,106,303,107,309,112,314,119,318,129,321,142,322,142,331,7,331,7,322,15,320,27,316,37,310,42,305,46,300,51,294,61,278,181,67,172,53,163,41,154,33,146,28,138,27,136,27,133,28,131,29,127,30,124,32,118,35,108,39,104,40,99,41,92,40,85,37,80,32,77,26,76,20,78,10,84,3,93,-2,104,-5,117,-6,132,-4,147,0,161,9,175,22,188,40,194,51,202,65,210,81,219,100,228,122,291,272,300,289,310,302,321,312,333,319,347,322,218,290,219,301,223,310,232,316,247,320,269,321,269,331,116,331,116,321,138,320,152,317,161,311,165,302,166,290,166,280,124,276,84,263,50,241,27,209,19,165,24,128,41,97,69,72,107,57,158,51,166,51,166,37,164,27,158,19,148,14,134,10,116,9,116,0,269,0,269,9,248,11,233,14,224,19,219,27,218,38,218,51,230,51,265,56,302,69,334,91,357,123,366,165,357,209,333,241,300,263,260,276,218,280,16383,16383,217,262,251,256,278,240,296,216,307,188,311,159,305,128,291,103,270,85,244,74,217,70,16383,16383,167,70,135,75,108,88,89,107,78,132,74,159,78,189,91,216,111,240,136,256, +21,318,27,316,142,331,142,331,27,316,32,313,142,331,32,313,37,310,37,310,42,305,142,331,142,331,42,305,46,300,142,331,46,300,51,294,61,278,181,67,107,297,61,278,107,297,106,303,106,303,107,309,61,278,61,278,107,309,112,314,61,278,112,314,56,286,142,331,51,294,56,286,142,331,56,286,112,314,142,331,112,314,119,318,142,331,119,318,129,321,142,331,129,321,142,322,15,320,21,318,142,331,15,320,142,331,7,331,15,320,7,331,7,322,133,28,131,29,132,-4,132,-4,131,29,127,30,132,-4,127,30,124,32,124,32,118,35,132,-4,132,-4,118,35,117,-6,181,67,172,53,175,22,175,22,172,53,163,41,175,22,163,41,161,9,161,9,163,41,154,33,161,9,154,33,147,0,147,0,154,33,146,28,147,0,146,28,138,27,138,27,136,27,147,0,147,0,136,27,133,28,147,0,133,28,132,-4,257,245,204,118,210,81,257,245,210,81,219,100,257,245,219,100,228,122,257,245,228,122,291,272,347,331,243,331,254,320,347,331,254,320,263,316,347,331,263,316,269,312,347,331,269,312,273,306,347,331,273,306,274,299,347,331,274,299,321,312,347,331,321,312,333,319,347,331,333,319,347,322,291,272,300,289,274,299,291,272,274,299,273,292,291,272,273,292,271,284,291,272,271,284,268,273,291,272,268,273,263,260,291,272,263,260,257,245,310,302,321,312,274,299,310,302,274,299,300,289,204,118,132,245,181,67,204,118,181,67,188,40,204,118,188,40,194,51,204,118,194,51,202,65,204,118,202,65,210,81,181,67,132,245,123,262,181,67,123,262,116,276,181,67,116,276,110,288,181,67,110,288,107,297,118,35,113,37,117,-6,117,-6,113,37,108,39,117,-6,108,39,104,-5,104,-5,108,39,104,40,104,-5,104,40,99,41,93,-2,104,-5,99,41,93,-2,99,41,92,40,93,-2,92,40,85,37,93,-2,85,37,84,3,80,32,77,26,78,10,80,32,78,10,84,3,80,32,84,3,85,37,78,10,77,26,76,20,181,67,175,22,188,40,254,320,243,331,243,322, +218,290,219,301,223,310,232,316,247,320,269,321,269,331,116,331,116,321,138,320,152,317,161,311,165,302,166,290,166,280,124,276,84,263,50,241,27,209,19,165,24,128,41,97,69,72,107,57,158,51,166,51,166,37,164,27,158,19,148,14,134,10,116,9,116,0,269,0,269,9,248,11,233,14,224,19,219,27,218,38,218,51,230,51,265,56,302,69,334,91,357,123,366,165,357,209,333,241,300,263,260,276,218,280,16383,16383,217,262,251,256,278,240,296,216,307,188,311,159,305,128,291,103,270,85,244,74,217,70,16383,16383,167,70,135,75,108,88,89,107,78,132,74,159,78,189,91,216,111,240,136,256,167,262,352,0,352,9,337,12,326,16,316,22,306,32,296,46,200,184,272,272,289,292,303,305,316,314,330,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,262,301,260,296,256,290,250,282,243,272,187,202,165,234,151,255,139,272,130,286,125,297,123,306,124,312,127,316,132,319,139,320,147,320,161,321,161,331,11,331,11,321,28,319,43,312,58,299,77,276,102,242,155,164,77,66,57,42,42,26,30,17,18,12,4,9,4,0,121,0,121,9,105,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,99,57,109,70,169,145,216,74,225,60,232,48,238,38,241,31,242,25,241,20, +269,321,269,321,247,320,247,320,269,321,269,331,247,320,269,331,232,316,232,316,269,331,166,290,232,316,166,290,223,310,223,310,166,290,167,262,219,27,167,262,167,70,219,27,167,70,224,19,224,19,167,70,166,51,224,19,166,51,166,37,218,38,217,70,167,262,167,262,217,70,217,262,167,262,217,262,218,290,218,290,217,262,218,280,219,301,223,310,167,262,219,301,167,262,218,290,166,290,269,331,165,302,269,331,116,331,138,320,269,331,138,320,152,317,269,331,152,317,161,311,269,331,161,311,165,302,91,216,111,240,124,276,124,276,111,240,136,256,124,276,136,256,166,280,166,280,136,256,167,262,166,280,167,262,166,290,84,263,50,241,74,159,84,263,74,159,78,189,84,263,78,189,91,216,84,263,91,216,124,276,19,165,24,128,27,209,27,209,24,128,41,97,27,209,41,97,50,241,50,241,41,97,69,72,50,241,69,72,74,159,334,91,311,159,305,128,334,91,305,128,302,69,302,69,305,128,291,103,302,69,291,103,270,85,307,188,311,159,333,241,333,241,311,159,334,91,333,241,334,91,357,209,357,209,334,91,357,123,357,209,357,123,366,165,300,263,260,276,278,240,300,263,278,240,296,216,300,263,296,216,307,188,300,263,307,188,333,241,251,256,278,240,260,276,251,256,260,276,218,280,251,256,218,280,217,262,218,51,230,51,244,74,244,74,230,51,265,56,244,74,265,56,270,85,270,85,265,56,302,69,218,38,167,262,219,27,218,38,218,51,217,70,269,0,269,9,248,11,269,0,248,11,233,14,269,0,233,14,166,37,269,0,166,37,164,27,269,0,164,27,158,19,269,0,158,19,148,14,269,0,148,14,134,10,269,0,134,10,116,9,269,0,116,9,116,0,158,51,166,51,167,70,158,51,167,70,135,75,158,51,135,75,108,88,158,51,108,88,107,57,74,159,69,72,78,132,78,132,69,72,107,57,78,132,107,57,89,107,89,107,107,57,108,88,166,37,233,14,224,19,217,70,218,51,244,74,138,320,116,331,116,321, +352,0,352,9,337,12,326,16,316,22,306,32,296,46,200,184,272,272,289,292,303,305,316,314,330,319,348,321,348,331,229,331,229,321,243,320,253,319,259,316,262,311,263,305,262,301,260,296,256,290,250,282,243,272,187,202,165,234,151,255,139,272,130,286,125,297,123,306,124,312,127,316,132,319,139,320,147,320,161,321,161,331,11,331,11,321,28,319,43,312,58,299,77,276,102,242,155,164,77,66,57,42,42,26,30,17,18,12,4,9,4,0,121,0,121,9,105,11,95,13,88,17,84,21,83,26,84,31,87,38,92,46,99,57,109,70,169,145,216,74,225,60,232,48,238,38,241,31,242,25,241,20,237,16,232,14,225,12,217,11,204,9,204,0,348,-75,348,9,329,12,316,16,308,24,305,37,304,57,304,292,308,306,316,315,329,319,348,321,348,331,209,331,209,321,228,319,240,315,248,306,251,293,252,275,252,28,250,23,247,21,242,19,115,19,110,21,107,23,105,28,105,269,106,290,109,305,117,314,129,319,149,321,149,331,9,331,9,321,28,319,41,314,49,306,53,294,54,276,54,57,53,37,49,24,41,16,28,12,9,9,9,0,284,0,299,-5,312,-15,323,-29,331,-49,332,-54,333,-60,335,-67,335,-72,336,-75,320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170, +30,17,121,0,42,26,42,26,121,0,88,17,42,26,88,17,57,42,57,42,88,17,84,21,57,42,84,21,83,26,83,26,84,31,77,66,77,66,84,31,87,38,77,66,87,38,155,164,155,164,87,38,92,46,155,164,92,46,99,57,102,242,155,164,125,297,102,242,125,297,123,306,123,306,124,312,102,242,155,164,99,57,109,70,109,70,169,145,155,164,155,164,169,145,165,234,155,164,165,234,151,255,77,66,57,42,83,26,161,331,11,331,28,319,161,331,28,319,43,312,161,331,43,312,58,299,161,331,58,299,132,319,161,331,132,319,139,320,161,331,139,320,147,320,161,331,147,320,161,321,132,319,58,299,127,316,127,316,58,299,77,276,127,316,77,276,124,312,124,312,77,276,102,242,260,296,256,290,272,272,272,272,256,290,250,282,272,272,250,282,243,272,243,272,187,202,200,184,200,184,187,202,216,74,200,184,216,74,296,46,296,46,216,74,225,60,296,46,225,60,232,48,348,331,229,331,243,320,348,331,243,320,253,319,348,331,253,319,259,316,348,331,259,316,262,311,348,331,262,311,263,305,348,331,263,305,316,314,348,331,316,314,330,319,348,331,330,319,348,321,263,305,272,272,289,292,263,305,289,292,303,305,263,305,303,305,316,314,262,301,260,296,272,272,262,301,272,272,263,305,243,272,200,184,272,272,237,16,232,14,352,0,352,0,232,14,225,12,352,0,225,12,217,11,242,25,352,0,326,16,242,25,326,16,316,22,242,25,316,22,306,32,242,25,306,32,296,46,242,25,296,46,241,31,296,46,232,48,238,38,296,46,238,38,241,31,187,202,165,234,169,145,187,202,169,145,216,74,337,12,326,16,352,0,337,12,352,0,352,9,241,20,237,16,352,0,241,20,352,0,242,25,204,9,204,0,352,0,204,9,352,0,217,11,155,164,151,255,139,272,155,164,139,272,130,286,155,164,130,286,125,297,121,0,121,9,105,11,121,0,105,11,95,13,121,0,95,13,88,17,18,12,4,9,121,0,18,12,121,0,30,17,121,0,4,9,4,0,243,320,229,331,229,321,28,319,11,331,11,321, +348,-75,348,9,329,12,316,16,308,24,305,37,304,57,304,292,308,306,316,315,329,319,348,321,348,331,209,331,209,321,228,319,240,315,248,306,251,293,252,275,252,28,250,23,247,21,242,19,115,19,110,21,107,23,105,28,105,269,106,290,109,305,117,314,129,319,149,321,149,331,9,331,9,321,28,319,41,314,49,306,53,294,54,276,54,57,53,37,49,24,41,16,28,12,9,9,9,0,284,0,299,-5,312,-15,323,-29,331,-49,332,-54,333,-60,335,-67,335,-72,336,-75,320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,204,166,190,161,173,158,155,156,132,158,116,165,105,176,99,193,97,216,97,273,98,294,101,307,109,315,121,319,139,321,139,331,2,331,2,321,21,319,34,315,41,307,45,293,46,273,46,211,50,178,62,155,80,142,104,136,133,134,157,136,178,140,197,145,212,152,224,157,224,57,223,37, +49,24,41,16,268,0,268,0,41,16,28,12,268,0,28,12,9,9,149,331,9,331,28,319,149,331,28,319,41,314,149,331,41,314,49,306,149,331,49,306,53,294,149,331,53,294,117,314,149,331,117,314,129,319,149,331,129,319,149,321,110,21,107,23,54,57,54,57,107,23,105,28,54,57,105,28,54,276,54,276,105,28,105,34,54,276,105,34,105,269,54,276,105,269,106,290,54,276,106,290,109,305,54,276,109,305,117,314,54,276,117,314,53,294,329,319,348,321,348,331,329,319,348,331,316,315,316,315,348,331,251,293,316,315,251,293,252,275,268,0,252,275,252,35,268,0,252,35,252,28,316,16,308,24,312,-15,312,-15,308,24,305,37,312,-15,305,37,299,-5,299,-5,305,37,304,57,299,-5,304,57,304,270,252,275,268,0,304,292,304,292,268,0,284,0,304,292,284,0,304,270,304,270,284,0,299,-5,308,306,316,315,252,275,308,306,252,275,304,292,348,331,209,331,228,319,348,331,228,319,240,315,348,331,240,315,248,306,348,331,248,306,251,293,333,-60,348,9,332,-54,332,-54,348,9,331,-49,323,-29,331,-49,329,12,323,-29,329,12,316,16,348,9,333,-60,335,-67,348,9,335,-67,335,-72,348,9,335,-72,336,-75,348,9,336,-75,348,-75,348,9,329,12,331,-49,268,0,252,28,250,23,268,0,250,23,247,21,268,0,247,21,242,19,268,0,242,19,235,19,268,0,235,19,123,19,268,0,123,19,115,19,268,0,115,19,49,24,110,21,54,57,53,37,110,21,53,37,49,24,110,21,49,24,115,19,268,0,9,9,9,0,316,16,312,-15,323,-29,228,319,209,331,209,321,28,319,9,331,9,321, +320,0,320,9,301,12,288,16,280,24,276,37,275,57,275,269,276,291,280,306,288,315,301,319,320,321,320,331,186,331,186,321,204,319,214,316,221,309,223,299,224,283,224,174,216,170,204,166,190,161,173,158,155,156,132,158,116,165,105,176,99,193,97,216,97,273,98,294,101,307,109,315,121,319,139,321,139,331,2,331,2,321,21,319,34,315,41,307,45,293,46,273,46,211,50,178,62,155,80,142,104,136,133,134,157,136,178,140,197,145,212,152,224,157,224,57,223,37,219,24,211,16,199,12,180,9,180,0,483,0,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276, +139,321,139,321,121,319,121,319,139,321,139,331,121,319,139,331,109,315,109,315,139,331,45,293,109,315,45,293,46,273,50,178,46,273,46,211,132,158,116,165,133,134,133,134,116,165,105,176,133,134,105,176,104,136,104,136,105,176,99,193,104,136,99,193,80,142,80,142,99,193,97,216,80,142,97,216,97,273,46,273,50,178,101,307,101,307,50,178,62,155,101,307,62,155,98,294,98,294,62,155,80,142,98,294,80,142,97,273,139,331,2,331,21,319,139,331,21,319,34,315,139,331,34,315,41,307,139,331,41,307,45,293,224,283,224,174,224,157,224,157,224,174,216,170,224,157,216,170,212,152,212,152,216,170,204,166,212,152,204,166,197,145,197,145,204,166,190,161,197,145,190,161,178,140,178,140,190,161,173,158,178,140,173,158,157,136,157,136,173,158,155,156,133,134,157,136,155,156,133,134,155,156,132,158,320,331,186,331,204,319,320,331,204,319,214,316,320,331,214,316,221,309,320,331,221,309,223,299,320,331,223,299,224,283,320,331,224,283,288,315,320,331,288,315,301,319,320,331,301,319,320,321,275,57,275,269,224,157,224,157,275,269,276,291,224,157,276,291,280,306,224,283,224,157,280,306,224,283,280,306,288,315,320,0,320,9,301,12,320,0,301,12,288,16,320,0,288,16,223,37,320,0,223,37,219,24,320,0,219,24,211,16,320,0,211,16,199,12,320,0,199,12,180,9,320,0,180,9,180,0,224,157,280,24,276,37,224,157,276,37,275,57,224,57,223,37,288,16,224,57,288,16,280,24,224,57,280,24,224,157,204,319,186,331,186,321,21,319,2,331,2,321,109,315,46,273,101,307, +483,0,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,483,-75,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0, +59,57,58,37,115,21,115,21,58,37,54,24,115,21,54,24,120,19,120,19,54,24,46,16,120,19,46,16,483,0,483,0,46,16,33,12,483,0,33,12,15,9,147,331,15,331,34,319,147,331,34,319,46,314,147,331,46,314,54,306,147,331,54,306,58,294,147,331,58,294,120,315,147,331,120,315,131,320,147,331,131,320,147,321,115,21,112,23,59,57,59,57,112,23,110,28,59,57,110,28,59,276,59,276,110,28,110,34,59,276,110,34,110,269,59,276,110,269,111,291,59,276,111,291,114,306,59,276,114,306,120,315,59,276,120,315,58,294,296,319,315,321,315,331,296,319,315,331,283,314,283,314,315,331,220,294,283,314,220,294,220,276,272,27,220,276,220,35,272,27,220,35,274,23,274,23,220,35,277,21,272,33,272,269,220,276,220,276,272,269,273,290,220,276,273,290,276,305,315,331,183,331,200,319,315,331,200,319,210,314,315,331,210,314,217,306,315,331,217,306,220,294,463,319,483,321,483,331,463,319,483,331,450,315,450,315,483,331,386,293,450,315,386,293,387,275,439,37,387,275,387,35,439,37,387,35,443,24,443,24,387,35,450,16,438,57,438,270,387,275,387,275,438,270,439,292,387,275,439,292,443,306,483,331,343,331,344,321,483,331,344,321,362,319,483,331,362,319,375,315,483,331,375,315,383,306,483,331,383,306,386,293,483,0,483,9,463,12,483,0,463,12,450,16,483,0,450,16,387,35,483,0,387,35,387,28,483,0,387,28,385,23,483,0,385,23,382,21,483,0,382,21,377,19,483,0,377,19,371,19,483,0,371,19,289,19,483,0,289,19,282,19,483,0,282,19,218,23,483,0,218,23,215,21,483,0,215,21,210,19,483,0,210,19,203,19,483,0,203,19,127,19,483,0,127,19,120,19,282,19,277,21,220,35,282,19,220,35,220,28,282,19,220,28,218,23,483,0,15,9,15,0,220,276,272,27,272,33,387,275,439,37,438,57,450,315,387,275,443,306,200,319,183,331,183,321,283,314,220,276,276,305,34,319,15,331,15,321, +483,-75,483,9,463,12,450,16,443,24,439,37,438,57,438,270,439,292,443,306,450,315,463,319,483,321,483,331,343,331,344,321,362,319,375,315,383,306,386,293,387,275,387,28,385,23,382,21,377,19,282,19,277,21,274,23,272,27,272,269,273,290,276,305,283,314,296,319,315,321,315,331,183,331,183,321,200,319,210,314,217,306,220,294,220,28,218,23,215,21,210,19,120,19,115,21,112,23,110,28,110,269,111,291,114,306,120,315,131,320,147,321,147,331,15,331,15,321,34,319,46,314,54,306,58,294,59,276,59,57,58,37,54,24,46,16,33,12,15,9,15,0,419,0,433,-5,446,-15,457,-29,465,-49,467,-55,468,-61,469,-68,470,-73,470,-75,171,183,171,274,172,293,177,307,186,315,200,319,219,321,219,331,10,331,7,246,18,246,25,274,33,293,45,304,63,309,90,310,120,310,120,56,119,37,114,24,106,16,92,11,72,9,72,0,231,0,271,4,305,15,330,34,346,59,352,91,345,126,327,153,299,170,262,180,219,183,16383,16383,171,163,204,163,231,161,256,154,276,141,289,120,294,89,289,59,275,39,253,27,226,21,195,19,185,20,178,22,174,26,171,33,171,41,432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0, +59,57,58,37,115,21,115,21,58,37,54,24,115,21,54,24,120,19,120,19,54,24,46,16,120,19,46,16,402,0,402,0,46,16,33,12,402,0,33,12,15,9,147,331,15,331,34,319,147,331,34,319,46,314,147,331,46,314,54,306,147,331,54,306,58,294,147,331,58,294,120,315,147,331,120,315,131,320,147,331,131,320,147,321,115,21,112,23,59,57,59,57,112,23,110,28,59,57,110,28,59,276,59,276,110,28,110,34,59,276,110,34,110,269,59,276,110,269,111,291,59,276,111,291,114,306,59,276,114,306,120,315,59,276,120,315,58,294,296,319,315,321,315,331,296,319,315,331,283,314,283,314,315,331,220,294,283,314,220,294,220,276,272,27,220,276,220,35,272,27,220,35,274,23,274,23,220,35,277,21,272,33,272,269,220,276,220,276,272,269,273,290,220,276,273,290,276,305,315,331,183,331,200,319,315,331,200,319,210,314,315,331,210,314,217,306,315,331,217,306,220,294,463,319,483,321,483,331,463,319,483,331,450,315,450,315,483,331,386,293,450,315,386,293,387,275,402,0,387,275,387,35,402,0,387,35,387,28,450,16,443,24,446,-15,446,-15,443,24,439,37,446,-15,439,37,433,-5,433,-5,439,37,438,57,433,-5,438,57,438,270,387,275,402,0,439,292,439,292,402,0,419,0,439,292,419,0,438,270,438,270,419,0,433,-5,443,306,450,315,387,275,443,306,387,275,439,292,483,331,343,331,344,321,483,331,344,321,362,319,483,331,362,319,375,315,483,331,375,315,383,306,483,331,383,306,386,293,468,-61,483,9,467,-55,467,-55,483,9,465,-49,457,-29,465,-49,463,12,457,-29,463,12,450,16,483,9,468,-61,469,-68,483,9,469,-68,470,-73,483,9,470,-73,470,-75,483,9,470,-75,483,-75,483,9,463,12,465,-49,402,0,387,28,385,23,402,0,385,23,382,21,402,0,382,21,377,19,402,0,377,19,371,19,402,0,371,19,289,19,402,0,289,19,282,19,402,0,282,19,220,28,402,0,220,28,218,23,402,0,218,23,215,21,402,0,215,21,210,19,402,0,210,19,203,19,402,0,203,19,127,19,402,0,127,19,120,19,220,35,220,28,282,19,220,35,282,19,277,21,402,0,15,9,15,0,220,276,272,27,272,33,450,16,446,-15,457,-29,200,319,183,331,183,321,283,314,220,276,276,305,34,319,15,331,15,321, +171,183,171,274,172,293,177,307,186,315,200,319,219,321,219,331,10,331,7,246,18,246,25,274,33,293,45,304,63,309,90,310,120,310,120,56,119,37,114,24,106,16,92,11,72,9,72,0,231,0,271,4,305,15,330,34,346,59,352,91,345,126,327,153,299,170,262,180,219,183,16383,16383,171,163,204,163,231,161,256,154,276,141,289,120,294,89,289,59,275,39,253,27,226,21,195,19,185,20,178,22,174,26,171,33,171,41,432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,16383,16383,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4, +114,24,106,16,231,0,231,0,106,16,92,11,231,0,92,11,72,9,177,307,186,315,120,310,120,310,186,315,219,331,120,310,219,331,90,310,63,309,90,310,219,331,63,309,219,331,10,331,200,319,219,321,219,331,200,319,219,331,186,315,120,310,171,33,171,41,171,183,171,163,204,163,171,183,204,163,219,183,219,183,204,163,231,161,219,183,231,161,262,180,262,180,231,161,256,154,262,180,256,154,276,141,120,310,171,41,171,274,120,310,171,274,172,293,120,310,172,293,177,307,10,331,7,246,18,246,10,331,18,246,25,274,10,331,25,274,33,293,10,331,33,293,45,304,10,331,45,304,63,309,294,89,289,59,305,15,305,15,289,59,275,39,305,15,275,39,271,4,271,4,275,39,253,27,271,4,253,27,231,0,231,0,253,27,226,21,231,0,226,21,195,19,195,19,185,20,231,0,231,0,185,20,178,22,231,0,178,22,119,37,119,37,178,22,120,56,299,170,294,89,305,15,299,170,305,15,327,153,327,153,305,15,330,34,327,153,330,34,345,126,345,126,330,34,346,59,345,126,346,59,352,91,299,170,262,180,276,141,299,170,276,141,289,120,299,170,289,120,294,89,120,56,178,22,174,26,120,56,174,26,171,33,120,56,171,33,120,310,231,0,72,9,72,0,114,24,231,0,119,37, +432,0,432,9,414,12,401,17,393,25,389,38,388,57,388,274,389,294,393,307,401,315,414,319,432,321,432,331,292,331,292,321,312,319,325,315,332,307,336,294,337,274,337,61,336,39,333,25,325,16,312,12,292,9,292,0,16383,16383,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,244,15,268,34,284,59,290,91,283,126,265,153,238,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,214,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,243,15,268,34,284,59,289,91,283,126,265,153,237,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,213,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26, +432,321,432,321,414,319,414,319,432,321,432,331,414,319,432,331,401,315,401,315,432,331,336,294,401,315,336,294,337,274,389,38,337,274,337,61,389,38,337,61,393,25,393,25,337,61,401,17,388,57,388,274,337,274,337,274,388,274,389,294,337,274,389,294,393,307,432,331,292,331,312,319,432,331,312,319,325,315,432,331,325,315,332,307,432,331,332,307,336,294,432,0,432,9,414,12,432,0,414,12,401,17,432,0,401,17,336,39,432,0,336,39,333,25,432,0,333,25,325,16,432,0,325,16,312,12,432,0,312,12,292,9,432,0,292,9,292,0,52,24,43,16,170,0,170,0,43,16,30,11,170,0,30,11,9,9,156,331,9,331,30,320,156,331,30,320,44,316,156,331,44,316,52,308,156,331,52,308,56,295,156,331,56,295,123,315,156,331,123,315,137,319,156,331,137,319,156,321,57,275,109,33,108,41,108,183,108,163,142,163,108,183,142,163,158,183,158,183,142,163,170,161,158,183,170,161,201,180,201,180,170,161,194,154,201,180,194,154,214,141,57,275,108,41,108,274,57,275,108,274,110,293,57,275,110,293,115,307,57,275,115,307,123,315,57,275,123,315,56,295,232,89,227,59,244,15,244,15,227,59,214,39,244,15,214,39,210,4,210,4,214,39,193,27,210,4,193,27,170,0,170,0,193,27,166,21,170,0,166,21,134,19,134,19,123,20,170,0,170,0,123,20,115,22,170,0,115,22,56,37,56,37,115,22,57,56,238,170,232,89,244,15,238,170,244,15,265,153,265,153,244,15,268,34,265,153,268,34,283,126,283,126,268,34,284,59,283,126,284,59,290,91,238,170,201,180,214,141,238,170,214,141,227,120,238,170,227,120,232,89,57,56,115,22,111,26,57,56,111,26,109,33,57,56,109,33,57,275,170,0,9,9,9,0,52,24,170,0,56,37,30,320,9,331,9,321,336,39,401,17,337,61,337,274,389,38,388,57,312,319,292,331,292,321,401,315,337,274,393,307, +108,183,108,274,110,293,115,307,123,315,137,319,156,321,156,331,9,331,9,321,30,320,44,316,52,308,56,295,57,275,57,56,56,37,52,24,43,16,30,11,9,9,9,0,170,0,210,4,243,15,268,34,284,59,289,91,283,126,265,153,237,170,201,180,158,183,16383,16383,108,163,142,163,170,161,194,154,214,141,227,120,232,89,227,59,213,39,193,27,166,21,134,19,123,20,115,22,111,26,109,33,108,41,26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,158,18,131,15,107,17,86,23,65,32,45,46,25,65,15,55,33,33,55,16,80,3,109,-4,141,-6,168,-4,194,0,218,9,240,22,258,37,275,57,288,79,298,104,304,131, +52,24,43,16,170,0,170,0,43,16,30,11,170,0,30,11,9,9,156,331,9,331,30,320,156,331,30,320,44,316,156,331,44,316,52,308,156,331,52,308,56,295,156,331,56,295,123,315,156,331,123,315,137,319,156,331,137,319,156,321,57,275,109,33,108,41,108,183,108,163,142,163,108,183,142,163,158,183,158,183,142,163,170,161,158,183,170,161,201,180,201,180,170,161,194,154,201,180,194,154,214,141,57,275,108,41,108,274,57,275,108,274,110,293,57,275,110,293,115,307,57,275,115,307,123,315,57,275,123,315,56,295,57,56,56,37,115,22,115,22,56,37,170,0,115,22,170,0,123,20,123,20,170,0,134,19,166,21,134,19,170,0,166,21,170,0,193,27,193,27,170,0,210,4,193,27,210,4,213,39,213,39,210,4,243,15,213,39,243,15,227,59,227,59,243,15,232,89,237,170,232,89,243,15,237,170,243,15,265,153,265,153,243,15,268,34,265,153,268,34,283,126,283,126,268,34,284,59,283,126,284,59,289,91,237,170,201,180,214,141,237,170,214,141,227,120,237,170,227,120,232,89,57,56,115,22,111,26,57,56,111,26,109,33,57,56,109,33,57,275,170,0,9,9,9,0,52,24,170,0,56,37,30,320,9,331,9,321, +26,338,23,224,36,224,39,239,42,252,46,263,51,272,57,280,71,293,85,304,101,311,118,316,136,318,173,312,203,293,226,265,241,228,248,184,103,184,103,161,248,161,248,142,246,124,242,108,237,92,231,78,218,57,201,39,181,26,158,18,131,15,107,17,86,23,65,32,45,46,25,65,15,55,33,33,55,16,80,3,109,-4,141,-6,168,-4,194,0,218,9,240,22,258,37,275,57,288,79,298,104,304,131,306,160,305,188,299,215,290,240,278,263,263,284,244,304,222,319,198,330,173,336,147,338,136,338,124,337,113,336,101,333,90,330,83,328,75,326,61,322,55,321,50,322,45,324,41,328,38,332,36,338,105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,149,157,157,102,177,57,207,22,245,0,291,-6,337,1,376,24,405,60,425,108,431,166,425,222,406,269,377,306,338,330,291,338,245,331,207,310,178,276,158,232,149,180,16383,16383,377,169,376,134,373,103,367,76,359,53,347,35,337,26,327,19,315,15,303,12,291,11,279,12,268,15,257,19,247,25,237,33,224,52,214,75,208,102,204,132,203,166,204,194,207,222,211,247, +36,338,36,338,38,332,38,332,36,338,39,239,38,332,39,239,41,328,41,328,39,239,42,252,41,328,42,252,45,324,45,324,42,252,46,263,45,324,46,263,50,322,50,322,46,263,51,272,50,322,51,272,55,321,55,321,51,272,57,280,55,321,57,280,61,322,36,224,39,239,36,338,36,224,36,338,26,338,36,224,26,338,23,224,75,326,68,324,71,293,71,293,68,324,61,322,71,293,61,322,57,280,90,330,83,328,85,304,90,330,85,304,101,311,90,330,101,311,101,333,75,326,71,293,85,304,75,326,85,304,83,328,248,142,246,124,258,37,258,37,246,124,242,108,258,37,242,108,240,22,240,22,242,108,237,92,240,22,237,92,231,78,231,78,218,57,218,9,218,9,218,57,201,39,218,9,201,39,194,0,194,0,201,39,181,26,194,0,181,26,168,-4,168,-4,181,26,158,18,168,-4,158,18,141,-6,141,-6,158,18,131,15,131,15,107,17,109,-4,109,-4,107,17,86,23,109,-4,86,23,80,3,80,3,86,23,65,32,80,3,65,32,55,16,55,16,65,32,45,46,55,16,45,46,33,33,33,33,45,46,25,65,33,33,25,65,15,55,136,318,136,338,124,337,136,318,124,337,118,316,136,318,147,338,136,338,118,316,124,337,113,336,118,316,113,336,101,333,118,316,101,333,101,311,306,160,305,188,304,131,304,131,305,188,299,215,304,131,299,215,298,104,298,104,299,215,290,240,298,104,290,240,288,79,288,79,290,240,278,263,288,79,278,263,275,57,275,57,278,263,263,284,275,57,263,284,258,37,258,37,263,284,248,161,258,37,248,161,248,142,263,284,248,184,248,161,248,161,248,184,103,184,244,304,222,319,226,265,244,304,226,265,241,228,244,304,241,228,248,184,244,304,248,184,263,284,203,293,226,265,222,319,203,293,222,319,198,330,203,293,198,330,173,336,203,293,173,336,173,312,173,312,173,336,147,338,173,312,147,338,136,318,231,78,218,9,240,22,141,-6,131,15,109,-4,248,161,103,184,103,161, +105,180,105,274,106,294,110,307,118,315,130,319,149,321,149,331,9,331,9,321,29,319,42,315,50,307,53,294,54,274,54,61,53,39,50,25,42,16,29,12,9,9,9,0,149,0,149,9,130,12,118,17,110,25,106,38,105,56,105,157,149,157,157,102,177,57,207,22,245,0,291,-6,337,1,376,24,405,60,425,108,431,166,425,222,406,269,377,306,338,330,291,338,245,331,207,310,178,276,158,232,149,180,16383,16383,377,169,376,134,373,103,367,76,359,53,347,35,337,26,327,19,315,15,303,12,291,11,279,12,268,15,257,19,247,25,237,33,224,52,214,75,208,102,204,132,203,166,204,194,207,222,211,247,219,269,228,286,239,299,251,308,263,315,276,318,290,320,302,319,313,316,324,311,334,305,343,296,356,279,366,257,372,231,376,201,377,169,309,0,309,9,290,12,277,16,270,25,267,39,267,276,268,294,271,307,278,315,290,319,309,321,309,331,180,331,136,329,98,321,69,306,49,282,42,246,47,216,60,193,81,176,108,164,141,157,49,35,41,26,31,19,22,14,12,11,2,9,2,0,83,0,198,155,216,155,216,56,215,37,211,24,203,16,189,12,169,9,169,0,16383,16383,216,174,186,174,156,177,131,186,113,200,101,219,97,244,99,261,103,276,111,288,121,298,133,305,143,308,153,310,164,311,177,312,190,312,200,311,207,309,212,304,215,296,216,286,223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192, +50,25,42,16,149,0,149,0,42,16,29,12,149,0,29,12,9,9,149,331,9,331,29,319,149,331,29,319,42,315,149,331,42,315,50,307,149,331,50,307,53,294,149,331,53,294,118,315,149,331,118,315,130,319,149,331,130,319,149,321,158,232,149,180,149,157,149,157,149,180,105,180,149,157,105,180,105,157,106,38,105,56,54,274,106,38,54,274,54,61,54,274,105,56,105,274,54,274,105,274,106,294,54,274,106,294,110,307,54,274,110,307,118,315,54,274,118,315,53,294,149,0,149,9,130,12,149,0,130,12,118,17,149,0,118,17,53,39,149,0,53,39,50,25,54,61,53,39,118,17,54,61,118,17,110,25,54,61,110,25,106,38,263,315,291,338,251,308,251,308,291,338,245,331,251,308,245,331,239,299,239,299,245,331,228,286,219,269,228,286,245,331,219,269,245,331,207,310,208,102,207,22,214,75,214,75,207,22,245,0,214,75,245,0,224,52,224,52,245,0,237,33,247,25,237,33,245,0,247,25,245,0,291,-6,338,330,291,338,302,319,302,319,291,338,290,320,276,318,290,320,291,338,276,318,291,338,263,315,207,310,178,276,203,166,207,310,203,166,204,194,207,310,204,194,207,222,207,310,207,222,211,247,207,310,211,247,219,269,208,102,204,132,207,22,207,22,204,132,203,166,268,15,291,-6,279,12,279,12,291,-6,291,11,303,12,291,11,291,-6,303,12,291,-6,337,1,313,316,324,311,338,330,338,330,324,311,334,305,338,330,334,305,343,296,343,296,356,279,377,306,377,306,356,279,366,257,377,306,366,257,372,231,373,103,367,76,376,24,376,24,367,76,359,53,376,24,359,53,347,35,347,35,337,26,376,24,376,24,337,26,337,1,431,166,425,222,425,108,425,108,425,222,406,269,425,108,406,269,405,60,405,60,406,269,377,169,377,306,372,231,376,201,377,306,376,201,377,169,377,306,377,169,406,269,377,306,338,330,343,296,376,134,373,103,376,24,376,134,376,24,405,60,376,134,405,60,377,169,337,1,337,26,327,19,337,1,327,19,315,15,337,1,315,15,303,12,257,19,247,25,291,-6,257,19,291,-6,268,15,149,157,157,102,158,232,158,232,157,102,177,57,158,232,177,57,178,276,178,276,177,57,207,22,178,276,207,22,203,166,338,330,302,319,313,316,149,0,9,9,9,0,29,319,9,331,9,321, +309,0,309,9,290,12,277,16,270,25,267,39,267,276,268,294,271,307,278,315,290,319,309,321,309,331,180,331,136,329,98,321,69,306,49,282,42,246,47,216,60,193,81,176,108,164,141,157,49,35,41,26,31,19,22,14,12,11,2,9,2,0,83,0,198,155,216,155,216,56,215,37,211,24,203,16,189,12,169,9,169,0,16383,16383,216,174,186,174,156,177,131,186,113,200,101,219,97,244,99,261,103,276,111,288,121,298,133,305,143,308,153,310,164,311,177,312,190,312,200,311,207,309,212,304,215,296,216,286,223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,207,83,212,93,215,104,217,117,215,129,210,138,202,144,190,146,173,146,146,116,135,93,126,76,118,63,112,54,105,42,97,33,87, +31,19,22,14,83,0,83,0,22,14,12,11,83,0,12,11,2,9,99,261,103,276,98,321,98,321,103,276,111,288,98,321,111,288,136,329,136,329,111,288,121,298,136,329,121,298,133,305,133,305,143,308,136,329,136,329,143,308,180,331,101,219,97,244,108,164,108,164,97,244,81,176,81,176,97,244,98,321,98,321,97,244,99,261,42,246,47,216,49,282,49,282,47,216,60,193,49,282,60,193,69,306,69,306,60,193,81,176,69,306,81,176,98,321,141,157,83,0,198,155,141,157,198,155,156,177,141,157,156,177,131,186,141,157,131,186,113,200,141,157,113,200,108,164,211,24,203,16,309,0,309,0,203,16,189,12,309,0,189,12,169,9,153,310,164,311,180,331,180,331,164,311,177,312,180,331,177,312,190,312,190,312,200,311,309,331,309,331,200,311,207,309,309,331,207,309,212,304,211,24,309,0,215,37,215,37,309,0,277,16,215,37,277,16,216,56,216,56,277,16,270,25,216,56,270,25,216,155,216,155,270,25,216,174,216,155,216,174,198,155,198,155,216,174,186,174,198,155,186,174,156,177,83,0,141,157,49,35,83,0,49,35,41,26,83,0,41,26,31,19,290,319,309,321,309,331,290,319,309,331,278,315,278,315,309,331,216,286,278,315,216,286,271,307,271,307,216,286,268,294,216,286,267,39,267,61,267,276,268,294,216,286,267,276,216,286,267,61,309,331,212,304,215,296,309,331,215,296,216,286,309,331,180,331,190,312,290,12,277,16,309,0,290,12,309,0,309,9,216,174,270,25,267,39,216,174,267,39,216,286,309,0,169,9,169,0,83,0,2,9,2,0,180,331,143,308,153,310,101,219,108,164,113,200, +223,33,218,29,210,25,206,24,201,23,196,25,192,28,189,35,187,44,186,56,186,152,185,168,184,181,181,191,176,199,170,208,162,215,152,222,140,226,127,229,111,230,98,229,85,227,73,224,63,220,54,215,44,208,37,200,32,192,29,183,28,175,29,167,33,161,37,156,43,153,50,152,57,153,63,156,68,161,71,167,73,172,72,178,72,182,71,185,70,189,70,194,71,201,76,207,83,212,93,215,104,217,117,215,129,210,138,202,144,190,146,173,146,146,116,135,93,126,76,118,63,112,54,105,42,97,33,87,25,75,20,62,18,47,21,29,28,14,39,4,54,-2,71,-4,84,-3,99,0,114,6,130,16,146,31,149,17,153,7,160,0,168,-3,178,-4,188,-3,197,-1,206,2,214,9,223,19,16383,16383,146,65,145,57,144,50,140,44,135,38,128,32,122,29,110,25,103,24,97,24,86,25,76,30,69,38,64,48,63,63,63,71,65,78,68,84,73,91,79,97,88,104,99,111,112,118,128,125,146,132,42,174,47,203,59,230,77,253,100,270,129,278,142,279,169,279,182,280,194,283,210,293,220,306,226,320,229,333,230,343,220,343,217,332,212,325,205,320,195,318,183,317,150,317,94,304,57,269,34,223,23,172,20,127,24,87,36,52,57,22,87,2,127,-4,164,1,195,17,219,43,234,76,239,116,233,154,218,186,195,210,166,225,131,230,111,228,92,223,74,213,57,196,43,173,16383,16383,194,102,192,70,184,44,172,25,155,13,135,9,125,10,115,13,106,18,98,25,91,34,81,51,74,70,69,91,66,113,65,137,67,164,75,186,87,202,102,212,122,216,134,215,144,211,153,206,161,199,169,191,178,177,185,161,190,142,193,122,194,102,153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51, +37,156,43,153,44,208,44,208,43,153,50,152,44,208,50,152,54,215,54,215,50,152,57,153,54,215,57,153,63,220,63,220,57,153,63,156,63,220,63,156,73,224,73,224,63,156,70,194,71,167,70,194,68,161,111,230,104,217,117,215,111,230,117,215,127,229,127,229,117,215,129,210,127,229,129,210,140,226,140,226,129,210,138,202,140,226,138,202,144,190,76,207,83,212,85,227,85,227,83,212,93,215,85,227,93,215,98,229,98,229,93,215,104,217,98,229,104,217,111,230,73,224,70,194,71,201,73,224,71,201,76,207,73,224,76,207,85,227,70,194,63,156,68,161,29,183,29,167,32,192,32,192,29,167,33,161,32,192,33,161,37,200,37,200,33,161,37,156,37,200,37,156,44,208,186,56,186,152,185,168,186,56,185,168,184,181,186,56,184,181,181,191,186,56,181,191,188,-3,192,28,197,-1,196,25,196,25,197,-1,201,23,206,24,201,23,206,2,206,24,206,2,214,9,189,35,187,44,188,-3,189,35,188,-3,197,-1,189,35,197,-1,192,28,178,-4,188,-3,181,191,178,-4,181,191,176,199,178,-4,176,199,170,208,178,-4,170,208,168,-3,162,215,152,222,153,7,162,215,153,7,160,0,162,215,160,0,168,-3,162,215,168,-3,170,208,152,222,140,226,144,190,152,222,144,190,146,173,152,222,146,173,146,132,152,222,146,132,146,31,152,222,146,31,149,17,152,222,149,17,153,7,146,146,146,132,146,173,218,29,214,27,214,9,218,29,214,9,223,19,218,29,223,19,223,33,210,25,206,24,214,9,210,25,214,9,214,27,201,23,197,-1,206,2,146,31,146,132,146,65,146,31,146,65,145,57,146,31,145,57,144,50,146,31,144,50,140,44,146,31,140,44,135,38,146,31,135,38,130,16,130,16,135,38,128,32,128,32,122,29,130,16,130,16,122,29,116,27,130,16,116,27,114,6,114,6,116,27,110,25,114,6,110,25,103,24,99,111,112,118,116,135,116,135,112,118,128,125,116,135,128,125,146,146,146,146,128,125,146,132,65,78,68,84,76,118,76,118,68,84,73,91,76,118,73,91,79,97,79,97,88,104,93,126,93,126,88,104,99,111,93,126,99,111,116,135,93,126,76,118,79,97,72,182,71,185,71,167,72,182,71,167,73,172,72,182,73,172,72,178,70,189,70,194,71,167,70,189,71,167,71,185,63,112,54,105,54,-2,63,112,54,-2,63,63,63,112,63,63,63,71,63,112,63,71,65,78,63,112,65,78,76,118,63,63,54,-2,64,48,64,48,54,-2,71,-4,64,48,71,-4,69,38,69,38,71,-4,76,30,20,62,21,29,25,75,25,75,21,29,28,14,25,75,28,14,33,87,33,87,28,14,39,4,33,87,39,4,42,97,42,97,39,4,54,-2,42,97,54,-2,54,105,84,-3,99,0,86,25,86,25,99,0,97,24,103,24,97,24,99,0,103,24,99,0,114,6,76,30,71,-4,84,-3,76,30,84,-3,86,25,21,29,20,62,18,47,186,56,188,-3,187,44,29,167,29,183,28,175, +42,174,47,203,59,230,77,253,100,270,129,278,142,279,169,279,182,280,194,283,210,293,220,306,226,320,229,333,230,343,220,343,217,332,212,325,205,320,195,318,183,317,150,317,94,304,57,269,34,223,23,172,20,127,24,87,36,52,57,22,87,2,127,-4,164,1,195,17,219,43,234,76,239,116,233,154,218,186,195,210,166,225,131,230,111,228,92,223,74,213,57,196,43,173,16383,16383,194,102,192,70,184,44,172,25,155,13,135,9,125,10,115,13,106,18,98,25,91,34,81,51,74,70,69,91,66,113,65,137,67,164,75,186,87,202,102,212,122,216,134,215,144,211,153,206,161,199,169,191,178,177,185,161,190,142,193,122,194,102,153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,219,63,215,82,206,96,191,107,174,114,153,118,16383,16383,85,195,86,202,88,207,92,209,97,211,103,211,127,209,145,203,156,194,162,182,164,166,161,151,154,139,143,130,128,125,110,123,99,124,92,125,87,128,85,132,85,139,16383,16383,85,97,85,102,87,105,91,108,98,109,127,109,144,105,159,98,170,84,174,62,174,63,170,42,160,28,146,19,127,15,106,14, +169,279,183,317,156,279,156,279,183,317,150,317,156,279,150,317,142,279,142,279,150,317,129,278,100,270,129,278,150,317,100,270,150,317,94,304,229,333,230,343,226,320,226,320,230,343,220,343,226,320,220,343,220,306,220,306,220,343,217,332,220,306,217,332,212,325,210,293,220,306,212,325,210,293,212,325,205,320,210,293,205,320,195,318,210,293,195,318,194,283,169,279,182,280,183,317,183,317,182,280,194,283,183,317,194,283,195,318,42,174,47,203,57,269,57,269,47,203,59,230,57,269,59,230,94,304,94,304,59,230,77,253,94,304,77,253,100,270,42,174,57,269,34,223,42,174,34,223,36,52,42,174,36,52,57,22,42,174,57,22,43,173,24,87,36,52,34,223,24,87,34,223,23,172,24,87,23,172,20,127,74,70,87,2,81,51,81,51,87,2,91,34,98,25,91,34,87,2,98,25,87,2,127,-4,65,137,57,196,66,113,66,113,57,196,57,22,66,113,57,22,69,91,69,91,57,22,87,2,69,91,87,2,74,70,131,230,122,216,134,215,131,230,134,215,166,225,166,225,134,215,144,211,166,225,144,211,153,206,75,186,87,202,92,223,92,223,87,202,102,212,92,223,102,212,111,228,111,228,102,212,122,216,111,228,122,216,131,230,74,213,57,196,67,164,74,213,67,164,75,186,74,213,75,186,92,223,67,164,57,196,65,137,192,70,184,44,195,17,195,17,184,44,172,25,195,17,172,25,164,1,164,1,172,25,155,13,164,1,155,13,135,9,135,9,125,10,127,-4,127,-4,125,10,115,13,127,-4,115,13,106,18,185,161,195,210,178,177,178,177,195,210,169,191,161,199,169,191,166,225,161,199,166,225,153,206,195,210,194,102,195,17,195,210,195,17,218,186,218,186,195,17,219,43,218,186,219,43,233,154,233,154,219,43,234,76,233,154,234,76,239,116,195,210,185,161,190,142,195,210,190,142,193,122,195,210,193,122,194,102,195,210,166,225,169,191,135,9,127,-4,164,1,192,70,195,17,194,102,98,25,127,-4,106,18,43,173,57,22,57,196, +153,118,169,121,183,128,194,137,202,151,205,168,201,188,191,204,174,215,149,222,118,225,12,225,12,218,26,216,35,214,40,209,42,200,43,187,43,39,42,25,40,16,35,11,26,8,12,7,12,0,149,0,161,2,171,4,181,8,190,12,200,19,208,28,214,39,218,51,219,63,215,82,206,96,191,107,174,114,153,118,16383,16383,85,195,86,202,88,207,92,209,97,211,103,211,127,209,145,203,156,194,162,182,164,166,161,151,154,139,143,130,128,125,110,123,99,124,92,125,87,128,85,132,85,139,16383,16383,85,97,85,102,87,105,91,108,98,109,127,109,144,105,159,98,170,84,174,62,174,63,170,42,160,28,146,19,127,15,106,14,98,15,92,17,88,20,85,26,85,34,194,155,191,225,8,225,8,218,22,217,31,215,36,211,39,204,40,194,40,40,39,25,36,16,30,11,21,9,8,7,8,0,113,0,113,7,100,9,91,13,85,18,82,26,81,36,81,194,82,200,83,205,86,208,91,209,98,210,130,208,154,201,170,190,180,175,185,155,219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,206,216,219,218,16383,16383,147,41,146,30,143,23,139,18,133,15,126,14,58,14,64,28,68,43,71,59,73,75,73,190,74,199, +40,16,35,11,137,0,137,0,35,11,26,8,137,0,26,8,12,7,86,202,88,207,43,187,43,187,88,207,92,209,43,187,92,209,118,225,118,225,92,209,97,211,118,225,97,211,103,211,103,211,127,209,118,225,118,225,127,209,149,222,159,98,170,84,174,114,174,114,170,84,174,62,174,114,174,62,174,63,174,63,174,62,181,8,181,8,174,62,171,4,171,4,174,62,170,42,171,4,170,42,161,2,161,2,170,42,160,28,161,2,160,28,149,0,149,0,160,28,146,19,149,0,146,19,137,0,137,0,146,19,127,15,137,0,127,15,106,14,106,14,98,15,137,0,137,0,98,15,92,17,137,0,92,17,42,25,42,25,92,17,43,39,127,109,110,123,109,109,98,109,109,109,99,124,98,109,99,124,92,125,85,139,85,102,85,132,85,132,85,102,87,105,85,132,87,105,87,128,87,128,87,105,91,108,87,128,91,108,92,125,92,125,91,108,98,109,110,123,99,124,109,109,161,151,169,121,164,166,164,166,169,121,174,215,174,215,169,121,183,128,174,215,183,128,191,204,191,204,183,128,194,137,191,204,194,137,201,188,201,188,194,137,202,151,201,188,202,151,205,168,127,209,145,203,149,222,149,222,145,203,156,194,149,222,156,194,174,215,174,215,156,194,162,182,174,215,162,182,164,166,159,98,153,118,144,105,144,105,153,118,154,139,154,139,153,118,169,121,154,139,169,121,161,151,110,123,127,109,128,125,128,125,127,109,144,105,128,125,144,105,143,130,143,130,144,105,154,139,215,82,206,96,208,28,215,82,208,28,214,39,215,82,214,39,218,51,215,82,218,51,219,63,181,8,190,12,191,107,191,107,190,12,200,19,191,107,200,19,206,96,206,96,200,19,208,28,191,107,174,114,174,63,191,107,174,63,181,8,85,26,85,34,43,187,85,26,43,187,43,39,85,26,43,39,88,20,85,195,86,202,43,187,85,195,43,187,85,34,35,214,40,209,118,225,118,225,40,209,42,200,118,225,42,200,43,187,26,216,35,214,118,225,26,216,118,225,12,225,26,216,12,225,12,218,137,0,12,7,12,0,40,16,137,0,42,25,43,39,92,17,88,20,153,118,159,98,174,114,85,102,85,139,85,97, +194,155,191,225,8,225,8,218,22,217,31,215,36,211,39,204,40,194,40,40,39,25,36,16,30,11,21,9,8,7,8,0,113,0,113,7,100,9,91,13,85,18,82,26,81,36,81,194,82,200,83,205,86,208,91,209,98,210,130,208,154,201,170,190,180,175,185,155,219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213, +36,211,39,204,191,225,191,225,39,204,91,209,191,225,91,209,98,210,98,210,130,208,191,225,191,225,130,208,154,201,191,225,154,201,170,190,191,225,170,190,180,175,191,225,180,175,185,155,191,225,185,155,194,155,81,36,81,194,40,194,40,194,81,194,82,200,40,194,82,200,83,205,40,194,83,205,86,208,40,194,86,208,91,209,40,194,91,209,39,204,40,194,82,26,81,36,191,225,8,225,22,217,191,225,22,217,31,215,191,225,31,215,36,211,113,0,113,7,100,9,113,0,100,9,91,13,113,0,91,13,40,40,113,0,40,40,39,25,113,0,39,25,36,16,113,0,36,16,30,11,113,0,30,11,21,9,113,0,21,9,8,7,113,0,8,7,8,0,40,40,91,13,85,18,40,40,85,18,82,26,40,40,82,26,40,194,22,217,8,225,8,218, +219,225,21,225,21,218,34,216,44,212,51,206,55,197,56,183,56,99,55,66,51,40,42,22,28,11,7,7,7,-68,16,-68,26,-37,37,-17,47,-5,58,0,172,0,182,-5,191,-17,200,-37,210,-68,219,-68,219,7,206,9,197,11,192,16,189,25,189,198,192,207,198,213,206,216,219,218,16383,16383,147,41,146,30,143,23,139,18,133,15,126,14,58,14,64,28,68,43,71,59,73,75,73,190,74,199,76,205,80,209,85,210,92,211,135,211,141,209,145,205,146,199,147,190,210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,197,186,192,195,181,207,169,217,156,224,140,228,123,230,88,224,59,207,37,182,24,148,19,108,23,70,35,39,55,15,81,0,114,-4,142,-1,167,9,188,26,205,49,219,79,16383,16383,56,151,61,172,69,190,80,203,93,211,109,214,126,211,139,203,148,191,154,173,158,151,353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47, +34,216,44,212,219,225,219,225,44,212,85,210,219,225,85,210,92,211,219,225,92,211,127,211,219,225,127,211,135,211,126,14,58,14,68,0,126,14,68,0,161,0,126,14,161,0,133,15,147,190,161,0,189,198,189,198,161,0,172,0,189,198,172,0,189,183,189,183,172,0,182,-5,189,183,182,-5,189,41,189,41,182,-5,191,-17,189,41,191,-17,189,25,161,0,147,190,147,41,161,0,147,41,146,30,161,0,146,30,143,23,161,0,143,23,139,18,161,0,139,18,133,15,219,225,135,211,141,209,219,225,141,209,145,205,219,225,145,205,146,199,219,225,146,199,147,190,219,225,147,190,198,213,219,225,198,213,206,216,219,225,206,216,219,218,192,207,198,213,147,190,192,207,147,190,189,198,73,190,74,199,58,14,73,190,58,14,64,28,73,190,64,28,68,43,73,190,68,43,71,59,73,190,71,59,73,75,73,190,73,75,73,89,58,0,68,0,58,14,58,0,58,14,56,183,58,0,56,183,56,99,58,0,56,99,55,66,58,0,55,66,51,40,58,0,51,40,47,-5,58,14,74,199,56,183,56,183,74,199,76,205,56,183,76,205,55,197,55,197,76,205,80,209,55,197,80,209,51,206,51,206,80,209,85,210,51,206,85,210,44,212,21,225,21,218,34,216,21,225,34,216,219,225,219,-68,219,7,210,-68,210,-68,219,7,206,9,210,-68,206,9,200,-37,200,-37,206,9,197,11,200,-37,197,11,192,16,192,16,189,25,191,-17,192,16,191,-17,200,-37,16,-68,26,-37,28,11,28,11,26,-37,37,-17,28,11,37,-17,42,22,42,22,37,-17,47,-5,42,22,47,-5,51,40,7,7,7,-68,16,-68,7,7,16,-68,28,11, +210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176,197,186,192,195,181,207,169,217,156,224,140,228,123,230,88,224,59,207,37,182,24,148,19,108,23,70,35,39,55,15,81,0,114,-4,142,-1,167,9,188,26,205,49,219,79,16383,16383,56,151,61,172,69,190,80,203,93,211,109,214,126,211,139,203,148,191,154,173,158,151,353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,298,58,286,79,275,94,264,105,253,113,240,120,240,121,258,137,269,156,278,172,286,185,297,190,301,189,306,187,318,183,324,182,332,183,338,186,343,191,346,197,347,204,346,211,342,218,336,223,327,227,316,228,306,227,297,224,289,218,282,211,275,201,267,187,259,171,251,156,242,143,233,135,228,132,222,130,215,128, +80,53,66,77,81,0,81,0,66,77,58,106,81,0,58,106,55,15,55,15,58,106,55,137,56,151,55,137,209,137,56,151,209,137,158,151,158,151,209,137,169,217,140,228,123,230,126,211,126,211,123,230,109,214,93,211,109,214,123,230,93,211,123,230,88,224,156,224,140,228,148,191,156,224,148,191,154,173,156,224,154,173,158,151,156,224,158,151,169,217,140,228,126,211,139,203,140,228,139,203,148,191,56,151,61,172,59,207,59,207,61,172,69,190,59,207,69,190,88,224,88,224,69,190,80,203,88,224,80,203,93,211,37,182,24,148,35,39,37,182,35,39,55,15,37,182,55,15,55,137,37,182,55,137,56,151,37,182,56,151,59,207,24,148,19,108,23,70,24,148,23,70,35,39,81,0,114,-4,102,37,102,37,114,-4,132,31,150,33,132,31,142,-1,150,33,142,-1,167,9,209,137,208,152,205,165,209,137,205,165,202,176,209,137,202,176,197,186,209,137,197,186,192,195,209,137,192,195,181,207,209,137,181,207,169,217,219,79,210,82,205,49,205,49,210,82,196,63,205,49,196,63,188,26,188,26,196,63,182,48,188,26,182,48,167,9,167,9,182,48,167,39,167,9,167,39,150,33,132,31,114,-4,142,-1,80,53,81,0,102,37, +353,0,353,7,347,8,341,10,331,14,327,17,323,21,317,28,311,37,304,47,298,58,286,79,275,94,264,105,253,113,240,120,240,121,258,137,269,156,278,172,286,185,297,190,301,189,306,187,318,183,324,182,332,183,338,186,343,191,346,197,347,204,346,211,342,218,336,223,327,227,316,228,306,227,297,224,289,218,282,211,275,201,267,187,259,171,251,156,242,143,233,135,228,132,222,130,215,128,208,127,200,127,200,190,201,199,204,207,210,212,219,216,232,218,232,225,128,225,128,218,140,216,149,214,154,209,158,201,158,127,151,127,144,128,138,129,132,132,127,135,117,145,108,157,101,170,88,196,82,207,75,216,67,223,56,227,44,228,34,227,26,224,20,219,15,212,14,204,15,197,18,191,23,186,29,183,36,182,43,183,50,185,60,189,65,190,74,185,80,172,87,155,100,137,121,121,121,120,107,114,95,107,85,95,74,79,62,57,63,57,56,46,50,36,44,28,38,21,33,17,29,14,25,12,19,10,14,8,7,7,7,0,73,0,124,83,133,96,139,104,145,109,151,112,158,113,158,25,155,18,151,13,145,10,137,8,126,7,126,0,234,0,234,7,214,9,207,12,203,17,201,24,200,33,200,113,209,111,216,108,222,104,228,95,237,82,287,0,114,121,130,126,146,134,158,146,167,160,170,177,168,188,164,198,158,207,149,215,139,221,121,227,111,229,99,230,80,230,75,229,69,228,64,226,57,224,49,222,46,220,42,219,35,219,29,223,27,226,26,230,20,230,16,150,25,150,30,172,38,190,50,204,65,213,85,216,98,214,110,209,119,200,125,188,127,172,126,163,123,155,118,147,112,140,104,135,97,132,89,129,81,128,72,127,60,127,60,113,86,111,106,106,120,96,129,82,132,62,130,47,124,34,114,23,99,15,79,13,65,14,52,18,40,24,28,33,14,46,7,39,19,23,32,11,46,2,64,-2,85,-4,113,-2,125,1,137,5,147,12,157,20,166,29,173,40,177,52,179,65,175,84,165,99,151,110,133,117,114,121,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340, +25,12,19,10,73,0,73,0,19,10,14,8,73,0,14,8,7,7,50,36,44,28,73,0,73,0,44,28,38,21,73,0,38,21,33,17,33,17,29,14,73,0,73,0,29,14,25,12,95,107,85,95,124,83,124,83,85,95,74,79,124,83,74,79,73,0,73,0,74,79,62,57,73,0,62,57,56,46,56,46,62,57,63,57,67,223,65,190,74,185,67,223,74,185,75,216,75,216,74,185,80,172,75,216,80,172,82,207,82,207,80,172,87,155,82,207,87,155,88,196,88,196,87,155,100,137,88,196,100,137,94,184,94,184,100,137,101,170,50,185,55,187,56,227,56,227,55,187,60,189,56,227,60,189,67,223,67,223,60,189,65,190,44,228,34,227,36,182,44,228,36,182,43,183,44,228,43,183,50,185,44,228,50,185,56,227,14,204,15,197,15,212,15,212,15,197,18,191,15,212,18,191,20,219,20,219,18,191,23,186,20,219,23,186,26,224,26,224,23,186,29,183,26,224,29,183,34,227,34,227,29,183,36,182,127,135,121,121,124,83,127,135,124,83,133,96,127,135,117,145,121,121,121,121,117,145,108,157,121,121,108,157,101,170,121,121,101,170,100,137,155,18,151,13,234,0,234,0,151,13,145,10,234,0,145,10,137,8,137,8,126,7,234,0,234,0,126,7,126,0,234,0,234,7,224,8,234,0,224,8,214,9,234,0,214,9,207,12,234,0,207,12,158,33,234,0,158,33,158,25,234,0,158,25,155,18,201,24,200,33,158,113,201,24,158,113,203,17,203,17,158,113,158,33,158,113,200,33,200,127,158,113,200,127,200,190,158,113,200,190,201,199,158,113,201,199,204,207,158,113,204,207,158,189,158,113,158,189,158,127,215,128,208,127,209,111,209,111,208,127,200,127,232,225,128,225,140,216,232,225,140,216,149,214,232,225,149,214,154,209,232,225,154,209,158,201,232,225,158,201,158,189,232,225,158,189,210,212,232,225,210,212,219,216,232,225,219,216,232,218,264,105,253,113,287,0,287,0,253,113,240,120,287,0,240,120,237,82,237,82,240,120,240,121,237,82,240,121,233,135,237,82,233,135,228,95,228,95,233,135,228,132,228,95,228,132,222,104,222,104,228,132,222,130,222,104,222,130,216,108,216,108,222,130,215,128,216,108,215,128,209,111,317,28,311,37,287,0,287,0,311,37,304,47,287,0,304,47,298,58,297,224,297,190,301,189,297,224,301,189,306,227,306,227,301,189,306,187,306,227,306,187,316,228,316,228,306,187,312,185,316,228,312,185,318,183,297,190,289,218,286,185,286,185,289,218,282,211,286,185,282,211,278,172,278,172,282,211,275,201,278,172,275,201,269,156,269,156,275,201,267,187,269,156,267,187,259,171,258,137,269,156,259,171,258,137,259,171,251,156,258,137,251,156,242,143,258,137,242,143,240,121,242,143,233,135,240,121,318,183,324,182,327,227,327,227,324,182,332,183,327,227,332,183,336,223,336,223,332,183,338,186,336,223,338,186,342,218,342,218,338,186,343,191,342,218,343,191,346,211,346,211,343,191,346,197,346,211,346,197,347,204,317,28,287,0,323,21,323,21,287,0,327,17,331,14,327,17,287,0,331,14,287,0,353,0,353,0,353,7,347,8,353,0,347,8,341,10,353,0,341,10,336,12,353,0,336,12,331,14,287,0,298,58,286,79,287,0,286,79,275,94,287,0,275,94,264,105,145,109,151,112,151,127,151,127,151,112,158,113,151,127,158,113,158,127,132,132,127,135,133,96,132,132,133,96,138,129,138,129,133,96,139,104,138,129,139,104,144,128,144,128,139,104,145,109,144,128,145,109,151,127,124,83,121,121,121,120,124,83,121,120,107,114,124,83,107,114,95,107,73,0,7,7,7,0,50,36,73,0,56,46,316,228,318,183,327,227,297,190,297,224,289,218,200,127,200,113,209,111,140,216,128,225,128,218,210,212,158,189,204,207,158,33,207,12,203,17, +114,121,130,126,146,134,158,146,167,160,170,177,168,188,164,198,158,207,149,215,139,221,121,227,111,229,99,230,80,230,75,229,69,228,64,226,57,224,49,222,46,220,42,219,35,219,29,223,27,226,26,230,20,230,16,150,25,150,30,172,38,190,50,204,65,213,85,216,98,214,110,209,119,200,125,188,127,172,126,163,123,155,118,147,112,140,104,135,97,132,89,129,81,128,72,127,60,127,60,113,86,111,106,106,120,96,129,82,132,62,130,47,124,34,114,23,99,15,79,13,65,14,52,18,40,24,28,33,14,46,7,39,19,23,32,11,46,2,64,-2,85,-4,113,-2,125,1,137,5,147,12,157,20,166,29,173,40,177,52,179,65,175,84,165,99,151,110,133,117,114,121,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332, +26,230,20,230,25,150,26,230,25,150,30,172,26,230,30,172,27,226,49,222,46,220,50,204,50,204,46,220,42,219,50,204,42,219,39,219,39,219,35,219,38,190,38,190,35,219,32,221,38,190,32,221,30,172,30,172,32,221,29,223,30,172,29,223,27,226,64,-2,85,-4,65,14,65,14,85,-4,79,13,99,15,79,13,85,-4,99,15,85,-4,99,-3,85,216,80,230,75,229,85,216,75,229,69,228,85,216,69,228,65,213,85,216,86,230,80,230,65,213,69,228,64,226,65,213,64,226,57,224,65,213,57,224,53,223,65,213,53,223,50,204,39,219,38,190,50,204,81,128,86,111,89,129,89,129,86,111,106,106,89,129,106,106,97,132,97,132,106,106,104,135,112,140,104,135,106,106,112,140,106,106,114,121,114,121,106,106,120,96,114,121,120,96,133,117,133,117,120,96,129,82,133,117,129,82,132,62,86,230,98,214,99,230,99,230,98,214,110,209,99,230,110,209,111,229,111,229,110,209,119,200,111,229,119,200,121,227,121,227,119,200,125,188,121,227,125,188,130,224,130,224,125,188,127,172,130,126,127,172,126,163,126,163,123,155,130,126,130,126,123,155,118,147,130,126,118,147,114,121,114,121,118,147,112,140,170,177,168,188,167,160,167,160,168,188,164,198,167,160,164,198,158,146,158,146,164,198,158,207,158,146,158,207,149,215,146,134,158,146,149,215,146,134,149,215,139,221,146,134,139,221,130,224,146,134,130,224,130,126,85,216,98,214,86,230,133,117,132,62,137,5,133,117,137,5,151,110,151,110,137,5,147,12,151,110,147,12,157,20,175,84,165,99,166,29,175,84,166,29,173,40,175,84,173,40,177,52,175,84,177,52,179,65,165,99,151,110,157,20,165,99,157,20,166,29,130,47,124,34,125,1,130,47,125,1,137,5,130,47,137,5,132,62,114,23,99,15,99,-3,114,23,99,-3,113,-2,114,23,113,-2,125,1,114,23,125,1,124,34,72,127,60,127,86,111,72,127,86,111,81,128,14,46,19,23,28,33,28,33,19,23,32,11,28,33,32,11,40,24,40,24,32,11,46,2,40,24,46,2,52,18,52,18,46,2,64,-2,52,18,64,-2,65,14,19,23,14,46,7,39,86,111,60,127,60,113,130,224,127,172,130,126,49,222,50,204,53,223,25,150,20,230,16,150, +251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,109,339,108,344,107,348,101,352,97,352,88,351,80,347,73,340,68,330,66,319,70,302,82,289,98,280,116,275,133,273,151,275,169,280,185,289,196,302,201,319,16383,16383,251,225,147,225,147,218,160,216,169,213,174,207, +39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,178,189,84,60,84,36,84,36,84,189,42,183,42,183,84,189,85,199,42,183,85,199,88,207,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,169,213,174,207,251,225,251,225,174,207,177,200,251,225,177,200,178,189,178,189,178,165,221,26,221,26,178,165,178,37,221,26,178,37,224,17,224,17,178,37,229,12,238,216,251,218,251,225,238,216,251,225,229,213,229,213,251,225,178,189,229,213,178,189,223,207,223,207,178,189,221,198,220,40,220,183,178,189,220,40,178,189,221,26,160,216,169,213,251,225,160,216,251,225,147,225,160,216,147,225,147,218,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,85,26,84,36,42,183,85,26,42,183,42,40,85,26,42,40,88,18,116,0,12,7,12,0,42,40,93,13,88,18,251,0,147,7,147,0,221,198,178,189,220,183,178,189,84,36,178,165,25,216,12,225,12,218, +201,319,199,330,195,340,188,347,180,351,171,352,167,352,161,348,159,344,158,339,160,332,166,329,172,327,178,324,180,319,179,313,174,307,166,303,152,300,133,299,115,300,102,303,93,307,88,313,87,319,89,324,95,327,101,329,107,332,109,339,108,344,107,348,101,352,97,352,88,351,80,347,73,340,68,330,66,319,70,302,82,289,98,280,116,275,133,273,151,275,169,280,185,289,196,302,201,319,16383,16383,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,84,60,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,178,165,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,248,0,248,7,241,8,235,10,225,14,221,17,217,21,211,28,205,37,198,47,192,58,180,79,168,94,156,105,144,113,131,120,131,121,148,137,160,156,168,172,176,185,188,190,192,189,202,185,208,183,214,182,222,183,228,186,233,191,237,197,238,204,236,211,233,218,226,223,218,227,207,228,196,227,185,223,176,216,168,207,161,196,140,154,132,143,124,135,118,132,112,130,105,128,98,127,91,127,91,190,92,199,95,207,100,212,109,216,122,218,122,225,18,225,18,218,31,216,39,214,45,209,48,201,49,189,49,25,46,18,42,13,36,10,26,8,12,7,12,0,128,0,128,7,117,8,107,9,99,12,94,17,92,24,91,33,91,113,99,111,106,108,112,103,118,95,127,82,181,0,238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36, +102,303,93,307,98,280,98,280,93,307,88,313,98,280,88,313,82,289,82,289,88,313,87,319,88,351,87,319,89,324,88,351,89,324,97,352,97,352,89,324,95,327,97,352,95,327,101,329,101,352,101,329,104,350,104,350,101,329,107,332,104,350,107,332,107,348,107,348,107,332,109,339,107,348,109,339,108,344,82,289,87,319,88,351,82,289,88,351,80,347,82,289,80,347,73,340,82,289,73,340,70,302,68,330,66,319,70,302,68,330,70,302,73,340,102,303,116,275,115,300,115,300,116,275,133,299,152,300,133,299,133,273,152,300,133,273,151,275,196,302,201,319,199,330,196,302,199,330,195,340,196,302,195,340,188,347,196,302,188,347,185,289,185,289,188,347,180,319,185,289,180,319,179,313,185,289,179,313,174,307,185,289,174,307,169,280,180,351,171,352,172,327,180,351,172,327,178,324,180,351,178,324,180,319,180,351,180,319,188,347,167,352,164,350,166,329,167,352,166,329,172,327,167,352,172,327,171,352,161,348,159,344,160,332,161,348,160,332,166,329,161,348,166,329,164,350,169,280,174,307,166,303,169,280,166,303,152,300,169,280,152,300,151,275,133,299,116,275,133,273,39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,178,189,84,60,84,36,84,36,84,189,42,183,42,183,84,189,85,199,42,183,85,199,88,207,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,169,213,174,207,251,225,251,225,174,207,177,200,251,225,177,200,178,189,178,189,178,165,221,26,221,26,178,165,178,37,221,26,178,37,224,17,224,17,178,37,229,12,238,216,251,218,251,225,238,216,251,225,229,213,229,213,251,225,178,189,229,213,178,189,223,207,223,207,178,189,221,198,220,40,220,183,178,189,220,40,178,189,221,26,160,216,169,213,251,225,160,216,251,225,147,225,160,216,147,225,147,218,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,85,26,84,36,42,183,85,26,42,183,42,40,85,26,42,40,88,18,116,0,12,7,12,0,42,40,93,13,88,18,251,0,147,7,147,0,221,198,178,189,220,183,178,189,84,36,178,165,25,216,12,225,12,218,160,332,159,344,158,339,102,303,98,280,116,275,97,352,101,329,101,352, +248,0,248,7,241,8,235,10,225,14,221,17,217,21,211,28,205,37,198,47,192,58,180,79,168,94,156,105,144,113,131,120,131,121,148,137,160,156,168,172,176,185,188,190,192,189,202,185,208,183,214,182,222,183,228,186,233,191,237,197,238,204,236,211,233,218,226,223,218,227,207,228,196,227,185,223,176,216,168,207,161,196,140,154,132,143,124,135,118,132,112,130,105,128,98,127,91,127,91,190,92,199,95,207,100,212,109,216,122,218,122,225,18,225,18,218,31,216,39,214,45,209,48,201,49,189,49,25,46,18,42,13,36,10,26,8,12,7,12,0,128,0,128,7,117,8,107,9,99,12,94,17,92,24,91,33,91,113,99,111,106,108,112,103,118,95,127,82,181,0,238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,8,33,5,27,4,20,6,10,10,3,18,-1,28,-3,39,-4,64,2,79,18,88,41,91,66,92,89,92,198,94,204,98,208,103,210,110,211,154,211,159,209,163,205,165,199,165,37,164,26,161,18,156,12,147,9,134,7,134,0,238,0,238,7,225,9,216,12,211,17,208,26,207,40,207,183,208,198,211,207,216,213,225,216,238,218,297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26, +46,18,42,13,128,0,128,0,42,13,36,10,128,0,36,10,26,8,26,8,12,7,128,0,128,0,12,7,12,0,128,0,128,7,117,8,128,0,117,8,107,9,128,0,107,9,99,12,128,0,99,12,49,33,128,0,49,33,49,25,128,0,49,25,46,18,91,33,91,127,49,189,91,33,49,189,92,24,49,33,99,12,94,17,49,33,94,17,92,24,49,33,92,24,49,189,91,113,99,111,91,127,91,127,91,190,49,189,49,189,91,190,92,199,49,189,92,199,95,207,122,225,18,225,31,216,122,225,31,216,39,214,122,225,39,214,45,209,122,225,45,209,48,201,122,225,48,201,49,189,122,225,49,189,100,212,122,225,100,212,109,216,122,225,109,216,122,218,106,108,112,103,112,130,112,130,112,103,118,95,112,130,118,95,118,132,118,132,118,95,124,135,132,143,124,135,127,82,105,128,98,127,99,111,105,128,99,111,106,108,105,128,106,108,112,130,127,82,124,135,118,95,202,185,207,228,197,187,197,187,207,228,196,227,197,187,196,227,192,189,192,189,196,227,188,190,176,185,188,190,185,223,176,185,185,223,176,216,147,168,148,137,154,182,154,182,148,137,160,156,154,182,160,156,161,196,161,196,160,156,168,172,161,196,168,172,168,207,168,207,168,172,176,185,168,207,176,185,176,216,156,105,144,113,181,0,181,0,144,113,131,120,181,0,131,120,127,82,127,82,131,120,131,121,127,82,131,121,132,143,132,143,131,121,148,137,132,143,148,137,140,154,140,154,148,137,147,168,208,183,214,182,218,227,218,227,214,182,222,183,218,227,222,183,226,223,226,223,222,183,228,186,226,223,228,186,233,218,233,218,228,186,233,191,233,218,233,191,236,211,236,211,233,191,237,197,236,211,237,197,238,204,207,228,202,185,208,183,207,228,208,183,218,227,196,227,185,223,188,190,211,28,181,0,217,21,217,21,181,0,221,17,225,14,221,17,181,0,225,14,181,0,248,0,248,0,248,7,241,8,248,0,241,8,235,10,248,0,235,10,230,12,248,0,230,12,225,14,181,0,211,28,205,37,181,0,205,37,198,47,181,0,198,47,192,58,181,0,192,58,180,79,181,0,180,79,168,94,181,0,168,94,156,105,91,127,99,111,98,127,31,216,18,225,18,218,100,212,49,189,95,207, +238,225,45,225,45,218,57,216,66,212,71,206,74,197,75,183,75,99,74,77,73,53,69,33,62,18,50,12,46,15,42,22,38,30,32,36,23,39,18,38,13,36,8,33,5,27,4,20,6,10,10,3,18,-1,28,-3,39,-4,64,2,79,18,88,41,91,66,92,89,92,198,94,204,98,208,103,210,110,211,154,211,159,209,163,205,165,199,165,37,164,26,161,18,156,12,147,9,134,7,134,0,238,0,238,7,225,9,216,12,211,17,208,26,207,40,207,183,208,198,211,207,216,213,225,216,238,218,297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,59,36,59,172,60,172,143,0,147,0,224,174,224,37,223,26,220,18,214,12,204,9,190,7,190,0,296,0,296,7,284,9,275,12,270,17,267,26,266,40,266,183,267,198,270,207,275,213,284,216,297,218,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216, +74,77,73,53,79,18,79,18,73,53,69,33,79,18,69,33,64,2,64,2,69,33,62,18,64,2,62,18,50,12,50,12,46,15,64,2,64,2,46,15,39,-4,57,216,66,212,238,225,238,225,66,212,103,210,238,225,103,210,110,211,238,225,110,211,145,211,238,225,145,211,154,211,161,18,156,12,238,0,238,0,156,12,147,9,238,0,147,9,134,7,238,225,154,211,159,209,238,225,159,209,163,205,238,225,163,205,165,199,238,225,165,199,165,190,238,225,165,190,216,213,238,225,216,213,225,216,238,225,225,216,238,218,207,40,207,183,165,190,165,190,207,183,208,198,165,190,208,198,211,207,216,12,211,17,165,37,165,37,211,17,208,26,165,37,208,26,165,190,92,189,92,198,75,183,92,189,75,183,79,18,92,189,79,18,88,41,92,189,88,41,91,66,92,189,91,66,92,89,75,183,92,198,94,204,75,183,94,204,98,208,75,183,98,208,74,197,71,206,74,197,98,208,71,206,98,208,103,210,71,206,103,210,66,212,45,225,45,218,57,216,45,225,57,216,238,225,238,0,238,7,225,9,238,0,225,9,216,12,238,0,216,12,165,37,238,0,165,37,164,26,238,0,164,26,161,18,75,99,74,77,79,18,75,99,79,18,75,183,39,-4,46,15,42,22,39,-4,42,22,38,30,39,-4,38,30,32,36,39,-4,32,36,28,-3,32,36,23,39,28,-3,28,-3,23,39,18,38,28,-3,18,38,18,-1,18,-1,18,38,13,36,18,-1,13,36,10,3,10,3,13,36,8,33,10,3,8,33,6,10,6,10,8,33,5,27,6,10,5,27,4,20,238,0,134,7,134,0,165,190,208,26,207,40,216,213,165,190,211,207, +297,225,229,225,157,62,79,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,92,0,92,7,78,9,69,12,63,18,60,26,59,36,59,172,60,172,143,0,147,0,224,174,224,37,223,26,220,18,214,12,204,9,190,7,190,0,296,0,296,7,284,9,275,12,270,17,267,26,266,40,266,183,267,198,270,207,275,213,284,216,297,218,251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,178,108,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9, +39,16,33,11,92,0,92,0,33,11,25,9,92,0,25,9,12,7,220,18,214,12,296,0,296,0,214,12,204,9,296,0,204,9,190,7,229,225,157,62,224,174,229,225,224,174,267,26,229,225,267,26,266,40,229,225,266,40,266,183,229,225,266,183,267,198,229,225,267,198,270,207,229,225,270,207,275,213,229,225,275,213,297,225,59,172,60,172,79,225,79,225,60,172,143,0,79,225,143,0,157,62,157,62,143,0,147,0,157,62,147,0,224,174,92,7,78,9,92,0,92,0,78,9,69,12,92,0,69,12,42,25,42,25,69,12,63,18,42,25,63,18,42,40,42,40,63,18,60,26,42,40,60,26,42,183,42,183,60,26,59,36,42,183,59,36,59,172,79,225,12,225,25,216,79,225,25,216,33,212,79,225,33,212,39,206,79,225,39,206,42,197,79,225,42,197,42,183,79,225,42,183,59,172,284,216,297,218,297,225,284,216,297,225,275,213,296,0,296,7,284,9,296,0,284,9,275,12,296,0,275,12,224,37,296,0,224,37,223,26,296,0,223,26,220,18,224,37,275,12,270,17,224,37,270,17,267,26,224,37,267,26,224,174,92,0,12,7,12,0,39,16,92,0,42,25,296,0,190,7,190,0,25,216,12,225,12,218, +251,225,147,225,147,218,160,216,169,213,174,207,177,200,178,189,178,124,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,178,108,178,37,177,26,174,18,169,12,160,9,147,7,147,0,251,0,251,7,238,9,229,12,224,17,221,26,220,40,220,183,221,198,223,207,229,213,238,216,251,218,238,116,232,154,217,186,194,210,165,225,130,230,92,225,61,209,38,185,23,153,17,114,23,75,38,42,61,17,91,1,126,-4,163,1,194,17,218,43,233,76,238,116,16383,16383,193,102,190,70,183,44,171,25,154,13,134,9,123,10,114,13,104,18,96,25,89,34,79,51,72,70,66,91,63,113,63,137,65,164,73,186,85,202,101,212,121,216,132,215,143,211,152,206,161,199,168,191,177,177,184,161,189,142,192,122,193,102,251,225,12,225,12,218,25,217,33,214, +39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,26,84,36,84,124,84,108,178,108,84,124,178,108,178,124,178,124,178,108,224,17,178,124,224,17,221,26,42,183,84,36,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,174,18,169,12,251,0,251,0,169,12,160,9,251,0,160,9,147,7,251,225,147,225,160,216,251,225,160,216,169,213,251,225,169,213,174,207,251,225,174,207,177,200,251,225,177,200,178,189,251,225,178,189,229,213,251,225,229,213,238,216,251,225,238,216,251,218,220,40,220,183,178,189,178,189,220,183,221,198,178,189,221,198,223,207,178,189,221,26,220,40,251,0,251,7,238,9,251,0,238,9,229,12,251,0,229,12,178,37,251,0,178,37,177,26,251,0,177,26,174,18,178,37,229,12,224,17,178,37,224,17,178,108,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,42,40,93,13,88,18,42,40,88,18,85,26,42,40,85,26,42,183,116,0,12,7,12,0,251,0,147,7,147,0,178,124,221,26,178,189,160,216,147,225,147,218,229,213,178,189,223,207,25,216,12,225,12,218, +238,116,232,154,217,186,194,210,165,225,130,230,92,225,61,209,38,185,23,153,17,114,23,75,38,42,61,17,91,1,126,-4,163,1,194,17,218,43,233,76,238,116,16383,16383,193,102,190,70,183,44,171,25,154,13,134,9,123,10,114,13,104,18,96,25,89,34,79,51,72,70,66,91,63,113,63,137,65,164,73,186,85,202,101,212,121,216,132,215,143,211,152,206,161,199,168,191,177,177,184,161,189,142,192,122,193,102,251,225,12,225,12,218,25,217,33,214,39,209,42,200,42,26,39,17,33,12,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,186,85,196,88,203,92,208,98,210,105,211,156,211,163,210,169,208,174,203,177,196,178,186,178,37,177,26,175,18,170,12,161,9,148,7,148,0,251,0,251,7,238,9,229,11,224,16,221,24,220,37,220,184,221,199,224,209,230,214,238,217,251,218,76,229, +66,91,61,17,72,70,72,70,61,17,91,1,72,70,91,1,79,51,79,51,91,1,89,34,96,25,89,34,91,1,96,25,91,1,126,-4,165,225,130,230,132,215,132,215,130,230,121,216,101,212,121,216,130,230,101,212,130,230,92,225,190,70,183,44,194,17,194,17,183,44,171,25,194,17,171,25,163,1,163,1,171,25,154,13,163,1,154,13,134,9,134,9,123,10,126,-4,126,-4,123,10,114,13,126,-4,114,13,104,18,143,211,152,206,165,225,165,225,152,206,161,199,165,225,161,199,168,191,168,191,177,177,194,210,194,210,177,177,184,161,194,210,184,161,189,142,194,210,193,102,194,17,194,210,194,17,217,186,217,186,194,17,218,43,217,186,218,43,232,154,232,154,218,43,233,76,232,154,233,76,238,116,194,210,189,142,192,122,194,210,192,122,193,102,194,210,165,225,168,191,134,9,126,-4,163,1,61,17,63,113,63,137,63,137,65,164,61,209,61,209,65,164,73,186,61,209,73,186,92,225,92,225,73,186,85,202,92,225,85,202,101,212,61,17,63,137,61,209,61,17,61,209,38,42,38,42,61,209,38,185,38,42,38,185,23,75,23,75,38,185,23,153,23,75,23,153,17,114,63,113,61,17,66,91,190,70,194,17,193,102,165,225,132,215,143,211,96,25,126,-4,104,18, +251,225,12,225,12,218,25,217,33,214,39,209,42,200,42,26,39,17,33,12,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,186,85,196,88,203,92,208,98,210,105,211,156,211,163,210,169,208,174,203,177,196,178,186,178,37,177,26,175,18,170,12,161,9,148,7,148,0,251,0,251,7,238,9,229,11,224,16,221,24,220,37,220,184,221,199,224,209,230,214,238,217,251,218,76,229,73,230,58,224,44,219,31,214,17,209,1,204,1,196,4,197,13,197,22,196,28,194,32,189,34,180,34,-65,33,-79,30,-88,24,-94,14,-98,0,-100,0,-107,120,-107,120,-100,101,-99,88,-95,81,-89,77,-78,76,-62,76,17,86,8,96,2,107,-1,117,-3,129,-4,163,1,191,19,213,47,227,82,232,123,228,158,216,188,198,210,175,225,148,230,132,228,117,224,103,216,89,205,76,190,16383,16383,76,167,79,176, +39,17,33,12,116,0,116,0,33,12,25,9,116,0,25,9,12,7,156,211,251,225,105,211,98,210,105,211,39,209,98,210,39,209,42,200,175,18,170,12,251,0,251,0,170,12,161,9,251,0,161,9,148,7,238,217,251,218,251,225,238,217,251,225,230,214,230,214,251,225,177,196,230,214,177,196,178,186,221,24,178,186,178,37,221,24,178,37,224,16,224,16,178,37,229,11,220,37,220,184,178,186,178,186,220,184,221,199,178,186,221,199,224,209,251,225,156,211,163,210,251,225,163,210,169,208,251,225,169,208,174,203,251,225,174,203,177,196,93,13,88,18,42,39,42,39,88,18,85,26,42,39,85,26,42,185,42,185,85,26,84,36,42,185,84,36,84,186,42,185,84,186,85,196,42,185,85,196,88,203,42,185,88,203,92,208,42,185,92,208,42,200,251,225,12,225,25,217,251,225,25,217,33,214,251,225,33,214,39,209,251,225,39,209,105,211,251,0,251,7,238,9,251,0,238,9,229,11,251,0,229,11,178,37,251,0,178,37,177,26,251,0,177,26,175,18,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,39,116,0,42,39,42,26,116,0,42,26,39,17,116,0,12,7,12,0,251,0,148,7,148,0,178,186,221,24,220,37,25,217,12,225,12,218,98,210,42,200,92,208,230,214,178,186,224,209, +76,229,73,230,58,224,44,219,31,214,17,209,1,204,1,196,4,197,13,197,22,196,28,194,32,189,34,180,34,-65,33,-79,30,-88,24,-94,14,-98,0,-100,0,-107,120,-107,120,-100,101,-99,88,-95,81,-89,77,-78,76,-62,76,17,86,8,96,2,107,-1,117,-3,129,-4,163,1,191,19,213,47,227,82,232,123,228,158,216,188,198,210,175,225,148,230,132,228,117,224,103,216,89,205,76,190,16383,16383,76,167,79,176,87,185,99,193,113,198,127,200,148,195,165,183,178,163,186,136,189,103,186,73,178,47,165,27,148,14,128,10,113,12,99,18,87,26,79,35,76,44,207,78,193,60,180,46,167,38,153,33,137,31,111,36,89,49,73,69,63,96,59,128,62,157,71,182,86,200,105,212,127,216,137,215,144,212,149,208,153,201,156,191,160,180,163,172,167,166,171,161,177,158,184,157,191,158,197,161,202,166,206,172,207,179,203,195,192,209,175,220,154,227,130,230,116,229,102,226,88,221,75,213,62,204,63,204,48,189,36,172,28,152,22,130,21,106,25,70,38,39,58,15,84,0,116,-4,128,-3,140,-1,152,3,163,9,173,16,182,24,189,32,197,43,205,57,214,74,213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202, +30,-88,24,-94,120,-107,120,-107,24,-94,14,-98,120,-107,14,-98,0,-100,6,197,8,197,17,209,17,209,8,197,11,197,17,209,11,197,13,197,13,197,22,196,17,209,17,209,22,196,31,214,17,209,1,204,4,197,17,209,4,197,6,197,79,35,76,44,86,8,86,8,76,44,76,17,77,-78,76,-62,44,219,77,-78,44,219,34,169,34,169,44,219,34,180,22,196,28,194,31,214,31,214,28,194,32,189,31,214,32,189,44,219,44,219,32,189,34,180,76,190,76,229,73,230,76,190,73,230,76,-62,76,190,76,-62,76,167,76,190,76,167,79,176,76,190,79,176,89,205,232,123,228,158,227,82,227,82,228,158,216,188,227,82,216,188,213,47,213,47,216,188,198,210,213,47,198,210,191,19,191,19,198,210,189,103,191,19,189,103,186,73,191,19,186,73,178,47,198,210,175,225,178,163,198,210,178,163,186,136,198,210,186,136,189,103,132,228,127,200,148,195,132,228,148,195,148,230,148,230,148,195,165,183,148,230,165,183,175,225,175,225,165,183,178,163,128,10,129,-4,148,14,148,14,129,-4,163,1,148,14,163,1,165,27,165,27,163,1,191,19,165,27,191,19,178,47,120,-107,120,-100,101,-99,120,-107,101,-99,88,-95,120,-107,88,-95,33,-79,120,-107,33,-79,30,-88,58,224,44,219,76,-62,58,224,76,-62,73,230,34,-65,33,-79,88,-95,34,-65,88,-95,81,-89,34,-65,81,-89,77,-78,34,-65,77,-78,34,169,79,176,87,185,89,205,89,205,87,185,99,193,89,205,99,193,103,216,103,216,99,193,113,198,103,216,113,198,117,224,117,224,113,198,127,200,117,224,127,200,132,228,113,12,99,18,107,-1,113,12,107,-1,117,-3,113,12,117,-3,128,10,79,35,86,8,87,26,87,26,86,8,96,2,87,26,96,2,99,18,99,18,96,2,107,-1,129,-4,128,10,117,-3,4,197,1,204,1,196,120,-107,0,-100,0,-107, +207,78,193,60,180,46,167,38,153,33,137,31,111,36,89,49,73,69,63,96,59,128,62,157,71,182,86,200,105,212,127,216,137,215,144,212,149,208,153,201,156,191,160,180,163,172,167,166,171,161,177,158,184,157,191,158,197,161,202,166,206,172,207,179,203,195,192,209,175,220,154,227,130,230,116,229,102,226,88,221,75,213,62,204,63,204,48,189,36,172,28,152,22,130,21,106,25,70,38,39,58,15,84,0,116,-4,128,-3,140,-1,152,3,163,9,173,16,182,24,189,32,197,43,205,57,214,74,213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,50,209,70,211,77,211,82,209,85,207,87,202,88,195,88,40,87,25,84,16,78,11,69,9,56,7,56,0,161,0,161,7,148,9,139,13,133,18,130,26,129,36,129,195,130,201,131,206,134,209,139,210,146,211,166,209,182,202,192,191,200,175,204,155,242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218, +89,49,73,69,84,0,84,0,73,69,63,96,84,0,63,96,58,15,58,15,63,96,59,128,63,204,59,128,62,157,63,204,62,157,71,182,137,31,116,-4,128,-3,137,31,128,-3,140,-1,137,31,111,36,116,-4,89,49,84,0,116,-4,89,49,116,-4,111,36,203,195,192,209,197,161,203,195,197,161,202,166,203,195,202,166,206,172,203,195,206,172,207,179,192,209,175,220,177,158,192,209,177,158,184,157,192,209,184,157,191,158,192,209,191,158,197,161,175,220,154,227,156,191,175,220,156,191,160,180,175,220,160,180,163,172,175,220,163,172,167,166,175,220,167,166,171,161,175,220,171,161,177,158,144,212,149,208,154,227,154,227,149,208,153,201,154,227,153,201,156,191,130,230,127,216,137,215,130,230,137,215,154,227,154,227,137,215,144,212,182,24,189,32,193,60,193,60,189,32,197,43,193,60,197,43,207,78,207,78,197,43,205,57,207,78,205,57,214,74,140,-1,152,3,153,33,153,33,152,3,163,9,153,33,163,9,167,38,167,38,163,9,173,16,167,38,173,16,180,46,180,46,173,16,182,24,180,46,182,24,193,60,153,33,137,31,140,-1,105,212,127,216,116,229,105,212,116,229,102,226,105,212,102,226,88,221,105,212,88,221,86,200,75,213,63,204,71,182,75,213,71,182,86,200,75,213,86,200,88,221,48,189,36,172,38,39,48,189,38,39,58,15,48,189,58,15,59,128,48,189,59,128,63,204,28,152,22,130,25,70,28,152,25,70,38,39,28,152,38,39,36,172,127,216,130,230,116,229,25,70,22,130,21,106, +213,155,210,225,7,225,4,155,12,155,17,175,24,191,35,202,50,209,70,211,77,211,82,209,85,207,87,202,88,195,88,40,87,25,84,16,78,11,69,9,56,7,56,0,161,0,161,7,148,9,139,13,133,18,130,26,129,36,129,195,130,201,131,206,134,209,139,210,146,211,166,209,182,202,192,191,200,175,204,155,242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,107,225,4,225,4,218,11,217,23,211,27,206,31,200,99,59,105,47,111,34,116,22,120,13,122,6,119,-5,111,-24,100,-44,88,-60, +84,16,78,11,161,0,161,0,78,11,69,9,161,0,69,9,56,7,24,191,35,202,7,225,7,225,35,202,50,209,7,225,50,209,70,211,70,211,77,211,210,225,210,225,77,211,82,209,210,225,82,209,85,207,85,207,87,202,210,225,210,225,87,202,139,210,210,225,139,210,146,211,146,211,166,209,210,225,210,225,166,209,182,202,210,225,182,202,192,191,210,225,192,191,200,175,210,225,200,175,204,155,210,225,204,155,213,155,129,36,129,195,88,195,88,195,129,195,130,201,88,195,130,201,131,206,88,195,131,206,134,209,88,195,134,209,139,210,88,195,139,210,87,202,88,195,130,26,129,36,210,225,7,225,70,211,7,225,4,155,12,155,7,225,12,155,17,175,7,225,17,175,24,191,161,0,161,7,148,9,161,0,148,9,139,13,161,0,139,13,88,40,161,0,88,40,87,25,161,0,87,25,84,16,88,40,139,13,133,18,88,40,133,18,130,26,88,40,130,26,88,195,161,0,56,7,56,0, +242,225,175,225,175,218,184,217,190,216,195,213,198,210,199,205,199,201,198,198,198,195,197,193,145,55,84,184,83,188,79,196,78,201,78,204,79,209,82,212,87,215,95,217,107,218,107,225,4,225,4,218,11,217,23,211,27,206,31,200,99,59,105,47,111,34,116,22,120,13,122,6,119,-5,111,-24,100,-44,88,-60,75,-66,70,-66,64,-64,60,-63,55,-60,49,-58,39,-56,33,-56,27,-57,21,-60,16,-65,13,-72,12,-79,14,-88,18,-96,26,-102,35,-106,47,-108,68,-105,86,-94,102,-76,118,-48,134,-11,217,192,221,202,225,208,230,213,235,216,242,218,190,330,186,331,172,325,146,315,132,310,117,305,117,297,119,298,129,298,138,297,144,295,147,290,149,281,150,270,150,204,144,212,136,219,127,225,116,229,104,230,76,225,53,209,36,185,25,153,22,113,23,89,27,66,32,46,41,29,51,15,60,8,69,2,79,-1,91,-3,103,-4,115,-3,126,0,136,6,144,13,150,22,150,-65,149,-79,146,-88,140,-94,129,-98,114,-100,114,-107,233,-107,233,-100,214,-99,202,-95,194,-89,191,-78,190,-62,190,22,195,13,203,6,213,0,224,-3,236,-4,249,-3,260,-1,270,2,279,8,287,15,298,29,306,46,313,66,316,89, +67,-65,68,-105,70,-66,70,-66,68,-105,86,-94,70,-66,86,-94,73,-66,73,-66,86,-94,75,-66,88,-60,75,-66,86,-94,88,-60,86,-94,102,-76,31,200,78,201,78,204,78,204,79,209,31,200,31,200,79,209,82,212,31,200,82,212,107,225,107,225,82,212,87,215,107,225,87,215,95,217,95,217,107,218,107,225,107,225,4,225,11,217,107,225,11,217,17,214,107,225,17,214,23,211,107,225,23,211,27,206,107,225,27,206,31,200,122,6,134,-11,145,55,145,55,134,-11,217,192,145,55,217,192,197,193,197,193,217,192,198,195,242,225,175,225,184,217,242,225,184,217,190,216,242,225,190,216,195,213,242,225,195,213,198,210,242,225,198,210,199,205,242,225,199,205,230,213,242,225,230,213,235,216,242,225,235,216,242,218,199,205,217,192,221,202,199,205,221,202,225,208,199,205,225,208,230,213,199,204,199,201,217,192,199,204,217,192,199,205,198,198,198,195,217,192,198,198,217,192,199,201,111,34,116,22,145,55,145,55,116,22,120,13,145,55,120,13,122,6,145,55,84,184,99,59,145,55,99,59,105,47,145,55,105,47,111,34,99,59,84,184,83,188,99,59,83,188,81,192,99,59,81,192,79,196,99,59,79,196,78,201,99,59,78,201,31,200,119,-5,111,-24,118,-48,119,-5,118,-48,134,-11,119,-5,134,-11,122,6,102,-76,118,-48,111,-24,102,-76,111,-24,100,-44,102,-76,100,-44,88,-60,68,-105,67,-65,64,-64,68,-105,64,-64,60,-63,68,-105,60,-63,55,-60,68,-105,55,-60,49,-58,68,-105,49,-58,47,-108,49,-58,44,-57,47,-108,47,-108,44,-57,39,-56,47,-108,39,-56,35,-106,35,-106,39,-56,33,-56,35,-106,33,-56,27,-57,35,-106,27,-57,26,-102,26,-102,27,-57,21,-60,26,-102,21,-60,18,-96,18,-96,21,-60,16,-65,18,-96,16,-65,14,-88,14,-88,16,-65,13,-72,14,-88,13,-72,12,-79,184,217,175,225,175,218,11,217,4,225,4,218, +190,330,186,331,172,325,146,315,132,310,117,305,117,297,119,298,129,298,138,297,144,295,147,290,149,281,150,270,150,204,144,212,136,219,127,225,116,229,104,230,76,225,53,209,36,185,25,153,22,113,23,89,27,66,32,46,41,29,51,15,60,8,69,2,79,-1,91,-3,103,-4,115,-3,126,0,136,6,144,13,150,22,150,-65,149,-79,146,-88,140,-94,129,-98,114,-100,114,-107,233,-107,233,-100,214,-99,202,-95,194,-89,191,-78,190,-62,190,22,195,13,203,6,213,0,224,-3,236,-4,249,-3,260,-1,270,2,279,8,287,15,298,29,306,46,313,66,316,89,318,113,314,153,303,185,286,209,263,225,235,230,223,229,212,225,203,219,195,212,190,204,16383,16383,190,179,192,188,198,197,207,206,219,212,233,215,248,209,260,194,268,172,273,146,275,117,274,99,273,82,271,66,267,51,263,38,258,29,253,21,247,15,240,11,233,10,219,13,207,19,198,28,192,38,190,47,16383,16383,150,47,147,38,141,28,132,19,120,13,105,10,99,11,92,15,86,21,81,29,76,38,72,51,68,66,66,82,65,99,65,117,66,146,71,172,80,194,91,209,105,215,120,212,132,206,141,197,147,187,150,177,238,0,238,7,229,8,221,12,213,18,205,26,197,37,133,136,175,195,181,203,188,209,197,214,215,218,215,225,136,225,136,218,144,217,150,215,154,213,156,210,156,201,154,195,150,187,145,178,138,169,124,149,116,162,108,174,101,185,97,194,94,201,93,206,93,210,96,213,100,216,106,217,114,218,114,225,11,225,11,218,15,218,23,217,31,214,38,208,45,200,54,187,54,188,100,115,45,32,37,22,30,15,23,11,16,9,7,7,7,0,79,0,79,7,72,8,66,9,62,11,60,13,60,19,61,23,63,27,65,33,69,39,108,100,155,28,156,27,156,25,157,23,157,15,155,12,152,9,146,8,137,7,137,0,251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218, +69,2,79,-1,72,51,72,51,79,-1,76,38,81,29,76,38,79,-1,81,29,79,-1,91,-3,150,177,150,47,150,22,150,22,150,47,147,38,150,22,147,38,144,13,144,13,147,38,141,28,144,13,141,28,136,6,136,6,141,28,132,19,136,6,132,19,126,0,126,0,132,19,120,13,126,0,120,13,115,-3,115,-3,120,13,105,10,105,10,99,11,103,-4,103,-4,99,11,92,15,103,-4,92,15,91,-3,91,-3,92,15,86,21,91,-3,86,21,81,29,150,270,150,204,150,22,150,22,150,204,150,177,150,177,150,204,147,187,147,187,150,204,144,212,147,187,144,212,141,197,141,197,144,212,136,219,141,197,136,219,132,206,132,206,136,219,127,225,132,206,127,225,120,212,120,212,127,225,116,229,120,212,116,229,105,215,66,146,71,172,76,225,76,225,71,172,80,194,76,225,80,194,104,230,104,230,80,194,91,209,104,230,91,209,105,215,76,225,53,209,66,146,66,146,53,209,65,117,65,99,65,117,60,8,65,99,60,8,69,2,41,29,51,15,53,209,53,209,51,15,60,8,53,209,60,8,65,117,36,185,25,153,27,66,36,185,27,66,32,46,36,185,32,46,41,29,36,185,41,29,53,209,25,153,22,113,23,89,25,153,23,89,27,66,146,-88,140,-94,233,-107,233,-107,140,-94,129,-98,233,-107,129,-98,114,-100,122,298,124,298,132,310,132,310,124,298,126,298,132,310,126,298,129,298,129,298,138,297,132,310,132,310,138,297,146,315,132,310,117,305,119,298,132,310,119,298,122,298,192,38,190,47,195,13,195,13,190,47,190,22,191,-78,190,-62,159,320,191,-78,159,320,150,22,150,22,159,320,150,270,138,297,144,295,146,315,146,315,144,295,147,290,146,315,147,290,159,320,159,320,147,290,149,281,159,320,149,281,150,270,190,204,190,330,186,331,190,204,186,331,190,-62,190,204,190,-62,190,179,190,204,190,179,195,212,274,99,273,82,279,8,279,8,273,82,271,66,279,8,271,66,270,2,270,2,271,66,267,51,270,2,267,51,263,38,263,38,258,29,260,-1,260,-1,258,29,253,21,260,-1,253,21,249,-3,249,-3,253,21,247,15,249,-3,247,15,240,11,213,0,224,-3,219,13,219,13,224,-3,233,10,240,11,233,10,236,-4,240,11,236,-4,249,-3,314,153,303,185,306,46,314,153,306,46,313,66,314,153,313,66,316,89,314,153,316,89,318,113,274,99,279,8,275,117,275,117,279,8,286,209,286,209,279,8,287,15,286,209,287,15,303,185,303,185,287,15,298,29,303,185,298,29,306,46,248,209,260,194,263,225,263,225,260,194,268,172,263,225,268,172,286,209,286,209,268,172,273,146,286,209,273,146,275,117,263,225,235,230,248,209,248,209,235,230,233,215,219,212,233,215,223,229,219,212,223,229,212,225,263,38,260,-1,270,2,233,-107,233,-100,214,-99,233,-107,214,-99,202,-95,233,-107,202,-95,149,-79,233,-107,149,-79,146,-88,172,325,159,320,190,-62,172,325,190,-62,186,331,194,-89,191,-78,150,22,194,-89,150,22,150,-65,194,-89,150,-65,202,-95,69,2,72,51,68,66,69,2,68,66,66,82,69,2,66,82,65,99,192,38,195,13,198,28,198,28,195,13,203,6,198,28,203,6,207,19,207,19,203,6,213,0,207,19,213,0,219,13,190,179,192,188,195,212,195,212,192,188,198,197,195,212,198,197,203,219,203,219,198,197,207,206,203,219,207,206,212,225,212,225,207,206,219,212,235,230,223,229,233,215,233,10,224,-3,236,-4,115,-3,105,10,103,-4,119,298,117,305,117,297,233,-107,114,-100,114,-107,149,-79,202,-95,150,-65,105,215,116,229,104,230, +238,0,238,7,229,8,221,12,213,18,205,26,197,37,133,136,175,195,181,203,188,209,197,214,215,218,215,225,136,225,136,218,144,217,150,215,154,213,156,210,156,201,154,195,150,187,145,178,138,169,124,149,116,162,108,174,101,185,97,194,94,201,93,206,93,210,96,213,100,216,106,217,114,218,114,225,11,225,11,218,15,218,23,217,31,214,38,208,45,200,54,187,54,188,100,115,45,32,37,22,30,15,23,11,16,9,7,7,7,0,79,0,79,7,72,8,66,9,62,11,60,13,60,19,61,23,63,27,65,33,69,39,108,100,155,28,156,27,156,25,157,23,157,15,155,12,152,9,146,8,137,7,137,0,251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186, +30,15,23,11,79,0,79,0,23,11,16,9,79,0,16,9,7,7,31,214,38,208,114,225,114,225,38,208,45,200,114,225,45,200,54,188,54,188,45,200,54,187,54,187,100,115,93,206,93,206,93,210,54,187,54,187,93,210,96,213,54,187,96,213,114,225,114,225,96,213,100,216,114,225,100,216,106,217,30,15,79,0,37,22,37,22,79,0,62,11,37,22,62,11,45,32,45,32,62,11,60,13,45,32,60,13,60,17,60,17,60,19,45,32,45,32,60,19,61,23,45,32,61,23,63,27,106,217,114,218,114,225,114,225,11,225,15,218,114,225,15,218,23,217,114,225,23,217,31,214,138,169,124,149,133,136,138,169,133,136,175,195,138,169,175,195,145,178,215,225,136,225,144,217,215,225,144,217,150,215,215,225,150,215,154,213,215,225,154,213,156,210,215,225,156,210,156,206,215,225,156,206,188,209,215,225,188,209,197,214,215,225,197,214,206,216,215,225,206,216,215,218,175,195,181,203,156,206,175,195,156,206,156,201,175,195,156,201,154,195,175,195,154,195,150,187,175,195,150,187,145,178,155,12,152,9,238,0,238,0,152,9,146,8,238,0,146,8,137,7,157,20,238,0,221,12,157,20,221,12,213,18,157,20,213,18,205,26,157,20,205,26,197,37,157,20,197,37,157,21,197,37,133,136,155,28,197,37,155,28,156,27,197,37,156,27,156,25,197,37,156,25,157,23,197,37,157,23,157,21,133,136,124,149,155,28,155,28,124,149,116,162,155,28,116,162,108,100,108,100,116,162,108,174,108,100,108,174,101,185,100,115,45,32,63,27,100,115,63,27,65,33,100,115,65,33,69,39,100,115,69,39,108,100,100,115,108,100,101,185,100,115,101,185,97,194,100,115,97,194,94,201,100,115,94,201,93,206,229,8,221,12,238,0,229,8,238,0,238,7,157,15,155,12,238,0,157,15,238,0,157,20,79,0,79,7,72,8,79,0,72,8,66,9,79,0,66,9,62,11,79,0,7,7,7,0,238,0,137,7,137,0,144,217,136,225,136,218,188,209,156,206,181,203,15,218,11,225,11,218,114,225,54,188,54,187, +251,225,146,225,146,218,159,216,168,212,174,207,177,199,178,189,178,39,177,29,174,22,170,17,164,15,157,14,104,14,97,15,92,17,88,22,85,29,84,39,84,188,85,199,88,207,94,213,103,216,116,218,116,225,12,225,12,218,25,216,33,214,39,209,42,201,42,26,39,16,33,11,24,8,12,7,12,0,199,0,210,-3,221,-14,232,-34,243,-68,251,-68,251,7,238,8,229,11,224,16,221,25,220,40,220,186,221,199,223,208,229,213,238,216,251,218,244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,82,199,86,208,91,213,100,216,113,218,113,225,9,225,9,218,22,216,30,213,36,209,39,200,40,186,40,144,43,121,52,105,66,97,85,93,107,92,124,93,139,96,152,100,162,104,171,108,171,27,168,18,162,13,153,9,141,7,141,0,244,0,244,7,231,9,223,12,217,17,215,25,214,39, +39,16,33,11,187,0,187,0,33,11,24,8,187,0,24,8,12,7,116,225,12,225,25,216,116,225,25,216,33,214,116,225,33,214,39,209,116,225,39,209,42,201,116,225,42,201,42,188,116,225,42,188,94,213,116,225,94,213,103,216,116,225,103,216,116,218,92,17,88,22,42,41,42,41,88,22,85,29,42,41,85,29,42,188,42,188,85,29,84,39,42,188,84,39,84,188,42,188,84,188,85,199,42,188,85,199,88,207,42,188,88,207,94,213,251,225,146,225,159,216,251,225,159,216,168,212,251,225,168,212,174,207,251,225,174,207,177,199,251,225,177,199,178,189,251,225,178,189,229,213,251,225,229,213,238,216,251,225,238,216,251,218,224,16,221,25,221,-14,221,-14,221,25,220,40,220,40,220,186,210,-3,210,-3,220,186,199,0,178,189,187,0,221,199,221,199,187,0,199,0,221,199,199,0,220,186,223,208,229,213,178,189,223,208,178,189,221,199,251,-68,251,7,243,-68,243,-68,251,7,238,8,243,-68,238,8,232,-34,232,-34,238,8,229,11,232,-34,229,11,224,16,174,22,170,17,187,0,187,0,170,17,164,15,187,0,164,15,157,14,187,0,178,189,178,39,187,0,178,39,177,29,187,0,177,29,174,22,42,26,39,16,97,15,97,15,39,16,187,0,97,15,187,0,104,14,104,14,187,0,157,14,42,26,97,15,92,17,42,26,92,17,42,41,187,0,12,7,12,0,221,-14,220,40,210,-3,224,16,221,-14,232,-34,159,216,146,225,146,218,25,216,12,225,12,218,42,188,42,201,42,187, +244,225,139,225,139,218,152,216,161,212,167,207,170,200,171,190,171,118,166,116,158,113,148,110,136,108,123,107,106,108,94,112,87,120,83,131,81,147,81,186,82,199,86,208,91,213,100,216,113,218,113,225,9,225,9,218,22,216,30,213,36,209,39,200,40,186,40,144,43,121,52,105,66,97,85,93,107,92,124,93,139,96,152,100,162,104,171,108,171,27,168,18,162,13,153,9,141,7,141,0,244,0,244,7,231,9,223,12,217,17,215,25,214,39,214,199,217,208,223,213,231,216,244,218,373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,213,232,216,243,218,243,225,141,225,141,218,152,216,160,213,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,88,207,93,212,102,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11, +113,218,113,218,100,216,100,216,113,218,113,225,100,216,113,225,91,213,91,213,113,225,40,186,91,213,40,186,86,208,86,208,40,186,43,121,86,208,43,121,82,199,82,199,43,121,52,105,82,199,52,105,66,97,87,120,83,131,85,93,85,93,83,131,81,147,81,147,81,186,66,97,66,97,81,186,82,199,30,213,36,209,113,225,113,225,36,209,39,200,113,225,39,200,40,186,22,216,30,213,113,225,22,216,113,225,9,225,22,216,9,225,9,218,244,7,231,9,244,0,244,0,231,9,223,12,244,0,223,12,171,39,171,39,223,12,217,17,171,39,217,17,171,108,171,108,171,118,166,116,171,108,166,116,162,104,162,104,166,116,158,113,162,104,158,113,152,100,152,100,158,113,148,110,152,100,148,110,139,96,139,96,148,110,136,108,139,96,136,108,124,93,124,93,136,108,123,107,107,92,124,93,123,107,107,92,123,107,106,108,107,92,106,108,94,112,107,92,94,112,87,120,107,92,87,120,85,93,244,225,139,225,152,216,244,225,152,216,161,212,244,225,161,212,167,207,244,225,167,207,170,200,244,225,170,200,171,190,244,225,171,190,223,213,244,225,223,213,231,216,244,225,231,216,244,218,214,39,214,186,171,108,171,108,214,186,214,199,171,108,214,199,217,208,171,190,171,108,217,208,171,190,217,208,223,213,171,108,217,17,215,25,171,108,215,25,214,39,244,0,171,39,171,27,244,0,171,27,168,18,244,0,168,18,162,13,244,0,162,13,153,9,244,0,153,9,141,7,244,0,141,7,141,0,43,121,40,186,40,144,171,118,171,108,171,190,152,216,139,225,139,218,85,93,81,147,66,97, +373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,213,232,216,243,218,243,225,141,225,141,218,152,216,160,213,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,88,207,93,212,102,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,372,0,372,7,360,8,351,11,345,16,342,25,342,198,345,207,351,213,360,216,373,218,373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,212,232,216,243,218,243,225,141,225,141,218,142,218,152,216,160,212,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,87,207,93,212,101,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,325,0,335,-5,345,-17,354,-37,364,-68,372,-68,372,7,360,8,351,11,345,15, +39,16,33,11,372,0,372,0,33,11,25,9,372,0,25,9,12,7,114,225,12,225,25,216,114,225,25,216,33,212,114,225,33,212,39,206,114,225,39,206,42,197,114,225,42,197,42,183,114,225,42,183,93,212,114,225,93,212,102,216,114,225,102,216,114,218,93,17,88,22,42,40,42,40,88,22,85,29,42,40,85,29,42,183,42,183,85,29,84,39,42,183,84,39,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,93,17,42,25,99,15,99,15,42,25,39,16,99,15,39,16,107,14,107,14,39,16,372,0,107,14,372,0,150,14,150,14,372,0,158,15,243,225,141,225,152,216,243,225,152,216,160,213,243,225,160,213,166,207,243,225,166,207,170,199,243,225,170,199,171,189,243,225,171,189,224,213,243,225,224,213,232,216,243,225,232,216,243,218,213,39,213,189,171,189,171,189,213,189,214,199,171,189,214,199,218,207,221,17,217,22,171,39,171,39,217,22,214,29,171,39,214,29,171,189,297,22,293,17,372,0,372,0,293,17,287,15,372,0,287,15,278,14,373,225,270,225,282,216,373,225,282,216,291,213,373,225,291,213,296,207,373,225,296,207,299,200,373,225,299,200,300,189,373,225,300,189,351,213,373,225,351,213,360,216,373,225,360,216,373,218,342,40,342,183,300,189,300,189,342,183,342,198,300,189,342,198,345,207,351,11,345,16,300,39,300,39,345,16,342,25,300,39,342,25,300,189,372,0,372,7,360,8,372,0,360,8,351,11,372,0,351,11,299,29,372,0,299,29,297,22,372,0,278,14,235,14,372,0,235,14,228,15,372,0,228,15,164,17,372,0,164,17,158,15,170,29,168,22,228,15,170,29,228,15,221,17,170,29,221,17,171,39,372,0,12,7,12,0,42,25,93,17,42,40,164,17,228,15,168,22,171,189,214,29,213,39,299,29,351,11,300,39,300,189,342,25,342,40,282,216,270,225,270,218,351,213,300,189,345,207,152,216,141,225,141,218,224,213,171,189,218,207,25,216,12,225,12,218, +373,225,270,225,270,218,282,216,291,213,296,207,299,200,300,189,300,39,299,29,297,22,293,17,287,15,278,14,235,14,228,15,221,17,217,22,214,29,213,39,213,189,214,199,218,207,224,212,232,216,243,218,243,225,141,225,141,218,142,218,152,216,160,212,166,207,170,199,171,189,171,39,170,29,168,22,164,17,158,15,150,14,107,14,99,15,93,17,88,22,85,29,84,39,84,189,85,199,87,207,93,212,101,216,114,218,114,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,325,0,335,-5,345,-17,354,-37,364,-68,372,-68,372,7,360,8,351,11,345,15,342,25,342,198,345,207,351,213,360,216,373,218,126,126,126,199,129,207,134,212,143,216,156,218,156,225,8,225,4,161,12,161,18,181,25,195,35,205,46,209,61,211,68,211,74,209,79,207,83,202,84,195,84,40,83,25,80,16,75,11,66,9,52,7,52,0,169,0,196,3,220,10,238,23,249,40,253,62,249,86,235,105,215,117,188,124,158,126,16383,16383,126,112,148,112,167,111,183,107,196,98,205,84,208,64,205,43,196,29,182,20,164,15,142,14,135,14,130,16,127,19,126,23,126,30,323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7, +39,16,33,11,315,0,315,0,33,11,25,9,315,0,25,9,12,7,114,225,12,225,25,216,114,225,25,216,33,212,114,225,33,212,39,206,114,225,39,206,42,197,114,225,42,197,42,183,114,225,42,183,93,212,114,225,93,212,101,216,114,225,101,216,114,218,93,17,88,22,42,40,42,40,88,22,85,29,42,40,85,29,42,183,42,183,85,29,84,39,42,183,84,39,84,189,42,183,84,189,85,199,42,183,85,199,87,207,42,183,87,207,93,212,93,17,42,25,99,15,99,15,42,25,39,16,99,15,39,16,107,14,107,14,39,16,315,0,107,14,315,0,150,14,150,14,315,0,158,15,243,225,141,225,142,218,243,225,142,218,152,216,243,225,152,216,160,212,243,225,160,212,166,207,243,225,166,207,170,199,243,225,170,199,171,189,243,225,171,189,224,212,243,225,224,212,232,216,243,225,232,216,243,218,213,39,213,189,171,189,171,189,213,189,214,199,171,189,214,199,218,207,221,17,217,22,171,39,171,39,217,22,214,29,171,39,214,29,171,189,373,225,270,225,282,216,373,225,282,216,291,213,373,225,291,213,296,207,373,225,296,207,299,200,373,225,299,200,300,189,373,225,300,189,351,213,373,225,351,213,360,216,373,225,360,216,373,218,345,15,342,25,345,-17,345,-17,342,25,342,40,342,40,342,183,335,-5,335,-5,342,183,325,0,300,189,315,0,342,198,342,198,315,0,325,0,342,198,325,0,342,183,345,207,351,213,300,189,345,207,300,189,342,198,372,-68,372,7,364,-68,364,-68,372,7,360,8,364,-68,360,8,354,-37,354,-37,360,8,351,11,354,-37,351,11,345,15,297,22,293,17,315,0,315,0,293,17,287,15,315,0,287,15,278,14,315,0,300,189,300,39,315,0,300,39,299,29,315,0,299,29,297,22,315,0,278,14,235,14,315,0,235,14,228,15,315,0,228,15,168,22,315,0,168,22,164,17,315,0,164,17,158,15,170,29,168,22,228,15,170,29,228,15,221,17,170,29,221,17,171,39,315,0,12,7,12,0,42,25,93,17,42,40,171,189,214,29,213,39,345,-17,342,40,335,-5,345,15,345,-17,354,-37,282,216,270,225,270,218,142,218,141,225,141,218,224,212,171,189,218,207,25,216,12,225,12,218, +126,126,126,199,129,207,134,212,143,216,156,218,156,225,8,225,4,161,12,161,18,181,25,195,35,205,46,209,61,211,68,211,74,209,79,207,83,202,84,195,84,40,83,25,80,16,75,11,66,9,52,7,52,0,169,0,196,3,220,10,238,23,249,40,253,62,249,86,235,105,215,117,188,124,158,126,16383,16383,126,112,148,112,167,111,183,107,196,98,205,84,208,64,205,43,196,29,182,20,164,15,142,14,135,14,130,16,127,19,126,23,126,30,323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,219,0,16383,16383,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105, +80,16,75,11,169,0,169,0,75,11,66,9,169,0,66,9,52,7,74,209,156,225,68,211,68,211,156,225,61,211,46,209,61,211,156,225,46,209,156,225,8,225,156,225,74,209,79,207,156,225,79,207,83,202,156,225,83,202,84,195,156,225,84,195,134,212,156,225,134,212,143,216,156,225,143,216,156,218,84,195,126,23,126,30,126,126,126,112,148,112,126,126,148,112,158,126,158,126,148,112,167,111,158,126,167,111,188,124,188,124,167,111,183,107,188,124,183,107,196,98,84,195,126,30,126,189,84,195,126,189,126,199,84,195,126,199,129,207,84,195,129,207,134,212,8,225,4,161,12,161,8,225,12,161,18,181,8,225,18,181,25,195,8,225,25,195,35,205,8,225,35,205,46,209,205,43,196,29,196,3,196,3,196,29,182,20,196,3,182,20,169,0,169,0,182,20,164,15,169,0,164,15,142,14,142,14,135,14,169,0,169,0,135,14,130,16,169,0,130,16,83,25,83,25,130,16,84,40,196,3,220,10,205,43,205,43,220,10,208,64,215,117,208,64,220,10,215,117,220,10,235,105,235,105,220,10,238,23,235,105,238,23,249,86,249,86,238,23,249,40,249,86,249,40,253,62,215,117,188,124,196,98,215,117,196,98,205,84,215,117,205,84,208,64,84,40,130,16,127,19,84,40,127,19,126,23,84,40,126,23,84,195,169,0,52,7,52,0,80,16,169,0,83,25, +323,0,323,8,310,10,301,13,295,18,293,26,292,36,292,199,295,207,300,212,309,216,323,218,323,225,219,225,219,218,232,216,241,212,246,206,249,197,250,183,250,40,249,25,246,16,241,11,232,9,219,7,219,0,16383,16383,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53, +323,218,323,218,309,216,309,216,323,218,323,225,309,216,323,225,300,212,300,212,323,225,249,197,300,212,249,197,250,183,293,26,250,183,250,40,293,26,250,40,295,18,295,18,250,40,301,13,292,36,292,189,250,183,250,183,292,189,292,199,250,183,292,199,295,207,323,225,219,225,232,216,323,225,232,216,241,212,323,225,241,212,246,206,323,225,246,206,249,197,323,0,323,8,310,10,323,0,310,10,301,13,323,0,301,13,250,40,323,0,250,40,249,25,323,0,249,25,246,16,323,0,246,16,241,11,323,0,241,11,232,9,323,0,232,9,219,7,323,0,219,7,219,0,39,16,33,11,127,0,127,0,33,11,25,9,127,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,23,84,30,84,126,84,112,107,112,84,126,107,112,118,126,118,126,107,112,126,111,118,126,126,111,148,124,148,124,126,111,142,107,148,124,142,107,155,98,42,183,84,30,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,164,43,155,29,155,3,155,3,155,29,141,20,155,3,141,20,127,0,127,0,141,20,123,15,127,0,123,15,102,14,102,14,94,14,127,0,127,0,94,14,89,16,127,0,89,16,42,25,42,25,89,16,42,40,155,3,179,10,164,43,164,43,179,10,167,64,174,117,167,64,179,10,174,117,179,10,194,105,194,105,179,10,197,23,194,105,197,23,208,86,208,86,197,23,209,40,208,86,209,40,213,62,174,117,148,124,155,98,174,117,155,98,164,84,174,117,164,84,167,64,42,40,89,16,86,19,42,40,86,19,85,23,42,40,85,23,42,183,127,0,12,7,12,0,39,16,127,0,42,25,25,216,12,225,12,218,250,183,293,26,292,36,232,216,219,225,219,218,300,212,250,183,295,207, +84,126,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,127,0,155,3,179,10,197,23,209,40,213,62,208,86,194,105,174,117,148,124,118,126,16383,16383,84,112,107,112,126,111,142,107,155,98,164,84,167,64,164,43,155,29,141,20,123,15,102,14,94,14,89,16,86,19,85,23,84,30,30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,32,32,49,14,72,0,101,-4,136,1,165,16,187,41,200,73,205,110,201,147,189,179,169,206,140,223,102,230,92,230,84,229,63,222,59,220,56,218,52,217,48,217, +39,16,33,11,127,0,127,0,33,11,25,9,127,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,42,183,85,23,84,30,84,126,84,112,107,112,84,126,107,112,118,126,118,126,107,112,126,111,118,126,126,111,148,124,148,124,126,111,142,107,148,124,142,107,155,98,42,183,84,30,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,164,43,155,29,155,3,155,3,155,29,141,20,155,3,141,20,127,0,127,0,141,20,123,15,127,0,123,15,102,14,102,14,94,14,127,0,127,0,94,14,89,16,127,0,89,16,42,25,42,25,89,16,42,40,155,3,179,10,164,43,164,43,179,10,167,64,174,117,167,64,179,10,174,117,179,10,194,105,194,105,179,10,197,23,194,105,197,23,208,86,208,86,197,23,209,40,208,86,209,40,213,62,174,117,148,124,155,98,174,117,155,98,164,84,174,117,164,84,167,64,42,40,89,16,86,19,42,40,86,19,85,23,42,40,85,23,42,183,127,0,12,7,12,0,39,16,127,0,42,25,25,216,12,225,12,218, +30,228,23,157,32,157,38,173,46,189,58,203,75,212,99,216,122,212,140,200,154,182,162,157,165,128,75,128,75,112,165,112,160,87,150,64,135,47,114,35,88,31,71,33,56,37,42,46,28,59,15,78,7,74,18,53,32,32,49,14,72,0,101,-4,136,1,165,16,187,41,200,73,205,110,201,147,189,179,169,206,140,223,102,230,92,230,84,229,63,222,59,220,56,218,52,217,48,217,44,218,42,219,40,221,38,224,37,228,84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,131,108,138,70,153,39,176,16,205,0,239,-4,276,1,308,17,331,43,346,76,352,116,346,154,331,186,308,210,278,225,243,230,207,225,177,211,154,189,138,160,131,124,16383,16383,306,102,304,70,296,44,284,25, +59,220,56,218,58,203,58,203,56,218,52,217,58,203,52,217,48,217,48,217,44,218,46,189,46,189,44,218,42,219,46,189,42,219,40,221,30,228,32,157,37,228,37,228,32,157,38,173,37,228,38,173,38,224,38,224,38,173,46,189,38,224,46,189,40,221,15,78,18,53,28,59,28,59,18,53,32,32,28,59,32,32,42,46,42,46,32,32,49,14,42,46,49,14,56,37,56,37,49,14,72,0,56,37,72,0,71,33,71,33,72,0,88,31,114,35,88,31,101,-4,114,35,101,-4,136,1,99,216,92,230,84,229,99,216,84,229,78,227,99,216,78,227,75,212,99,216,102,230,92,230,75,212,78,227,72,225,75,212,72,225,66,223,75,212,66,223,63,222,75,212,63,222,59,220,75,212,59,220,58,203,48,217,46,189,58,203,75,128,165,112,165,128,165,128,165,112,165,16,165,128,165,16,169,206,205,110,201,147,200,73,200,73,201,147,189,179,200,73,189,179,187,41,187,41,189,179,169,206,187,41,169,206,165,16,169,206,140,223,140,200,169,206,140,200,154,182,169,206,154,182,162,157,169,206,162,157,165,128,122,212,140,200,140,223,122,212,140,223,102,230,122,212,102,230,99,216,165,112,160,87,165,16,165,16,160,87,150,64,165,16,150,64,136,1,136,1,150,64,135,47,136,1,135,47,114,35,88,31,72,0,101,-4,18,53,15,78,7,74,32,157,30,228,23,157,165,112,75,128,75,112, +84,124,84,189,85,199,88,207,93,212,102,216,116,218,116,225,12,225,12,218,25,216,33,212,39,206,42,197,42,25,39,16,33,11,25,9,12,7,12,0,116,0,116,7,102,9,93,13,88,18,85,26,84,36,84,108,131,108,138,70,153,39,176,16,205,0,239,-4,276,1,308,17,331,43,346,76,352,116,346,154,331,186,308,210,278,225,243,230,207,225,177,211,154,189,138,160,131,124,16383,16383,306,102,304,70,296,44,284,25,268,13,248,9,237,10,227,13,218,18,210,25,203,34,193,51,185,70,180,91,177,113,176,137,179,164,186,186,199,202,215,212,234,216,246,215,257,211,266,206,274,199,281,191,290,177,297,161,302,142,305,122,306,102,224,225,121,225,91,224,65,219,45,210,31,193,26,167,30,148,40,131,55,118,74,109,97,104,37,31,32,25,26,19,19,14,11,9,2,7,2,0,64,0,142,103,151,103,151,25,148,16,143,11,135,8,123,7,123,0,224,0,224,8,211,10,202,13,197,18,194,26,193,40,193,183,194,198,197,207,202,213,211,216,224,218,16383,16383,151,117,131,117,111,119,94,125,82,135,74,148,71,165,75,185,85,198,99,206,117,210,136,211,142,211,147,209,149,206,151,202,151,195,193,286,191,294,188,301,182,306,175,310,167,311,160,310,153,306,148,301,144,294,143,286,144,278,147,272,153,266,159,263,167,262,175,263,182,266,188,272,191,278,193,286,16383,16383, +39,16,33,11,116,0,116,0,33,11,25,9,116,0,25,9,12,7,116,225,12,225,25,216,116,225,25,216,33,212,116,225,33,212,39,206,116,225,39,206,42,197,116,225,42,197,93,212,116,225,93,212,102,216,116,225,102,216,116,218,138,160,131,124,131,108,131,108,131,124,84,124,131,108,84,124,84,108,85,26,84,36,42,183,85,26,42,183,42,40,42,183,84,36,84,189,42,183,84,189,85,199,42,183,85,199,88,207,42,183,88,207,93,212,42,183,93,212,42,197,116,0,116,7,102,9,116,0,102,9,93,13,116,0,93,13,42,40,116,0,42,40,42,25,116,0,42,25,39,16,42,40,93,13,88,18,42,40,88,18,85,26,180,91,176,16,185,70,185,70,176,16,205,0,185,70,205,0,193,51,193,51,205,0,203,34,210,25,203,34,205,0,210,25,205,0,239,-4,278,225,243,230,246,215,246,215,243,230,234,216,215,212,234,216,243,230,215,212,243,230,207,225,304,70,296,44,308,17,308,17,296,44,284,25,308,17,284,25,276,1,276,1,284,25,268,13,276,1,268,13,248,9,248,9,237,10,239,-4,239,-4,237,10,227,13,239,-4,227,13,218,18,257,211,266,206,278,225,278,225,266,206,274,199,278,225,274,199,281,191,281,191,290,177,308,210,308,210,290,177,297,161,308,210,297,161,302,142,346,154,331,186,331,43,346,154,331,43,346,76,346,154,346,76,352,116,304,70,308,17,306,102,306,102,308,17,308,210,308,210,308,17,331,43,308,210,331,43,331,186,308,210,302,142,305,122,308,210,305,122,306,102,308,210,278,225,281,191,248,9,239,-4,276,1,176,137,179,164,177,211,177,211,179,164,186,186,177,211,186,186,207,225,207,225,186,186,199,202,207,225,199,202,215,212,131,108,138,70,138,160,138,160,138,70,153,39,138,160,153,39,154,189,154,189,153,39,176,16,154,189,176,16,176,137,176,137,177,211,154,189,177,113,176,137,176,16,177,113,176,16,180,91,278,225,246,215,257,211,210,25,239,-4,218,18,116,0,12,7,12,0,25,216,12,225,12,218, +224,225,121,225,91,224,65,219,45,210,31,193,26,167,30,148,40,131,55,118,74,109,97,104,37,31,32,25,26,19,19,14,11,9,2,7,2,0,64,0,142,103,151,103,151,25,148,16,143,11,135,8,123,7,123,0,224,0,224,8,211,10,202,13,197,18,194,26,193,40,193,183,194,198,197,207,202,213,211,216,224,218,16383,16383,151,117,131,117,111,119,94,125,82,135,74,148,71,165,75,185,85,198,99,206,117,210,136,211,142,211,147,209,149,206,151,202,151,195,193,286,191,294,188,301,182,306,175,310,167,311,160,310,153,306,148,301,144,294,143,286,144,278,147,272,153,266,159,263,167,262,175,263,182,266,188,272,191,278,193,286,16383,16383,93,286,92,294,88,301,83,306,76,310,68,311,60,310,54,306,48,301,45,294,44,286,45,278,48,272,53,266,60,263,68,262,76,263,83,266,88,272,92,278,93,286,16383,16383,210,82,196,63,182,48,167,39,150,33,132,31,102,37,80,53,66,77,58,106,55,137,209,137,208,152,205,165,202,176, +26,19,19,14,64,0,64,0,19,14,11,9,64,0,11,9,2,7,97,104,64,0,142,103,97,104,142,103,111,119,97,104,111,119,94,125,97,104,94,125,82,135,97,104,82,135,74,148,97,104,74,148,74,109,85,198,91,224,75,185,75,185,91,224,65,219,75,185,65,219,71,165,71,165,74,109,74,148,26,167,30,148,31,193,31,193,30,148,40,131,31,193,40,131,45,210,45,210,40,131,55,118,45,210,55,118,65,219,65,219,55,118,74,109,65,219,74,109,71,165,148,16,143,11,224,0,224,0,143,11,135,8,224,0,135,8,123,7,147,209,224,225,142,211,142,211,224,225,136,211,117,210,136,211,121,225,117,210,121,225,99,206,99,206,121,225,91,224,99,206,91,224,85,198,224,8,211,10,224,0,224,0,211,10,202,13,224,0,202,13,151,38,151,38,202,13,197,18,151,38,197,18,151,103,151,103,197,18,151,117,151,103,151,117,142,103,142,103,151,117,131,117,142,103,131,117,111,119,64,0,97,104,37,31,64,0,37,31,32,25,64,0,32,25,26,19,224,225,147,209,149,206,224,225,149,206,151,202,224,225,151,202,151,195,224,225,151,195,202,213,224,225,202,213,211,216,224,225,211,216,224,218,193,40,193,183,151,195,151,195,193,183,194,198,151,195,194,198,197,207,151,195,194,26,193,40,224,225,121,225,136,211,151,117,197,18,194,26,151,117,194,26,151,195,151,25,148,16,224,0,151,25,224,0,151,38,224,0,123,7,123,0,202,213,151,195,197,207,64,0,2,7,2,0, +266,59,253,44,242,34,234,29,228,26,222,25,216,28,216,31,215,33,216,38,217,44,218,49,220,55,221,61,247,151,249,159,252,180,252,186,250,202,245,214,236,223,224,228,208,230,189,227,169,216,147,196,123,165,99,123,98,123,133,252,205,278,211,300,139,273,146,296,148,306,151,315,153,324,156,332,158,340,155,342,143,337,131,333,116,329,98,325,76,320,76,312,85,312,92,311,99,309,103,306,104,301,104,293,103,290,103,286,93,257,45,239,40,218,87,234,23,0,65,0,78,41,88,72,98,97,109,117,121,137,137,159,152,177,167,191,180,200,190,203,198,202,203,199,207,194,209,188,209,175,207,161,206,155,204,150,185,78,182,66,178,54,175,41,173,31,172,23,174,13,177,5,183,0,190,-3,199,-4,211,-2,225,3,240,14,256,30,273,54,344,337,341,331,335,324,327,316,316,310,302,308,271,312,246,322,222,334,193,344,154,348,118,342,88,327,65,305,51,278,46,248,49,224,60,204,77,189,100,179,128,176,136,176,144,177,151,179,159,182,167,186,163,197,157,195,150,193,144,191,137,190,131,190,116,192,102,198,90,208,82,222,79,241,83,262,93,278,106,289,122,295,138,297,168,293,193,283,216,272,242,262,273,258,303,263,325,276,340,294,349,314,355,334,16383,16383,352,209,344,217,335,225,325,231,312,235,295,237,275,234,257,225,241,212,231,195,227,174,232,145,243,121,257,99,269,76,273,49,271,34,264,22,253,11,238,5,219,2,204,4,191,8,181,16,172,28,165,44,158,63,149,82,136,98,118,110,94,114,72,109,53,97,38,82,28,65,22,51,34,49,39,57,45,64,53,69,61,73, +99,123,98,123,99,123,99,123,98,123,109,117,99,123,109,117,123,165,123,165,109,117,121,137,104,296,104,293,133,252,133,252,104,293,103,290,133,252,103,290,103,286,103,286,93,257,98,123,98,123,93,257,98,97,98,123,98,97,109,117,203,199,208,230,198,202,198,202,208,230,190,203,180,200,190,203,189,227,180,200,189,227,169,216,123,165,137,159,147,196,147,196,137,159,152,177,147,196,152,177,169,216,169,216,152,177,167,191,169,216,167,191,180,200,204,150,185,78,190,-3,204,150,190,-3,199,-4,204,150,199,-4,211,-2,204,150,211,-2,206,155,211,-2,216,31,215,33,215,33,224,228,211,-2,211,-2,224,228,209,181,211,-2,209,181,209,175,211,-2,209,175,208,168,224,228,215,33,216,38,224,228,216,38,217,44,224,228,217,44,218,49,224,228,218,49,220,55,224,228,220,55,221,61,224,228,221,61,247,151,224,228,247,151,236,223,209,188,209,181,224,228,209,188,224,228,208,230,209,188,208,230,207,194,208,230,189,227,190,203,249,159,250,166,250,202,250,202,250,166,251,173,250,202,251,173,252,186,252,186,251,173,252,180,247,151,249,159,250,202,247,151,250,202,245,214,247,151,245,214,236,223,218,27,225,3,220,26,220,26,225,3,222,25,228,26,222,25,225,3,228,26,225,3,240,14,256,30,273,54,266,59,256,30,266,59,253,44,256,30,253,44,242,34,256,30,242,34,240,14,234,29,228,26,240,14,234,29,240,14,242,34,225,3,218,27,216,28,225,3,216,28,216,31,225,3,216,31,211,-2,207,161,206,155,211,-2,207,161,211,-2,208,168,183,0,190,-3,185,78,183,0,185,78,182,66,183,0,182,66,178,54,183,0,178,54,177,5,175,41,173,31,174,13,175,41,174,13,177,5,175,41,177,5,178,54,65,0,78,41,87,234,87,234,78,41,88,72,87,234,88,72,93,257,93,257,88,72,98,97,45,239,40,218,87,234,45,239,87,234,93,257,85,312,92,311,98,325,98,325,92,311,99,309,98,325,99,309,116,329,116,329,99,309,103,306,116,329,103,306,104,301,104,301,104,299,133,252,133,252,104,299,104,296,76,320,76,312,85,312,76,320,85,312,98,325,151,315,153,324,155,342,155,342,153,324,156,332,155,342,156,332,158,340,133,252,139,273,143,337,143,337,139,273,146,296,143,337,146,296,155,342,155,342,146,296,148,306,155,342,148,306,151,315,133,252,143,337,131,333,133,252,131,333,116,329,133,252,116,329,104,301,103,286,98,123,133,252,139,273,133,252,205,278,139,273,205,278,211,300,65,0,87,234,23,0,174,13,173,31,172,23,208,230,203,199,207,194,121,137,137,159,123,165, +344,337,341,331,335,324,327,316,316,310,302,308,271,312,246,322,222,334,193,344,154,348,118,342,88,327,65,305,51,278,46,248,49,224,60,204,77,189,100,179,128,176,136,176,144,177,151,179,159,182,167,186,163,197,157,195,150,193,144,191,137,190,131,190,116,192,102,198,90,208,82,222,79,241,83,262,93,278,106,289,122,295,138,297,168,293,193,283,216,272,242,262,273,258,303,263,325,276,340,294,349,314,355,334,16383,16383,352,209,344,217,335,225,325,231,312,235,295,237,275,234,257,225,241,212,231,195,227,174,232,145,243,121,257,99,269,76,273,49,271,34,264,22,253,11,238,5,219,2,204,4,191,8,181,16,172,28,165,44,158,63,149,82,136,98,118,110,94,114,72,109,53,97,38,82,28,65,22,51,34,49,39,57,45,64,53,69,61,73,69,74,75,73,81,70,87,65,92,58,97,49,102,39,108,29,114,20,122,11,132,3,144,-3,157,-9,172,-13,192,-15,215,-16,253,-11,285,1,311,22,329,47,335,76,329,103,316,127,300,149,287,169,281,186,283,197,287,205,294,211,302,214,310,215,316,215,322,214,328,211,335,207,343,200,314,0,314,331,292,331,292,78,291,78,118,309,103,331,35,331,35,0,57,0,57,252,58,252,247,0,16383,16383,292,22,257,22,57,289,57,309,91,309,292,41,483,153,480,178,471,200,456,217,437,229,414,233,389,229,370,217,356,199,347,177,344,152,347,128,355,107,370,89,389,78,414,74,437,78,457,89,471,106,480,128,483,153,16383,16383,444,152,443,127,439,108,433,95,424,87,413,84,402,87,393,95,387,108,384,127,383,152,384,178,388,197,394,211,402,219,412,222,424,219,433,211,439,197,443,178,444,152,16383,16383,481,0,481,44,346,44,346,0,16383,16383,278,107,135,331,45,331,45,321,53,321,71,318,75,316,80,313,86,308,92,301,99,291,107,280,107,112,104,78,98,47,88,26,71,17,64,21,53,43,45,53,31,57,24,56,17,53,10,48,5,40,3,30,6,14,13,4,24,-2,38,-5,55,-6,91,2,113,27,124,60,128,97,129,131,129,246,291,-5,300,-5,300,186,301,219,303,253,309,284,319,305,335,314,343,309,348,300,354,288,362,278,376,274,383,275,390,278,397,283,402,291,403,301,401,317,394,327,383,334,369,337,353,338,316,329, +102,198,90,208,100,179,100,179,90,208,82,222,100,179,82,222,77,189,77,189,82,222,79,241,88,327,79,241,83,262,88,327,83,262,93,278,154,348,138,297,168,293,154,348,168,293,193,344,193,344,168,293,193,283,193,344,193,283,222,334,222,334,193,283,216,272,222,334,216,272,242,262,222,334,242,262,246,322,246,322,242,262,273,258,246,322,273,258,271,312,271,312,273,258,302,308,316,310,302,308,303,263,316,310,303,263,325,276,355,334,344,337,349,314,349,314,344,337,341,331,349,314,341,331,340,294,340,294,341,331,335,324,340,294,335,324,327,316,327,316,316,310,325,276,327,316,325,276,340,294,302,308,273,258,303,263,295,237,275,234,283,197,283,197,275,234,281,186,285,1,281,186,275,234,285,1,275,234,273,49,273,49,271,34,285,1,285,1,271,34,264,22,285,1,264,22,253,-11,253,-11,264,22,253,11,253,-11,253,11,238,5,325,231,312,235,316,215,316,215,312,235,310,215,302,214,310,215,312,235,302,214,312,235,295,237,295,237,283,197,287,205,295,237,287,205,294,211,295,237,294,211,302,214,343,200,352,209,344,217,343,200,344,217,335,225,343,200,335,225,335,207,316,215,322,214,325,231,325,231,322,214,328,211,325,231,328,211,335,225,335,225,328,211,335,207,335,76,329,103,329,47,329,47,329,103,316,127,329,47,316,127,311,22,311,22,316,127,300,149,311,22,300,149,287,169,287,169,281,186,285,1,287,169,285,1,311,22,238,5,219,2,253,-11,253,-11,219,2,215,-16,215,-16,219,2,204,4,215,-16,204,4,192,-15,192,-15,204,4,191,8,192,-15,191,8,181,16,93,278,106,289,118,342,118,342,106,289,122,295,118,342,122,295,154,348,154,348,122,295,138,297,65,305,51,278,60,204,65,305,60,204,77,189,65,305,77,189,79,241,65,305,79,241,88,327,51,278,46,248,49,224,51,278,49,224,60,204,157,195,150,193,151,179,151,179,150,193,144,191,151,179,144,191,144,177,144,177,144,191,137,190,144,177,137,190,136,176,136,176,137,190,131,190,128,176,136,176,131,190,128,176,131,190,116,192,128,176,116,192,102,198,128,176,102,198,100,179,159,182,167,186,163,197,159,182,163,197,157,195,159,182,157,195,151,179,94,114,72,109,75,73,75,73,72,109,69,74,61,73,69,74,72,109,61,73,72,109,53,97,53,97,38,82,39,57,53,97,39,57,45,64,53,97,45,64,53,69,53,97,53,69,61,73,34,49,39,57,38,82,34,49,38,82,28,65,34,49,28,65,22,51,81,70,87,65,94,114,94,114,87,65,92,58,94,114,92,58,97,49,97,49,102,39,118,110,118,110,102,39,108,29,118,110,108,29,114,20,122,11,132,3,136,98,136,98,132,3,144,-3,136,98,144,-3,149,82,149,82,144,-3,157,-9,149,82,157,-9,158,63,158,63,157,-9,172,-13,158,63,172,-13,165,44,165,44,172,-13,172,28,181,16,172,28,172,-13,181,16,172,-13,192,-15,118,110,114,20,122,11,118,110,122,11,136,98,118,110,94,114,97,49,231,195,232,145,241,212,241,212,232,145,243,121,241,212,243,121,257,225,257,225,243,121,257,99,257,225,257,99,275,234,275,234,257,99,269,76,275,234,269,76,273,49,232,145,231,195,227,174,94,114,75,73,81,70,88,327,93,278,118,342, + + +406,57,402,52,396,46,384,36,379,35,361,47,353,78,347,119,335,159,309,190,309,191,331,203,348,218,361,236,368,256,371,277,367,300,355,321,335,337,308,348,272,352,206,304,193,317,178,329,160,339,140,345,118,348,89,344,63,335,43,319,30,297,25,270,31,247,45,229,62,214,76,197,82,175,79,163,73,153,64,144,54,138,45,134,49,123,74,132,97,145,115,161,128,180,132,200,126,227,112,245,95,259,81,275,75,299,76,308,80,318,87,325,97,330,108,332,133,322,149,297,157,265,161,231,162,203,162,165,160,123,156,84,149,56,137,45,129,47,116,54,100,62,86,70,76,75,30,2,41,-3,51,9,56,14,60,17,63,20,70,17,83,11,97,3,111,-4,122,-10,149,19,173,53,193,88,209,125,220,161,257,170,269,162,276,149,280,132,282,113,283,94,284,70,289,44,298,21,313,1,333,-10,339,-10,355,0,372,11,388,24,403,36,415,47,16383,16383,222,179,223,189,223,200,224,212,224,233,223,242,222,253,220,265,217,276,214,286,225,297,235,304,245,310,255,313,266,314,283,310,296,302,305,291,310,278,312,266,310,246,303,226,289,208,268,192,238,182,356,0,248,142,271,153,290,167,303,186,311,208,314,233,308,271,291,298,265,317,232,328,195,331,35,331,35,0,118,0,118,136,155,136,252,0,16383,16383,246,302,262,293,275,281,284,268,290,251,292,232,290,214,284,197,274,182,261,170,246,161,16383,16383,224,160,218,159,212,159,207,158,201,158,196,157,118,157,118,309,203,309,208,308,214,307,224,305,16383,16383,313,22,264,22,181,136,184,136,186,135,206,135,213,136,219,136,225,137,16383,16383,96,22,57,22,57,309,96,309,382,0,382,11,365,13,350,18,337,26,326,36,314,47,382,113,368,127,300,61,284,80,254,120,224,158,250,166,274,178,295,196,309,217,315,244,306,281,282,306,250,323,213,331,177,334,35,334,35,321,57,320,73,315,85,307,92,292,94,269,94,65,92,42,85,27,73,18,57,14,35,12,35,0,197,0,197,12,175,14,158,18,147,27,140,42,138,65,138,152,145,152,149,151,162,151,165,152,172,152,270,31,200,-35,213,-49,282,17,295,0,16383,16383,138,283,140,298,146,308,156,314,168,317,182,318,212,315,235,307,251,293,261,271,264,240,259,207,244,186,222,174,194,168,163,166,158,166,153,167, +82,175,79,163,82,175,82,175,79,163,97,145,82,175,97,145,95,259,82,175,95,259,81,275,82,175,81,275,76,197,76,197,81,275,75,299,63,335,75,299,76,308,63,335,76,308,89,344,89,344,76,308,80,318,89,344,80,318,87,325,118,348,108,332,133,322,118,348,133,322,140,345,140,345,133,322,149,297,140,345,149,297,160,339,160,339,149,297,157,265,160,339,157,265,161,231,162,165,160,123,173,53,173,53,160,123,156,84,173,53,156,84,149,19,149,19,156,84,149,56,149,19,149,56,137,45,137,45,129,47,149,19,149,19,129,47,122,-10,220,161,257,170,222,179,220,161,222,179,222,253,220,161,222,253,220,265,220,161,220,265,217,276,220,161,217,276,214,286,220,161,214,286,209,125,222,179,223,189,223,242,223,242,223,189,223,200,223,242,223,200,224,233,224,233,223,200,224,212,224,233,224,212,224,223,206,304,193,317,193,88,193,88,193,317,178,329,193,88,178,329,173,53,173,53,178,329,162,203,63,20,70,17,76,75,76,75,70,17,83,11,76,75,83,11,86,70,86,70,83,11,97,3,86,70,97,3,100,62,100,62,97,3,111,-4,100,62,111,-4,116,54,116,54,111,-4,122,-10,116,54,122,-10,129,47,76,75,30,2,41,-3,76,75,41,-3,46,3,76,75,46,3,51,9,76,75,51,9,56,14,76,75,56,14,60,17,76,75,60,17,63,20,97,330,108,332,118,348,97,330,118,348,89,344,97,330,89,344,87,325,63,335,43,319,45,229,63,335,45,229,62,214,63,335,62,214,76,197,63,335,76,197,75,299,31,247,45,229,43,319,31,247,43,319,30,297,31,247,30,297,25,270,95,259,97,145,112,245,112,245,97,145,115,161,112,245,115,161,126,227,126,227,115,161,128,180,126,227,128,180,132,200,74,132,97,145,79,163,74,132,79,163,73,153,74,132,73,153,64,144,74,132,64,144,54,138,74,132,54,138,49,123,54,138,45,134,49,123,276,149,289,208,269,162,269,162,289,208,268,192,269,162,268,192,257,170,257,170,268,192,238,182,235,304,245,310,272,352,272,352,245,310,255,313,272,352,255,313,266,314,266,314,283,310,272,352,272,352,283,310,308,348,312,266,331,203,335,337,335,337,331,203,348,218,335,337,348,218,355,321,355,321,348,218,361,236,355,321,361,236,367,300,367,300,361,236,368,256,367,300,368,256,371,277,310,278,312,266,335,337,310,278,335,337,308,348,310,278,308,348,305,291,308,348,283,310,296,302,308,348,296,302,305,291,310,246,303,226,309,191,310,246,309,191,331,203,310,246,331,203,312,266,309,190,309,191,303,226,309,190,303,226,313,1,309,190,313,1,335,159,402,52,396,46,403,36,403,36,396,46,390,41,403,36,390,41,388,24,388,24,390,41,384,36,388,24,384,36,379,35,379,35,361,47,372,11,372,11,361,47,355,0,313,1,333,-10,335,159,335,159,333,-10,339,-10,335,159,339,-10,347,119,347,119,339,-10,355,0,347,119,355,0,353,78,353,78,355,0,361,47,283,94,284,70,289,208,289,208,284,70,289,44,289,208,289,44,303,226,303,226,289,44,298,21,303,226,298,21,313,1,276,149,280,132,289,208,289,208,280,132,282,113,289,208,282,113,283,94,406,57,402,52,403,36,406,57,403,36,415,47,379,35,372,11,388,24,272,352,206,304,214,286,272,352,214,286,225,297,272,352,225,297,235,304,206,304,193,88,209,125,206,304,209,125,214,286,161,231,162,203,178,329,161,231,178,329,160,339,222,179,257,170,238,182,162,165,173,53,162,203,222,179,223,242,222,253, +429,110,429,143,125,143,121,145,119,147,117,150,117,155,119,161,123,167,132,176,141,186,149,195,165,215,155,224,134,202,112,180,89,160,63,143,36,129,36,124,63,110,89,93,112,73,134,51,154,29,164,39,157,49,149,59,140,68,132,78,123,86,120,89,118,92,116,96,116,99,117,102,119,105,122,107,126,109,129,110,225,212,203,232,181,254,162,278,144,303,130,331,125,331,111,303,94,278,74,254,52,233,30,213,40,203,49,210,69,226,79,235,88,243,90,246,93,248,97,250,100,251,103,250,109,244,111,238,111,-77,144,-77,144,237,145,242,146,246,148,248,151,250,157,250,159,249,168,243,177,234,187,226,197,217,206,209,216,202,428,129, +121,145,119,147,119,105,119,105,119,147,117,150,119,105,117,150,117,102,117,102,117,150,117,153,116,99,112,180,112,73,112,73,112,180,89,160,112,73,89,160,89,93,89,93,89,160,63,143,89,93,63,143,63,110,63,110,63,143,36,129,63,110,36,129,36,124,155,224,134,202,141,186,155,224,141,186,149,195,155,224,149,195,157,205,155,224,157,205,165,215,134,202,112,180,118,158,134,202,118,158,119,161,134,202,119,161,121,164,134,202,121,164,123,167,134,202,123,167,132,176,134,202,132,176,141,186,117,155,118,158,112,180,117,155,112,180,117,153,140,68,132,78,134,51,134,51,132,78,123,86,134,51,123,86,120,89,129,143,125,143,126,109,129,143,126,109,129,110,129,143,129,110,429,110,129,143,429,110,429,143,122,107,126,109,125,143,122,107,125,143,121,145,122,107,121,145,119,105,154,29,164,39,157,49,154,29,157,49,149,59,154,29,149,59,140,68,154,29,140,68,134,51,116,96,116,99,112,73,116,96,112,73,117,94,117,94,112,73,134,51,117,94,134,51,118,92,118,92,134,51,120,89,117,102,117,153,116,99,117,153,112,180,116,99, +225,212,203,232,181,254,162,278,144,303,130,331,125,331,111,303,94,278,74,254,52,233,30,213,40,203,49,210,69,226,79,235,88,243,90,246,93,248,97,250,100,251,103,250,109,244,111,238,111,-77,144,-77,144,237,145,242,146,246,148,248,151,250,157,250,159,249,168,243,177,234,187,226,197,217,206,209,216,202,428,129,400,143,375,160,352,180,330,201,310,224,300,214,314,194,323,185,332,175,340,166,343,164,345,161,347,159,347,157,348,154,347,151,341,145,338,144,334,143,35,143,35,110,334,110,339,109,343,108,345,106,347,103,347,97,346,95,340,86,331,77,322,67,314,58,306,48,299,38,309,28,330,51,351,72,375,92, +90,246,93,248,94,278,94,278,93,248,95,249,94,278,95,249,111,303,111,303,95,249,97,250,111,303,97,250,100,251,100,251,103,250,111,303,111,303,103,250,106,247,111,303,106,247,109,244,110,241,111,238,111,303,111,303,111,238,125,331,125,331,111,238,144,-77,125,331,144,-77,130,331,130,331,144,-77,144,237,130,331,144,237,144,303,144,303,144,237,145,242,144,303,145,242,146,246,88,243,90,246,94,278,88,243,94,278,79,235,79,235,94,278,74,254,79,235,74,254,69,226,69,226,74,254,59,218,52,233,30,213,40,203,52,233,40,203,49,210,52,233,49,210,59,218,52,233,59,218,74,254,146,246,148,248,162,278,162,278,148,248,151,250,162,278,151,250,154,250,154,250,157,250,162,278,162,278,157,250,159,249,162,278,159,249,162,247,187,226,197,217,203,232,203,232,197,217,206,209,203,232,206,209,225,212,225,212,206,209,216,202,181,254,162,278,162,247,181,254,162,247,165,245,181,254,165,245,168,243,181,254,168,243,177,234,181,254,177,234,187,226,181,254,187,226,203,232,111,238,111,-77,144,-77,144,303,146,246,162,278,111,303,109,244,110,241, +428,129,400,143,375,160,352,180,330,201,310,224,300,214,314,194,323,185,332,175,340,166,343,164,345,161,347,159,347,157,348,154,347,151,341,145,338,144,334,143,35,143,35,110,334,110,339,109,343,108,345,106,347,103,347,97,346,95,340,86,331,77,322,67,314,58,306,48,299,38,309,28,330,51,351,72,375,92,400,110,428,124,216,50,206,43,186,27,168,9,165,7,163,5,160,3,158,3,156,2,153,3,147,9,145,12,145,331,112,331,112,16,111,11,110,8,105,3,99,3,96,4,90,8,88,10,78,19,69,28,49,44,40,51,30,41,53,20,74,-1,94,-24,111,-49,126,-77,131,-77,145,-49,162,-24,182,-1,203,20,225,41,444,129,417,143,391,160, +347,97,351,72,347,100,347,100,351,72,348,154,348,154,351,72,352,180,352,180,351,72,375,92,352,180,375,92,375,160,375,160,375,92,400,110,375,160,400,110,400,143,400,143,400,110,428,124,400,143,428,124,428,129,352,180,330,201,332,175,352,180,332,175,340,166,352,180,340,166,343,164,352,180,343,164,345,161,352,180,345,161,347,159,352,180,347,159,347,157,352,180,347,157,348,154,300,214,307,204,310,224,310,224,307,204,314,194,310,224,314,194,330,201,330,201,314,194,323,185,330,201,323,185,332,175,35,143,334,110,334,143,338,144,334,143,339,109,338,144,339,109,341,145,341,145,339,109,343,108,341,145,343,108,344,148,344,148,343,108,345,106,344,148,345,106,347,151,347,151,345,106,347,103,347,151,347,103,347,100,322,67,330,51,331,77,331,77,330,51,351,72,331,77,351,72,340,86,340,86,351,72,342,89,351,72,347,97,346,95,351,72,346,95,344,92,351,72,344,92,342,89,314,58,306,48,309,28,314,58,309,28,330,51,314,58,330,51,322,67,348,154,347,151,347,100,334,110,35,143,35,110,334,143,334,110,339,109,309,28,306,48,299,38, +216,50,206,43,186,27,168,9,165,7,163,5,160,3,158,3,156,2,153,3,147,9,145,12,145,331,112,331,112,16,111,11,110,8,105,3,99,3,96,4,90,8,88,10,78,19,69,28,49,44,40,51,30,41,53,20,74,-1,94,-24,111,-49,126,-77,131,-77,145,-49,162,-24,182,-1,203,20,225,41,444,129,417,143,391,160,368,180,346,201,325,224,315,214,322,204,330,194,339,185,348,175,359,164,361,161,363,157,363,154,362,151,360,148,357,145,354,144,350,143,108,143,104,145,102,147,100,150,100,155,101,158,107,167,116,176,125,186,133,195,141,205,148,215,138,224,96,180,72,160,47,143,19,129,19,124, +110,8,107,5,111,-49,111,-49,107,5,105,3,111,-49,105,3,102,3,102,3,99,3,111,-49,111,-49,99,3,96,4,111,-49,96,4,94,-24,94,-24,96,4,93,6,94,-24,93,6,90,8,150,6,147,9,162,-24,162,-24,147,9,145,12,162,-24,145,12,145,-49,145,-49,145,12,145,16,145,16,145,331,131,-77,131,-77,145,331,126,-77,145,331,112,331,126,-77,126,-77,112,331,112,16,126,-77,112,16,111,-49,111,-49,112,16,111,11,111,-49,111,11,110,8,163,5,160,3,162,-24,162,-24,160,3,158,3,162,-24,158,3,156,2,156,2,153,3,162,-24,162,-24,153,3,150,6,186,27,177,18,182,-1,182,-1,177,18,168,9,182,-1,168,9,165,7,206,43,196,35,203,20,206,43,203,20,225,41,206,43,225,41,216,50,186,27,182,-1,203,20,186,27,203,20,196,35,163,5,162,-24,182,-1,163,5,182,-1,165,7,90,8,88,10,94,-24,94,-24,88,10,78,19,94,-24,78,19,74,-1,74,-1,78,19,69,28,74,-1,69,28,59,36,53,20,74,-1,59,36,53,20,59,36,49,44,53,20,49,44,40,51,53,20,40,51,30,41,145,-49,145,16,131,-77, +444,129,417,143,391,160,368,180,346,201,325,224,315,214,322,204,330,194,339,185,348,175,359,164,361,161,363,157,363,154,362,151,360,148,357,145,354,144,350,143,108,143,104,145,102,147,100,150,100,155,101,158,107,167,116,176,125,186,133,195,141,205,148,215,138,224,96,180,72,160,47,143,19,129,19,124,47,110,72,93,95,73,117,51,137,29,147,39,133,59,124,68,115,78,104,89,102,92,100,94,100,96,99,99,100,102,103,105,109,109,113,110,350,110,355,109,358,108,361,106,363,100,362,97,362,95,356,86,347,77,338,67,330,58,322,48,315,38,325,28,345,51,367,72,391,92,417,110,444,124,225,246,203,266,182,288,162,312,145,337,131,365,126,365,112,337,94,312,74,288,53,267,31,247,40,237,50,244,70,260,79,269,88,277,93,282,96,283,100,285,104,284,107,281,111,275,112,272,112,-16,111,-21,110,-25,107,-28,105,-29,102,-30,93,-27,90,-25,88,-22,78,-13,69,-5,59,2,49,10,40,17,30,7,53,-12,74,-34,94,-58,111,-83,126,-111,131,-111,145,-83,162,-58,181,-34,203,-12,225,7,215,17,206,10,196,2,186,-5,163,-28,160,-29,158,-30,156,-30,153,-29,150,-27,147,-24,145,-20,145,276,147,280,149,282,152,284,157,284,160,283,169,277,178,268,187,260,197,251,206,243,216,236,428,-54, +104,145,102,147,103,105,103,105,102,147,100,150,103,105,100,150,100,102,100,102,100,150,100,153,99,99,96,180,95,73,95,73,96,180,72,160,95,73,72,160,72,93,72,93,72,160,47,143,72,93,47,143,47,110,47,110,47,143,19,129,47,110,19,129,19,124,138,224,117,202,125,186,138,224,125,186,133,195,138,224,133,195,141,205,138,224,141,205,148,215,117,202,96,180,101,158,117,202,101,158,103,161,117,202,103,161,105,164,117,202,105,164,107,167,117,202,107,167,116,176,117,202,116,176,125,186,100,155,101,158,96,180,100,155,96,180,100,153,124,68,115,78,117,51,117,51,115,78,107,86,117,51,107,86,104,89,137,29,147,39,140,49,137,29,140,49,133,59,137,29,133,59,124,68,137,29,124,68,117,51,363,100,367,72,363,154,363,154,367,72,368,180,368,180,367,72,391,92,368,180,391,92,391,160,391,160,391,92,417,110,391,160,417,110,417,143,417,143,417,110,444,124,417,143,444,124,444,129,368,180,346,201,348,175,368,180,348,175,357,166,368,180,357,166,359,164,368,180,359,164,361,161,368,180,361,161,362,159,368,180,362,159,363,157,368,180,363,157,363,154,315,214,322,204,325,224,325,224,322,204,330,194,325,224,330,194,346,201,346,201,330,194,339,185,346,201,339,185,348,175,350,110,355,109,350,143,354,144,350,143,355,109,354,144,355,109,357,145,357,145,355,109,358,108,357,145,358,108,360,148,360,148,358,108,361,106,360,148,361,106,362,151,362,151,361,106,362,103,362,151,362,103,363,100,338,67,345,51,347,77,347,77,345,51,367,72,347,77,367,72,356,86,356,86,367,72,358,89,362,97,362,95,367,72,362,97,367,72,363,100,360,92,358,89,367,72,360,92,367,72,362,95,330,58,322,48,325,28,330,58,325,28,345,51,330,58,345,51,338,67,363,154,362,151,363,100,350,110,350,143,113,110,113,110,350,143,113,143,113,110,113,143,109,109,108,143,104,145,106,107,108,143,106,107,109,109,108,143,109,109,113,143,100,96,99,99,95,73,100,96,95,73,100,94,100,94,95,73,117,51,100,94,117,51,102,92,102,92,117,51,104,89,100,102,100,153,99,99,104,145,103,105,106,107,325,28,322,48,315,38,100,153,96,180,99,99, +225,246,203,266,182,288,162,312,145,337,131,365,126,365,112,337,94,312,74,288,53,267,31,247,40,237,50,244,70,260,79,269,88,277,93,282,96,283,100,285,104,284,107,281,111,275,112,272,112,-16,111,-21,110,-25,107,-28,105,-29,102,-30,93,-27,90,-25,88,-22,78,-13,69,-5,59,2,49,10,40,17,30,7,53,-12,74,-34,94,-58,111,-83,126,-111,131,-111,145,-83,162,-58,181,-34,203,-12,225,7,215,17,206,10,196,2,186,-5,163,-28,160,-29,158,-30,156,-30,153,-29,150,-27,147,-24,145,-20,145,276,147,280,149,282,152,284,157,284,160,283,169,277,178,268,187,260,197,251,206,243,216,236,428,-54,118,271,115,274,111,280,110,282,110,285,111,287,111,288,112,290,113,291,115,292,117,294,121,295,124,296,153,296,166,297,178,298,190,300,190,315,182,314,173,313,125,313,103,315,81,318,60,324,39,331,35,328,43,306,48,285,51,263,53,241,54,219,53,210,53,193,52,184,51,176,65,176,68,188,70,214,70,243,72,249,73,251,76,254,77,254,78,255,83,255,85,254,88,254,92,252,404,-77,425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271, +69,-5,74,-34,78,-13,78,-13,74,-34,94,-58,78,-13,94,-58,88,-22,88,-22,94,-58,90,-25,91,280,93,282,94,312,94,312,93,282,96,283,94,312,96,283,112,337,112,337,96,283,98,284,112,337,98,284,100,285,100,285,104,284,112,337,112,337,104,284,107,281,112,337,107,281,109,278,110,-25,107,-28,111,-83,111,-83,107,-28,105,-29,111,-83,105,-29,102,-30,102,-30,99,-29,111,-83,111,-83,99,-29,96,-28,111,-83,96,-28,94,-58,94,-58,96,-28,93,-27,94,-58,93,-27,90,-25,109,278,111,275,112,337,112,337,111,275,112,272,112,272,126,-111,126,365,126,365,126,-111,131,-111,126,365,131,-111,131,365,131,365,131,-111,145,-83,131,365,145,-83,145,271,145,271,145,-83,145,-17,88,277,91,280,94,312,88,277,94,312,79,269,79,269,94,312,74,288,79,269,74,288,70,260,70,260,74,288,60,252,53,267,31,247,40,237,53,267,40,237,50,244,53,267,50,244,60,252,53,267,60,252,74,288,147,280,149,282,162,312,162,312,149,282,152,284,162,312,152,284,155,284,155,284,157,284,162,312,162,312,157,284,160,283,162,312,160,283,163,281,187,260,197,251,203,266,203,266,197,251,206,243,203,266,206,243,225,246,225,246,206,243,216,236,182,288,162,312,163,281,182,288,163,281,166,279,182,288,166,279,169,277,182,288,169,277,178,268,182,288,178,268,187,260,182,288,187,260,203,266,145,337,131,365,145,271,145,337,145,271,145,276,145,337,145,276,147,280,145,337,147,280,162,312,163,-28,160,-29,162,-58,162,-58,160,-29,158,-30,162,-58,158,-30,156,-30,156,-30,153,-29,162,-58,162,-58,153,-29,150,-27,162,-58,150,-27,147,-24,186,-5,177,-14,181,-34,181,-34,177,-14,168,-23,181,-34,168,-23,165,-26,206,10,196,2,203,-12,206,10,203,-12,225,7,206,10,225,7,215,17,186,-5,181,-34,203,-12,186,-5,203,-12,196,2,163,-28,162,-58,181,-34,163,-28,181,-34,165,-26,145,-20,145,-17,145,-83,145,-20,145,-83,162,-58,145,-20,162,-58,147,-24,112,-16,111,-21,111,-83,112,-16,111,-83,126,-111,112,-16,126,-111,112,272,59,2,49,10,53,-12,59,2,53,-12,74,-34,59,2,74,-34,69,-5,40,17,30,7,53,-12,40,17,53,-12,49,10,110,-25,111,-83,111,-21,112,337,112,272,126,365, +428,-54,118,271,115,274,111,280,110,282,110,285,111,287,111,288,112,290,113,291,115,292,117,294,121,295,124,296,153,296,166,297,178,298,190,300,190,315,182,314,173,313,125,313,103,315,81,318,60,324,39,331,35,328,43,306,48,285,51,263,53,241,54,219,53,210,53,193,52,184,51,176,65,176,68,188,70,214,70,243,72,249,73,251,76,254,77,254,78,255,83,255,85,254,88,254,92,252,404,-77,425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,35,-54,59,-77,372,252,373,253,375,254,377,254,380,255,385,255,387,254,388,254,388,253,390,251,391,249,392,246,392,226,393,214,395,188,397,176,411,176,411,185,410,193,410,241,412,263,415,285,421,307,428,328, +48,285,51,263,60,324,60,324,51,263,53,241,60,324,53,241,54,219,54,219,53,210,65,176,65,176,53,210,53,201,65,176,53,201,53,193,60,324,39,331,43,306,60,324,43,306,48,285,77,254,78,255,81,318,81,318,78,255,79,255,81,318,79,255,80,255,80,255,83,255,81,318,81,318,83,255,103,315,81,318,60,324,71,246,81,318,71,246,72,249,81,318,72,249,73,251,81,318,73,251,75,253,81,318,75,253,76,254,81,318,76,254,77,254,65,176,68,188,70,243,70,243,68,188,69,201,70,243,69,201,70,239,70,239,69,201,70,214,70,239,70,214,70,226,60,324,54,219,65,176,60,324,65,176,70,243,60,324,70,243,71,246,52,184,51,176,65,176,52,184,65,176,53,193,103,315,92,252,110,282,103,315,110,282,110,284,110,284,110,285,103,315,103,315,110,285,111,287,103,315,111,287,111,288,103,315,83,255,85,254,103,315,85,254,88,254,103,315,88,254,90,253,103,315,90,253,92,252,103,315,111,288,125,313,125,313,111,288,112,290,125,313,112,290,113,291,113,291,115,292,125,313,125,313,115,292,117,294,125,313,117,294,121,295,147,313,127,296,140,296,147,313,140,296,153,296,147,313,147,312,125,313,147,313,125,313,127,296,165,313,166,297,173,313,173,313,166,297,178,298,173,313,178,298,182,314,182,314,178,298,190,300,182,314,190,300,190,315,156,313,147,312,147,313,156,313,147,313,153,296,156,313,153,296,166,297,156,313,166,297,165,313,124,296,127,296,125,313,124,296,125,313,121,295,428,-54,118,271,404,-77,404,-77,118,271,115,274,404,-77,115,274,92,252,92,252,115,274,113,277,92,252,113,277,111,280,43,306,39,331,35,328,92,252,111,280,110,282, +425,331,403,324,382,318,360,315,338,313,289,313,281,314,272,315,272,300,284,298,297,297,309,296,339,296,342,295,346,294,348,292,350,291,351,290,352,288,353,287,353,282,352,280,348,274,345,271,35,-54,59,-77,372,252,373,253,375,254,377,254,380,255,385,255,387,254,388,254,388,253,390,251,391,249,392,246,392,226,393,214,395,188,397,176,411,176,411,185,410,193,410,241,412,263,415,285,421,307,428,328,428,-74,421,-53,415,-31,412,-9,410,12,410,60,411,68,411,76,397,77,395,65,392,26,392,7,391,4,390,2,387,-1,380,-1,377,0,373,0,372,2,59,331,35,307,345,-17,348,-20,352,-26,353,-28,353,-33,352,-34,351,-36,350,-36,346,-40,342,-41,335,-41,322,-42,309,-42,297,-43,284,-45,272,-46,272,-60,281,-60,289,-59,338,-59,360,-61,382,-65,403,-70,425,-77,428,307,404,331,92,2,90,0,88,0, +272,315,272,315,281,314,281,314,272,315,284,298,281,314,284,298,289,313,289,313,284,298,297,297,289,313,297,297,298,313,298,313,297,297,309,296,298,313,309,296,307,313,307,313,309,296,315,313,338,313,315,313,322,296,338,313,322,296,335,296,375,254,377,254,382,318,382,318,377,254,380,255,382,318,380,255,382,255,382,255,384,255,403,324,403,324,384,255,385,255,403,324,385,255,387,254,353,285,353,284,360,315,360,315,353,284,372,252,360,315,372,252,382,318,382,318,372,252,373,253,382,318,373,253,375,254,372,252,353,284,353,282,372,252,353,282,352,280,372,252,352,280,350,277,372,252,350,277,348,274,372,252,348,274,345,271,372,252,345,271,59,-77,410,193,410,201,403,324,403,324,410,201,410,210,403,324,410,210,410,219,410,219,410,241,403,324,403,324,410,241,412,263,403,324,412,263,415,285,403,324,415,285,425,331,425,331,415,285,421,307,425,331,421,307,428,328,395,188,397,176,403,324,403,324,397,176,411,176,403,324,411,176,410,193,410,193,411,176,411,185,403,324,387,254,388,254,403,324,388,254,388,253,403,324,388,253,390,251,403,324,390,251,391,249,403,324,391,249,392,246,403,324,392,246,392,243,403,324,392,243,392,239,403,324,392,239,392,226,403,324,392,226,393,214,403,324,393,214,394,201,403,324,394,201,395,188,403,324,382,318,382,255,360,315,338,313,339,296,360,315,339,296,342,295,360,315,342,295,346,294,360,315,346,294,348,292,360,315,348,292,350,291,360,315,350,291,351,290,360,315,351,290,352,288,360,315,352,288,353,287,360,315,353,287,353,285,335,296,339,296,338,313,315,313,309,296,322,296,59,-77,345,271,35,-54,284,298,272,315,272,300, +428,-74,421,-53,415,-31,412,-9,410,12,410,60,411,68,411,76,397,77,395,65,392,26,392,7,391,4,390,2,387,-1,380,-1,377,0,373,0,372,2,59,331,35,307,345,-17,348,-20,352,-26,353,-28,353,-33,352,-34,351,-36,350,-36,346,-40,342,-41,335,-41,322,-42,309,-42,297,-43,284,-45,272,-46,272,-60,281,-60,289,-59,338,-59,360,-61,382,-65,403,-70,425,-77,428,307,404,331,92,2,90,0,88,0,85,-1,77,-1,76,0,75,0,73,2,72,4,70,10,70,39,68,65,65,77,51,76,53,60,53,43,54,35,53,12,51,-9,48,-31,43,-53,35,-74,39,-77,60,-70,81,-65,103,-61,125,-59,173,-59,182,-60,190,-60,190,-46,178,-45,166,-43,153,-42,140,-42,127,-41,121,-41,117,-40,113,-36,112,-36,111,-34,111,-33,110,-32, +335,-41,322,-42,338,-59,338,-59,322,-42,315,-59,307,-59,315,-59,309,-42,307,-59,309,-42,298,-59,298,-59,309,-42,297,-43,298,-59,297,-43,289,-59,289,-59,297,-43,284,-45,289,-59,284,-45,281,-60,281,-60,284,-45,272,-46,281,-60,272,-46,272,-60,322,-42,309,-42,315,-59,353,-33,352,-34,360,-61,360,-61,352,-34,351,-36,360,-61,351,-36,350,-36,372,2,59,331,345,-17,372,2,345,-17,348,-20,372,2,348,-20,350,-23,372,2,350,-23,352,-26,372,2,352,-26,353,-28,372,2,353,-28,353,-30,372,2,353,-30,360,-61,372,2,360,-61,382,-65,372,2,382,-65,373,0,387,-1,385,-1,403,-70,403,-70,385,-1,384,-1,403,-70,384,-1,382,-1,382,-1,380,-1,382,-65,382,-65,380,-1,377,0,382,-65,377,0,375,0,360,-61,353,-30,353,-32,360,-61,353,-32,353,-33,393,39,392,26,403,-70,403,-70,392,26,392,14,403,-70,392,14,392,10,415,-31,412,-9,403,-70,403,-70,412,-9,410,12,403,-70,410,12,410,35,410,35,410,43,403,-70,403,-70,410,43,410,52,403,-70,410,52,410,60,411,76,397,77,403,-70,411,76,403,-70,410,60,411,76,410,60,411,68,403,-70,397,77,395,65,403,-70,395,65,394,52,403,-70,394,52,393,39,403,-70,392,10,392,7,403,-70,392,7,391,4,403,-70,391,4,390,2,403,-70,390,2,388,0,403,-70,388,0,387,-1,382,-1,382,-65,403,-70,425,-77,428,-74,421,-53,425,-77,421,-53,415,-31,425,-77,415,-31,403,-70,360,-61,350,-36,348,-38,360,-61,348,-38,346,-40,360,-61,346,-40,342,-41,360,-61,342,-41,339,-41,360,-61,339,-41,338,-59,339,-41,335,-41,338,-59,345,-17,59,331,35,307,373,0,382,-65,375,0, +428,307,404,331,92,2,90,0,88,0,85,-1,77,-1,76,0,75,0,73,2,72,4,70,10,70,39,68,65,65,77,51,76,53,60,53,43,54,35,53,12,51,-9,48,-31,43,-53,35,-74,39,-77,60,-70,81,-65,103,-61,125,-59,173,-59,182,-60,190,-60,190,-46,178,-45,166,-43,153,-42,140,-42,127,-41,121,-41,117,-40,113,-36,112,-36,111,-34,111,-33,110,-32,110,-28,111,-26,115,-20,118,-17,433,110,433,143,300,143,349,225,320,225,272,143,119,143,113,147,111,153,111,155,113,161,115,164,127,176,135,186,144,196,152,206,159,215,149,225,129,202,107,181,83,161,58,143,30,129,30,124,58,110,83,93,107,73,128,51,148,29,158,39,151,49,143,59,135,68,126,78,115,89,113,92,111,96,110,99,111,102,114,105,120,109,123,110,252,110,204,29,233,29,281,110,433,129,405,143,380,161, +78,-1,81,-65,79,-1,79,-1,81,-65,80,-1,83,-1,80,-1,81,-65,83,-1,81,-65,103,-61,111,-34,111,-33,103,-61,103,-61,111,-33,110,-32,103,-61,110,-32,110,-30,110,-30,110,-28,103,-61,103,-61,110,-28,92,2,103,-61,92,2,90,0,115,-20,118,-17,404,331,115,-20,404,331,92,2,404,331,118,-17,428,307,92,2,110,-28,111,-26,92,2,111,-26,113,-23,92,2,113,-23,115,-20,103,-61,90,0,88,0,103,-61,88,0,85,-1,103,-61,85,-1,83,-1,147,-59,140,-42,127,-41,147,-59,127,-41,125,-59,147,-59,153,-42,140,-42,156,-59,165,-59,166,-43,166,-43,165,-59,173,-59,166,-43,173,-59,178,-45,178,-45,173,-59,182,-60,178,-45,182,-60,190,-46,190,-46,182,-60,190,-60,156,-59,166,-43,153,-42,156,-59,153,-42,147,-59,121,-41,117,-40,125,-59,125,-59,117,-40,115,-38,125,-59,115,-38,113,-36,124,-41,121,-41,125,-59,124,-41,125,-59,127,-41,125,-59,113,-36,112,-36,125,-59,112,-36,111,-34,125,-59,111,-34,103,-61,81,-65,78,-1,77,-1,81,-65,77,-1,76,0,81,-65,76,0,75,0,81,-65,75,0,73,2,81,-65,73,2,72,4,81,-65,72,4,71,7,81,-65,71,7,60,-70,70,10,70,14,69,52,70,10,69,52,68,65,70,10,68,65,65,77,70,10,65,77,60,-70,70,10,60,-70,71,7,70,39,69,52,70,14,70,39,70,14,70,26,60,-70,65,77,54,35,60,-70,54,35,53,12,60,-70,53,12,51,-9,60,-70,51,-9,48,-31,60,-70,48,-31,43,-53,60,-70,43,-53,39,-77,53,60,53,51,65,77,65,77,53,51,53,43,65,77,53,43,54,35,65,77,51,76,52,68,65,77,52,68,53,60,43,-53,35,-74,39,-77, +279,331,243,331,206,232,74,232,36,331,1,331,123,0,156,0,16383,16383,195,201,140,51,84,201,202,110,169,110,169,65,165,48,155,37,141,30,128,27,117,26,107,26,92,29,78,36,67,47, +156,0,279,331,195,201,195,201,279,331,206,232,195,201,206,232,84,201,84,201,206,232,74,232,84,201,74,232,123,0,123,0,74,232,36,331,123,0,36,331,1,331,140,51,84,201,123,0,140,51,123,0,156,0,140,51,156,0,195,201,206,232,279,331,243,331, +202,110,169,110,169,65,165,48,155,37,141,30,128,27,117,26,107,26,92,29,78,36,67,47,63,65,63,308,67,326,78,337,92,344,105,346,116,347,126,347,140,344,154,338,165,326,169,307,169,262,202,262,202,305,196,339,180,360,158,373,136,379,117,380,97,379,74,373,52,361,36,339,30,306,30,65,36,32,51,11,72,0,94,-5,114,-6,134,-5,157,0,179,10,196,30,202,61,98,313,112,317,119,318,127,319,134,319,161,314,179,300,191,279,198,255,200,228,200,221,199,214,199,207,198,200,196,194,189,203,180,210,169,214,159,217,148,218,107,210,72,188,44,156,26,117,20,75,22,51,30,29,43,11,62,0,88,-5,148,9,190,47,217,98,231,154,235,204,232,250,220,287,202,313,175,329,142,334,131,334,121,333,101,327,93,323,16383,16383,184,160,182,140,180,131, +105,346,116,347,116,347,117,380,116,347,126,347,117,380,126,347,136,379,136,379,126,347,140,344,136,379,140,344,158,373,158,373,140,344,154,338,158,373,154,338,165,326,202,305,196,339,202,262,202,262,196,339,180,360,202,262,180,360,169,307,169,307,180,360,165,326,78,337,92,344,97,379,97,379,92,344,105,346,97,379,105,346,117,380,117,380,105,346,116,347,74,373,52,361,63,308,74,373,63,308,67,326,74,373,67,326,78,337,74,373,78,337,97,379,30,306,30,65,36,32,30,306,36,32,36,339,36,339,36,32,51,11,36,339,51,11,52,361,52,361,51,11,63,65,52,361,63,65,63,308,165,48,155,37,157,0,157,0,155,37,141,30,157,0,141,30,134,-5,134,-5,141,30,128,27,134,-5,128,27,117,26,117,26,107,26,114,-6,114,-6,107,26,94,-5,107,26,92,29,94,-5,94,-5,92,29,78,36,94,-5,78,36,72,0,72,0,78,36,67,47,72,0,67,47,63,65,63,65,51,11,72,0,202,110,169,110,179,10,202,110,179,10,196,30,202,110,196,30,202,61,179,10,169,110,169,65,179,10,169,65,165,48,179,10,165,48,157,0,117,26,114,-6,134,-5,202,262,169,307,169,262,158,373,165,326,180,360, +98,313,112,317,119,318,127,319,134,319,161,314,179,300,191,279,198,255,200,228,200,221,199,214,199,207,198,200,196,194,189,203,180,210,169,214,159,217,148,218,107,210,72,188,44,156,26,117,20,75,22,51,30,29,43,11,62,0,88,-5,148,9,190,47,217,98,231,154,235,204,232,250,220,287,202,313,175,329,142,334,131,334,121,333,101,327,93,323,16383,16383,184,160,182,140,180,131,178,121,176,110,166,80,152,53,135,30,116,15,94,9,78,13,68,21,63,33,61,46,60,59,65,100,79,139,99,172,124,194,153,203,161,201,169,197,177,189,182,176,184,160,243,0,243,331,36,331,36,298,210,298,210,182,42,182,42,149,210,149,210,33,36,33,36,0,243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,108,149,68,33,36,33,36,0,56,0,36,-60,65,-60,85,0,16383,16383,210,182,148,182,188,298,210,298,16383,16383,210,33,97,33,137,149,210,149,353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6, +127,319,134,319,134,319,142,334,134,319,161,314,142,334,161,314,175,329,175,329,161,314,179,300,175,329,179,300,202,313,202,313,179,300,191,279,202,313,191,279,198,255,112,317,119,318,121,333,121,333,119,318,127,319,121,333,127,319,131,334,131,334,127,319,134,319,131,334,134,319,142,334,93,323,98,313,101,327,101,327,98,313,105,315,101,327,105,315,111,330,111,330,105,315,112,317,111,330,112,317,121,333,152,53,135,30,148,9,148,9,135,30,116,15,148,9,116,15,94,9,94,9,78,13,88,-5,88,-5,78,13,68,21,88,-5,68,21,62,0,62,0,68,21,63,33,62,0,63,33,61,46,61,46,60,59,62,0,62,0,60,59,44,156,44,156,60,59,72,188,72,188,60,59,65,100,20,75,22,51,26,117,26,117,22,51,30,29,26,117,30,29,44,156,44,156,30,29,43,11,44,156,43,11,62,0,159,217,153,203,161,201,159,217,161,201,169,214,169,214,161,201,169,197,169,214,169,197,180,210,180,210,169,197,177,189,180,210,177,189,182,176,79,139,99,172,107,210,107,210,99,172,124,194,107,210,124,194,148,218,148,218,124,194,153,203,148,218,153,203,159,217,72,188,65,100,79,139,72,188,79,139,107,210,182,140,180,131,190,47,190,47,180,131,178,121,190,47,178,121,176,110,176,110,166,80,190,47,190,47,166,80,152,53,190,47,152,53,148,9,198,200,196,194,217,98,217,98,196,194,190,47,190,47,196,194,189,203,190,47,189,203,184,160,184,160,189,203,182,176,190,47,184,160,183,150,190,47,183,150,182,140,94,9,88,-5,148,9,235,204,232,250,231,154,231,154,232,250,220,287,231,154,220,287,217,98,217,98,220,287,202,313,217,98,202,313,200,228,200,228,202,313,198,255,217,98,200,228,200,221,217,98,200,221,199,214,217,98,199,214,199,207,217,98,199,207,198,200,180,210,182,176,189,203, +243,0,243,331,36,331,36,298,210,298,210,182,42,182,42,149,210,149,210,33,36,33,36,0,243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149, +42,182,210,149,210,182,210,182,210,149,243,0,210,182,243,0,210,298,210,298,243,0,243,331,210,298,243,331,36,331,243,0,210,149,210,33,243,0,210,33,36,33,243,0,36,33,36,0,210,298,36,331,36,298,210,149,42,182,42,149, +243,0,243,331,199,331,219,387,190,387,170,331,36,331,36,298,159,298,119,182,42,182,42,149,108,149,68,33,36,33,36,0,56,0,36,-60,65,-60,85,0,16383,16383,210,182,148,182,188,298,210,298,16383,16383,210,33,97,33,137,149,210,149,353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,324,28,348,74, +36,331,159,298,170,331,170,331,159,298,188,298,170,331,188,298,190,387,190,387,188,298,199,331,190,387,199,331,219,387,159,298,137,149,148,182,148,182,137,149,210,149,148,182,210,149,210,182,210,182,210,149,243,0,210,182,243,0,210,298,210,298,243,0,243,331,210,298,243,331,199,331,159,298,119,182,137,149,137,149,119,182,108,149,137,149,108,149,97,33,97,33,108,149,85,0,97,33,85,0,243,0,68,33,36,33,56,0,68,33,56,0,65,-60,68,33,65,-60,85,0,68,33,85,0,108,149,210,33,97,33,243,0,210,33,243,0,210,149,42,182,42,149,108,149,42,182,108,149,119,182,65,-60,56,0,36,-60,159,298,36,331,36,298,56,0,36,33,36,0,159,298,148,182,188,298,199,331,188,298,210,298, +353,291,318,291,289,258,272,270,253,279,233,285,212,290,190,291,138,283,93,259,57,223,34,178,25,126,27,100,33,75,43,51,56,30,72,11,28,-39,63,-39,92,-6,110,-17,129,-26,148,-33,169,-37,190,-39,242,-30,288,-6,324,28,348,74,356,126,354,152,348,176,338,200,325,221,309,241,16383,16383,287,217,300,201,310,184,317,166,322,147,323,127,316,85,297,48,269,19,232,0,190,-6,174,-5,158,-2,142,2,127,9,113,18,16383,16383,94,36,81,51,71,68,64,86,60,106,58,127,65,168,84,205,112,233,148,252,190,258,208,257,225,254,241,248,256,241,267,233,333,0,185,337,175,337,31,0,16383,16383,272,21,63,21,167,267,334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,313,109,313,142,65,142,74,170,90,195,112,215,138,228,167,233,313,233,313,266,166,266,121,258,84,238,55,207,37,169,30,126,37,83,55,45,84,14,122,-5,167,-12,313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70, +323,127,316,85,324,28,324,28,316,85,297,48,324,28,297,48,288,-6,288,-6,297,48,269,19,288,-6,269,19,242,-30,242,-30,269,19,232,0,242,-30,232,0,190,-39,190,-39,232,0,190,-6,127,9,129,-26,142,2,142,2,129,-26,148,-33,142,2,148,-33,158,-2,158,-2,148,-33,169,-37,158,-2,169,-37,174,-5,174,-5,169,-37,190,-39,174,-5,190,-39,190,-6,127,9,113,18,129,-26,267,233,113,18,287,217,267,233,287,217,272,270,129,-26,113,18,110,-17,110,-17,113,18,94,36,110,-17,94,36,92,-6,92,-6,94,36,81,51,92,-6,81,51,72,11,72,11,81,51,71,68,72,11,71,68,64,86,58,127,65,168,57,223,58,127,57,223,56,30,58,127,56,30,60,106,60,106,56,30,72,11,60,106,72,11,64,86,27,100,33,75,34,178,34,178,33,75,43,51,34,178,43,51,57,223,57,223,43,51,56,30,267,233,272,270,256,241,256,241,272,270,253,279,256,241,253,279,241,248,241,248,253,279,233,285,241,248,233,285,225,254,225,254,233,285,212,290,225,254,212,290,208,257,208,257,212,290,190,258,148,252,190,258,190,291,148,252,190,291,138,283,65,168,84,205,93,259,93,259,84,205,112,233,93,259,112,233,138,283,138,283,112,233,148,252,212,290,190,291,190,258,318,291,289,258,300,201,318,291,300,201,309,241,318,291,309,241,353,291,289,258,272,270,287,217,289,258,287,217,300,201,63,-39,92,-6,72,11,63,-39,72,11,28,-39,348,176,338,200,348,74,348,176,348,74,356,126,348,176,356,126,354,152,325,221,309,241,310,184,325,221,310,184,317,166,325,221,317,166,322,147,325,221,322,147,323,127,325,221,323,127,324,28,325,221,324,28,348,74,325,221,348,74,338,200,310,184,309,241,300,201,94,36,113,18,267,233,57,223,65,168,93,259,27,100,34,178,25,126, +333,0,185,337,175,337,31,0,16383,16383,272,21,63,21,167,267,334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310, +175,337,31,0,63,21,63,21,31,0,333,0,63,21,333,0,272,21,272,21,333,0,185,337,272,21,185,337,175,337,175,337,63,21,167,267,175,337,167,267,272,21, +334,331,31,331,180,-5,190,-5,16383,16383,302,310,197,64,93,310,313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109, +334,331,31,331,93,310,334,331,93,310,302,310,334,331,302,310,197,64,334,331,197,64,190,-5,180,-5,190,-5,197,64,180,-5,197,64,93,310,180,-5,93,310,31,331, +313,-12,313,20,167,20,137,24,111,37,89,57,73,82,64,109,313,109,313,142,65,142,74,170,90,195,112,215,138,228,167,233,313,233,313,266,166,266,121,258,84,238,55,207,37,169,30,126,37,83,55,45,84,14,122,-5,167,-12,313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,55,45,73,24,96,7,54,-78, +55,45,84,14,64,109,64,109,65,142,55,45,55,45,65,142,55,207,55,45,55,207,37,83,37,83,55,207,37,169,37,83,37,169,30,126,65,142,64,109,313,109,65,142,313,109,313,142,90,195,112,215,121,258,121,258,112,215,138,228,121,258,138,228,166,266,166,266,138,228,167,233,166,266,167,233,313,266,313,266,167,233,313,233,84,238,55,207,65,142,84,238,65,142,74,170,84,238,74,170,90,195,84,238,90,195,121,258,167,-12,313,-12,313,20,167,-12,313,20,167,20,167,-12,167,20,137,24,167,-12,137,24,122,-5,137,24,111,37,122,-5,122,-5,111,37,89,57,122,-5,89,57,84,14,84,14,89,57,73,82,84,14,73,82,64,109, +313,-12,313,20,154,20,148,22,142,23,136,25,179,109,313,109,313,142,195,142,239,233,313,233,313,266,256,266,289,331,257,331,225,266,166,266,121,258,84,238,55,207,37,169,30,126,33,97,42,70,55,45,73,24,96,7,54,-78,84,-78,121,-5,130,-7,139,-10,157,-12,167,-12,16383,16383,209,233,164,142,65,142,74,170,90,195,112,215,138,228,167,233,16383,16383,147,109,112,37,98,49,86,62,76,77,69,93,64,109,211,22,211,55,138,55,116,57,97,64,83,75,72,90,65,109,211,109,211,142,65,142,72,162,82,177,97,188,115,194,137,196,211,196,211,229,137,229,102,224,73,210,51,188,37,159,32,126,37,93,51,65,73,42,102,28,137,22,30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83, +96,7,96,7,84,-78,96,7,84,-78,121,-5,96,7,121,-5,98,49,96,7,98,49,86,62,96,7,86,62,76,77,96,7,76,77,73,24,55,45,73,24,64,109,64,109,73,24,69,93,69,93,73,24,76,77,161,20,154,20,157,-12,157,-12,154,20,148,22,157,-12,148,22,148,-11,148,-11,148,22,142,23,148,-11,142,23,139,-10,139,-10,142,23,136,25,139,-10,136,25,130,-7,147,109,112,37,121,-5,147,109,121,-5,130,-7,147,109,130,-7,136,25,147,109,136,25,179,109,147,109,179,109,164,142,147,109,164,142,65,142,147,109,65,142,64,109,167,-12,313,-12,313,20,167,-12,313,20,167,20,167,-12,167,20,161,20,167,-12,161,20,157,-12,90,195,112,215,121,258,121,258,112,215,138,228,121,258,138,228,166,266,166,266,138,228,167,233,166,266,167,233,225,266,225,266,167,233,209,233,225,266,209,233,239,233,239,233,209,233,195,142,256,266,289,331,257,331,256,266,257,331,239,233,256,266,239,233,313,233,256,266,313,233,313,266,179,109,313,109,195,142,179,109,195,142,209,233,179,109,209,233,164,142,84,238,55,207,65,142,84,238,65,142,74,170,84,238,74,170,90,195,84,238,90,195,121,258,30,126,33,97,37,169,37,169,33,97,42,70,37,169,42,70,55,207,55,207,42,70,55,45,55,207,55,45,65,142,65,142,55,45,64,109,195,142,313,109,313,142,84,-78,96,7,54,-78,98,49,121,-5,112,37,225,266,239,233,257,331, +211,22,211,55,138,55,116,57,97,64,83,75,72,90,65,109,211,109,211,142,65,142,72,162,82,177,97,188,115,194,137,196,211,196,211,229,137,229,102,224,73,210,51,188,37,159,32,126,37,93,51,65,73,42,102,28,137,22,30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,306,169,288,207,259,238,222,258, +83,75,72,90,73,42,73,42,72,90,65,109,73,42,65,109,51,188,73,42,51,188,51,65,51,65,51,188,37,159,51,65,37,159,37,93,37,93,37,159,32,126,82,177,97,188,102,224,102,224,97,188,115,194,102,224,115,194,137,229,137,229,115,194,137,196,51,188,65,109,65,142,65,142,65,109,211,142,211,142,65,109,211,109,211,229,137,229,137,196,211,229,137,196,211,196,73,210,51,188,65,142,73,210,65,142,72,162,73,210,72,162,82,177,73,210,82,177,102,224,97,64,102,28,116,57,116,57,102,28,137,22,116,57,137,22,138,55,138,55,137,22,211,22,138,55,211,22,211,55,83,75,73,42,102,28,83,75,102,28,97,64, +30,266,30,233,175,233,205,228,231,215,253,195,269,170,278,142,30,142,30,109,278,109,269,82,253,57,232,37,205,24,175,20,30,20,30,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,306,169,288,207,259,238,222,258,177,266,289,331,257,331,222,258,213,261,204,263,196,264,186,265,177,266,30,266,30,233,175,233,182,232,188,232,194,231,200,229,206,228,164,142,30,142,30,109,147,109,103,20,30,20,30,-12,86,-12,54,-78,84,-78,117,-12,175,-12,220,-5,258,14, +269,82,253,57,258,14,258,14,253,57,232,37,258,14,232,37,220,-5,220,-5,232,37,205,24,220,-5,205,24,175,20,177,266,30,266,175,233,177,266,175,233,205,228,177,266,205,228,222,258,312,126,306,169,306,83,306,83,306,169,288,207,306,83,288,207,287,45,287,45,288,207,278,109,287,45,278,109,269,82,231,215,253,195,259,238,259,238,253,195,269,170,259,238,269,170,288,207,288,207,269,170,278,142,288,207,278,142,278,109,222,258,205,228,231,215,222,258,231,215,259,238,175,-12,220,-5,175,20,175,-12,175,20,30,20,175,-12,30,20,30,-12,278,109,278,142,30,142,278,109,30,142,30,109,269,82,258,14,287,45,175,233,30,266,30,233, +289,331,257,331,222,258,213,261,204,263,196,264,186,265,177,266,30,266,30,233,175,233,182,232,188,232,194,231,200,229,206,228,164,142,30,142,30,109,147,109,103,20,30,20,30,-12,86,-12,54,-78,84,-78,117,-12,175,-12,220,-5,258,14,287,45,306,83,312,126,313,126,310,155,301,183,287,208,269,229,247,247,16383,16383,195,142,230,214,244,203,256,190,266,175,273,159,278,142,16383,16383,278,109,269,82,253,57,232,37,205,24,175,20,133,20,179,109,32,229,32,196,105,196,128,194,146,188,161,177,171,162,177,142,32,142,32,109,177,109,171,90,161,75,146,64,127,57,105,55,32,55,32,22,107,22,141,28,170,42,192,65,206,93,211,126,206,159,192,188,170,210,140,224,105,229,243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305, +86,-12,54,-78,84,-78,86,-12,84,-78,117,-12,86,-12,117,-12,103,20,86,-12,103,20,30,20,86,-12,30,20,30,-12,147,109,103,20,117,-12,147,109,117,-12,133,20,147,109,133,20,179,109,147,109,179,109,164,142,147,109,164,142,30,142,147,109,30,142,30,109,269,82,253,57,258,14,258,14,253,57,232,37,258,14,232,37,220,-5,220,-5,232,37,205,24,220,-5,205,24,175,20,195,142,230,214,206,228,206,228,213,261,204,263,206,228,204,263,200,229,200,229,204,263,196,264,200,229,196,264,194,231,194,231,196,264,188,232,30,266,175,233,177,266,177,266,175,233,182,232,177,266,182,232,186,265,186,265,182,232,188,232,186,265,188,232,196,264,257,331,222,258,230,214,257,331,230,214,247,247,257,331,247,247,289,331,230,214,244,203,247,247,247,247,244,203,256,190,247,247,256,190,269,229,269,229,256,190,266,175,269,229,266,175,273,159,213,261,206,228,230,214,213,261,230,214,222,258,273,159,278,142,287,208,278,109,278,142,195,142,278,109,195,142,179,109,179,109,195,142,206,228,179,109,206,228,164,142,312,126,310,155,306,83,306,83,310,155,301,183,306,83,301,183,287,45,287,45,301,183,287,208,287,45,287,208,278,109,278,109,287,208,278,142,269,82,258,14,287,45,269,82,287,45,278,109,175,-12,220,-5,175,20,175,-12,175,20,133,20,175,-12,133,20,117,-12,269,229,273,159,287,208,175,233,30,266,30,233, +32,229,32,196,105,196,128,194,146,188,161,177,171,162,177,142,32,142,32,109,177,109,171,90,161,75,146,64,127,57,105,55,32,55,32,22,107,22,141,28,170,42,192,65,206,93,211,126,206,159,192,188,170,210,140,224,105,229,243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,85,-60,83,-80, +105,229,32,229,105,229,105,229,32,229,105,196,105,229,105,196,140,224,140,224,105,196,128,194,140,224,128,194,146,188,192,188,177,142,192,65,192,65,177,142,177,109,192,65,177,109,171,90,32,142,32,109,177,109,32,142,177,109,177,142,146,188,161,177,170,210,170,210,161,177,171,162,170,210,171,162,192,188,192,188,171,162,177,142,206,159,192,188,192,65,206,159,192,65,206,93,206,159,206,93,211,126,170,42,192,65,171,90,170,42,171,90,161,75,170,42,161,75,146,64,170,42,146,64,141,28,127,57,105,55,107,22,127,57,107,22,141,28,127,57,141,28,146,64,32,55,32,22,107,22,32,55,107,22,105,55,105,196,32,229,32,196,140,224,146,188,170,210, +243,0,243,320,30,320,30,0,474,-128,474,-115,465,-115,447,-112, +243,0,243,320,30,320,243,0,30,320,30,0, +474,-128,474,-115,465,-115,447,-112,433,-104,424,-92,418,-74,416,-51,416,307,418,330,423,347,434,359,451,366,474,368,474,382,26,382,26,368,35,368,52,366,66,360,76,349,83,331,85,305,85,-60,83,-80,77,-95,67,-106,54,-112,36,-115,26,-115,26,-128,210,-128,210,-115,195,-115,177,-112,165,-104,157,-91,152,-72,151,-48,151,349,350,349,350,-48,349,-69,344,-88,337,-102,324,-111,306,-115,290,-115,290,-128,474,-128,474,-115,451,-112,434,-106,423,-94,418,-77,416,-54,416,304,418,327,424,345,433,358,447,365,465,368,474,368,474,382,290,382,290,368,306,368,324,364,337,355,344,341,349,322,350,300,350,-96,151,-96,151,300,152,325,157,344,165,357,177,365,195,368,210,368,210,382,26,382,26,368,36,368,54,366,67,359,77,348,83,333,85,313,85,-53,83,-78,76,-96,66,-107,52,-113,35,-115,26,-115,26,-128, +77,-95,67,-106,210,-128,210,-128,67,-106,54,-112,210,-128,54,-112,36,-115,344,-88,337,-102,474,-128,474,-128,337,-102,324,-111,474,-128,324,-111,306,-115,474,382,26,382,35,368,474,382,35,368,52,366,474,382,52,366,66,360,474,382,66,360,76,349,474,382,76,349,151,349,474,382,151,349,350,349,474,382,350,349,434,359,474,382,434,359,451,366,474,382,451,366,474,368,433,-104,424,-92,350,-48,350,-48,424,-92,418,-74,350,-48,418,-74,350,349,350,349,418,-74,416,-51,350,349,416,-51,416,307,350,349,416,307,418,330,350,349,418,330,423,347,350,349,423,347,434,359,165,-104,157,-91,85,-60,85,-60,157,-91,152,-72,85,-60,152,-72,85,305,85,305,152,-72,151,-48,85,305,151,-48,151,349,83,331,85,305,151,349,83,331,151,349,76,349,474,-128,474,-115,465,-115,474,-128,465,-115,447,-112,474,-128,447,-112,433,-104,474,-128,433,-104,349,-69,474,-128,349,-69,344,-88,290,-115,290,-128,474,-128,290,-115,474,-128,306,-115,210,-128,210,-115,195,-115,210,-128,195,-115,177,-112,210,-128,177,-112,83,-80,210,-128,83,-80,77,-95,85,-60,83,-80,177,-112,85,-60,177,-112,165,-104,26,-115,26,-128,210,-128,26,-115,210,-128,36,-115,349,-69,433,-104,350,-48,35,368,26,382,26,368, +474,-128,474,-115,451,-112,434,-106,423,-94,418,-77,416,-54,416,304,418,327,424,345,433,358,447,365,465,368,474,368,474,382,290,382,290,368,306,368,324,364,337,355,344,341,349,322,350,300,350,-96,151,-96,151,300,152,325,157,344,165,357,177,365,195,368,210,368,210,382,26,382,26,368,36,368,54,366,67,359,77,348,83,333,85,313,85,-53,83,-78,76,-96,66,-107,52,-113,35,-115,26,-115,26,-128,428,20,413,20,405,-7,394,-30,379,-48,357,-59,328,-63,121,-63,289,153,144,349,304,349,339,346,364,336,381,318,392,292,400,256,415,256,415,382,41,382,225,126,29,-128,401,-128,310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,201,349,196,358,189,365,180,369,171,371, +76,-96,66,-107,474,-128,474,-128,66,-107,52,-113,474,-128,52,-113,35,-115,77,348,83,333,210,382,210,382,83,333,177,365,210,382,177,365,195,368,210,382,195,368,210,368,85,313,85,-53,151,-96,85,313,151,-96,151,300,85,313,151,300,152,325,85,313,152,325,157,344,85,313,157,344,165,357,85,313,165,357,177,365,85,313,177,365,83,333,210,382,26,382,36,368,210,382,36,368,54,366,210,382,54,366,67,359,210,382,67,359,77,348,434,-106,423,-94,350,-96,350,-96,423,-94,418,-77,350,-96,418,-77,350,300,349,322,350,300,433,358,349,322,433,358,474,382,474,382,433,358,447,365,474,382,447,365,465,368,474,382,465,368,474,368,416,-54,416,304,350,300,350,300,416,304,418,327,350,300,418,327,424,345,474,382,290,382,306,368,474,382,306,368,324,364,474,382,324,364,337,355,474,382,337,355,344,341,474,382,344,341,349,322,474,-128,474,-115,451,-112,474,-128,451,-112,434,-106,474,-128,434,-106,350,-96,474,-128,350,-96,151,-96,474,-128,151,-96,76,-96,83,-78,76,-96,151,-96,83,-78,151,-96,85,-53,26,-115,26,-128,474,-128,26,-115,474,-128,35,-115,350,300,418,-77,416,-54,306,368,290,382,290,368,433,358,350,300,424,345,36,368,26,382,26,368, +428,20,413,20,405,-7,394,-30,379,-48,357,-59,328,-63,121,-63,289,153,144,349,304,349,339,346,364,336,381,318,392,292,400,256,415,256,415,382,41,382,225,126,29,-128,401,-128,310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339, +415,382,41,382,144,349,415,382,144,349,304,349,415,382,304,349,339,346,415,382,339,346,364,336,415,382,364,336,381,318,415,382,381,318,392,292,415,382,392,292,400,256,415,382,400,256,415,256,225,126,29,-128,121,-63,225,126,121,-63,289,153,225,126,289,153,144,349,225,126,144,349,41,382,394,-30,379,-48,401,-128,401,-128,379,-48,357,-59,401,-128,357,-59,328,-63,405,-7,394,-30,401,-128,405,-7,401,-128,428,20,405,-7,428,20,413,20,121,-63,29,-128,401,-128,121,-63,401,-128,328,-63, +310,110,310,143,32,143,32,110,319,218,319,251,24,251,24,218, +310,110,310,143,32,143,310,110,32,143,32,110, +319,218,319,251,24,251,24,218,16383,16383,319,54,319,86,188,86,188,191,155,191,155,86,24,86,24,54,155,54,155,-43,188,-43,188,54,203,339,201,349,196,358,189,365,180,369,171,371,161,369,153,365,146,358,141,350,139,339,140,328,145,319,151,313,160,308,171,307,181,309, +24,251,24,218,319,218,24,251,319,218,319,251,188,191,155,191,188,-43,188,-43,155,191,155,86,188,-43,155,86,155,54,155,54,155,86,24,86,155,54,24,86,24,54,188,54,319,54,188,86,188,86,319,54,319,86,188,-43,155,54,155,-43, +203,339,201,349,196,358,189,365,180,369,171,371,161,369,153,365,146,358,141,350,139,339,140,328,145,319,151,313,160,308,171,307,181,309,190,313,197,320,201,329,203,339,16383,16383,318,110,318,143,188,143,188,273,155,273,155,143,24,143,24,110,155,110,155,-20,188,-20,188,110,239,355,203,355,23,-110,59,-110,201,46,44,205,12,205,171,46,228,169,227,175,225,181,221,185,216,189,210,190,208,190,206,189,204,189,202,188,200,186,191,180,182,170,170,158,156,145,137,133,138,153,142,172,146,190,150,204,151,215,150,222,147,227,143,231,138,234,132,235, +171,371,171,307,180,369,180,369,171,307,181,309,180,369,181,309,189,365,189,365,181,309,190,313,189,365,190,313,196,358,196,358,190,313,197,320,196,358,197,320,201,349,201,349,197,320,201,329,201,349,201,329,203,339,139,339,140,328,141,350,141,350,140,328,145,319,141,350,145,319,146,358,146,358,145,319,151,313,146,358,151,313,153,365,153,365,151,313,160,308,153,365,160,308,161,369,161,369,160,308,171,307,161,369,171,307,171,371,188,273,155,273,188,-20,188,-20,155,273,155,143,188,-20,155,143,155,110,155,110,155,143,24,143,155,110,24,143,24,110,188,110,318,110,188,143,188,143,318,110,318,143,188,-20,155,110,155,-20, +239,355,203,355,23,-110,59,-110,201,46,44,205,12,205,171,46, +239,355,203,355,23,-110,239,355,23,-110,59,-110, +201,46,44,205,12,205,171,46,228,169,227,175,225,181,221,185, +201,46,44,205,12,205,201,46,12,205,171,46, +228,169,227,175,225,181,221,185,216,189,210,190,208,190,206,189,204,189,202,188,200,186,191,180,182,170,170,158,156,145,137,133,138,153,142,172,146,190,150,204,151,215,150,222,147,227,143,231,138,234,132,235,127,234,121,231,117,227,114,222,113,215,114,204,118,189,122,172,126,153,127,132,111,143,96,155,72,179,62,186,63,186,60,188,58,189,56,189,54,190,51,190,45,189,40,185,37,181,34,175,33,169,34,165,35,162,37,159,40,156,44,153,55,149,70,144,87,139,105,133,122,125,105,117,88,111,71,106,56,102,46,98,42,95,39,91,37,87,36,82,35,78,36,73,38,69,42,65,47,63,54,62,56,62,59,63,61,64,67,66,75,72,85,83,98,95,112,108,127,118,126,98,122,80,118,63,114,49,113,37,114,31,117,26,121,21,127,18,132,17,138,18,143,21,147,26,150,31,151,37,150,49,146,63,142,80,138,98,137,118,157,104,173,89,185,75,196,65,208,61,215,62,220,65,224,70,227,75,228,81,227,85,226,88,224,91,221,95,217,97,207,101,193,105,177,109,159,116,140,125,161,135,179,142,195,146,208,149,218,153,221,155,224,158,226,162,228,165,228,169,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,16383,16383,122,126,120,115,116,105,108,98,99,93,88,92,77,93,67,98,60,106,55,115,53,127,55,138,59,147,67,154,77,159,89,161,99,159,108,154,116,147,120,137,122,126,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,193,333,196,333,206,328,213,323,219,315,222,306,223,296,222,284,217,274,210,266,201,261,190,259,186,260,182,260,178,262,173,264,168,267,164,270,161,272,152,275,146,273,144,271,142,268,142,265,143,260,146,255,152,251,160,249,171,248,193,250,214,257,231,269,242,286, +146,63,142,80,143,21,143,21,142,80,138,98,143,21,138,98,138,18,138,18,138,98,137,118,137,133,138,234,132,17,132,17,138,234,132,235,132,17,132,235,127,118,127,118,132,235,127,132,127,118,127,132,122,125,122,125,127,132,111,143,138,153,142,172,143,231,143,231,142,172,146,190,143,231,146,190,147,227,147,227,146,190,150,204,147,227,150,204,150,222,150,222,150,204,151,215,138,234,137,133,138,153,138,234,138,153,143,231,127,118,126,98,127,18,127,118,127,18,132,17,113,37,114,31,114,49,114,49,114,31,117,26,114,49,117,26,118,63,118,63,117,26,121,21,118,63,121,21,122,80,122,80,121,21,127,18,122,80,127,18,126,98,137,118,157,104,140,125,140,125,157,104,159,116,159,116,157,104,173,89,159,116,173,89,177,109,177,109,173,89,185,75,177,109,185,75,193,105,193,105,185,75,196,65,193,105,196,65,207,101,207,101,196,65,208,61,207,101,208,61,217,97,217,97,208,61,215,62,217,97,215,62,220,65,221,155,224,158,225,181,225,181,224,158,226,162,225,181,226,162,227,175,227,175,226,162,228,165,227,175,228,165,228,169,221,185,216,189,218,153,221,185,218,153,221,155,221,185,221,155,225,181,216,189,210,190,218,153,218,153,210,190,208,190,218,153,208,190,208,149,208,149,208,190,206,189,208,149,206,189,204,189,204,189,202,188,208,149,208,149,202,188,200,186,208,149,200,186,195,146,195,146,200,186,191,180,195,146,191,180,182,170,156,145,140,125,161,135,156,145,161,135,170,158,170,158,161,135,179,142,170,158,179,142,182,170,182,170,179,142,195,146,137,133,137,118,140,125,137,133,140,125,156,145,137,118,137,133,132,17,137,118,132,17,138,18,228,81,227,85,227,75,227,75,227,85,226,88,227,75,226,88,224,70,224,70,226,88,224,91,224,70,224,91,221,95,221,95,217,97,220,65,221,95,220,65,224,70,150,49,146,63,147,26,150,49,147,26,150,31,150,49,150,31,151,37,127,132,132,235,127,234,127,132,127,234,126,153,126,153,127,234,122,172,122,172,127,234,121,231,122,172,121,231,118,189,118,189,121,231,117,227,118,189,117,227,114,204,114,204,117,227,114,222,114,204,114,222,113,215,75,72,85,83,88,111,88,111,85,83,98,95,88,111,98,95,105,117,105,117,98,95,112,108,105,117,112,108,122,125,122,125,112,108,127,118,71,106,56,102,59,63,71,106,59,63,61,64,71,106,61,64,64,65,71,106,64,65,67,66,71,106,67,66,75,72,71,106,75,72,88,111,56,102,46,98,47,63,56,102,47,63,54,62,56,102,54,62,56,62,56,102,56,62,59,63,42,65,47,63,46,98,42,65,46,98,42,95,42,65,42,95,39,91,42,65,39,91,38,69,37,87,36,82,36,73,37,87,36,73,38,69,37,87,38,69,39,91,122,125,111,143,105,133,105,133,111,143,96,155,105,133,96,155,87,139,87,139,96,155,83,168,87,139,83,168,72,179,70,144,87,139,72,179,70,144,72,179,62,186,70,144,62,186,60,188,70,144,60,188,58,189,70,144,58,189,56,189,70,144,56,189,55,149,55,149,56,189,54,190,55,149,54,190,51,190,55,149,51,190,45,189,55,149,45,189,44,153,40,185,37,181,37,159,40,185,37,159,40,156,40,185,40,156,44,153,40,185,44,153,45,189,33,169,34,165,34,175,34,175,34,165,35,162,34,175,35,162,37,181,37,181,35,162,37,159,36,73,36,82,35,78,146,63,143,21,147,26, +155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,16383,16383,122,126,120,115,116,105,108,98,99,93,88,92,77,93,67,98,60,106,55,115,53,127,55,138,59,147,67,154,77,159,89,161,99,159,108,154,116,147,120,137,122,126,155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399, +60,106,66,62,67,98,67,98,66,62,88,59,67,98,88,59,77,93,77,93,88,59,88,92,99,93,88,92,88,59,99,93,88,59,109,62,55,138,59,147,67,190,67,190,59,147,67,154,67,190,67,154,89,194,89,194,67,154,77,159,89,194,77,159,89,161,89,161,99,159,110,190,110,190,99,159,108,154,110,190,108,154,116,147,20,127,23,105,24,148,24,148,23,105,33,86,24,148,33,86,33,167,33,167,33,86,47,72,33,167,47,72,48,181,48,181,47,72,53,127,55,138,67,190,48,181,55,138,48,181,53,127,155,126,152,147,152,105,152,105,152,147,142,166,152,105,142,166,142,86,142,86,142,166,128,180,142,86,128,180,128,72,128,72,128,180,122,126,128,72,122,126,120,115,128,72,120,115,116,105,128,180,110,190,116,147,128,180,116,147,120,137,128,180,120,137,122,126,110,190,89,194,89,161,109,62,128,72,116,105,109,62,116,105,108,98,109,62,108,98,99,93,55,115,53,127,47,72,55,115,47,72,66,62,55,115,66,62,60,106, +155,126,152,147,142,166,128,180,110,190,89,194,67,190,48,181,33,167,24,148,20,127,23,105,33,86,47,72,66,62,88,59,109,62,128,72,142,86,152,105,155,126,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391, +20,127,23,105,24,148,24,148,23,105,33,86,24,148,33,86,33,167,33,167,33,86,47,72,33,167,47,72,48,181,48,181,47,72,66,62,48,181,66,62,67,190,67,190,66,62,88,59,67,190,88,59,89,194,89,194,88,59,109,62,89,194,109,62,110,190,110,190,109,62,128,72,110,190,128,72,128,180,128,180,128,72,142,86,128,180,142,86,142,166,142,166,142,86,152,105,142,166,152,105,152,147,152,147,152,105,155,126, +482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334, +76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487, +149,381,156,391,162,399,169,404,177,407,185,408,195,407,202,404,208,399,212,392,213,382,211,369,204,359,195,351,183,345,171,340,171,335,184,335,189,334,193,333,196,333,206,328,213,323,219,315,222,306,223,296,222,284,217,274,210,266,201,261,190,259,186,260,182,260,178,262,173,264,168,267,164,270,161,272,152,275,146,273,144,271,142,268,142,265,143,260,146,255,152,251,160,249,171,248,193,250,214,257,231,269,242,286,247,307,245,320,240,331,233,340,223,347,210,352,218,358,224,365,229,373,232,381,233,388,231,400,226,410,218,417,206,421,193,423,178,421,166,416,156,407,149,396,143,382,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,252,291,252,312,225,312,225,421,210,421,131,312,131,291,201,291,201,249,225,249,225,291,16383,16383,201,312,142,312,201,395,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,180,27,198,47,213,73,232,47,250,27,271,12,294,3,321,0,16383,16383,202,90,193,78,180,66,164,54,144,45,120,42,96,47,76,59,62,78,53,101,50,126,53,144,60,161,71,174, +158,273,160,249,161,272,161,272,160,249,171,248,161,272,171,248,164,270,164,270,171,248,168,267,173,264,168,267,171,248,173,264,171,248,193,250,149,381,156,391,156,407,156,407,156,391,162,399,156,407,162,399,166,416,166,416,162,399,169,404,166,416,169,404,178,421,178,421,169,404,177,407,178,421,177,407,185,408,185,408,195,407,193,423,193,423,195,407,206,421,149,396,143,382,149,381,149,396,149,381,156,407,184,335,189,334,195,351,195,351,189,334,193,333,195,351,193,333,196,333,196,333,206,328,204,359,204,359,206,328,211,369,183,345,171,340,178,335,183,345,178,335,184,335,183,345,184,335,195,351,204,359,195,351,196,333,210,352,218,358,211,369,211,369,218,358,213,382,218,417,213,382,218,358,218,417,218,358,226,410,226,410,218,358,224,365,226,410,224,365,229,373,195,407,202,404,206,421,206,421,202,404,208,399,206,421,208,399,218,417,218,417,208,399,212,392,218,417,212,392,213,382,231,400,226,410,229,373,231,400,229,373,232,381,231,400,232,381,233,388,210,352,211,369,206,328,210,352,206,328,213,323,210,352,213,323,223,347,242,286,247,307,245,320,242,286,245,320,240,331,242,286,240,331,233,340,242,286,233,340,231,269,223,296,231,269,233,340,223,296,233,340,223,347,223,347,213,323,219,315,223,347,219,315,222,306,223,347,222,306,223,296,210,266,214,257,217,274,217,274,214,257,231,269,217,274,231,269,222,284,222,284,231,269,223,296,190,259,193,250,201,261,201,261,193,250,214,257,201,261,214,257,210,266,193,423,178,421,185,408,186,260,182,260,193,250,186,260,193,250,190,259,178,262,173,264,193,250,178,262,193,250,182,260,155,274,152,275,152,251,155,274,152,251,160,249,155,274,160,249,158,273,149,274,146,273,146,255,149,274,146,255,152,251,149,274,152,251,152,275,144,271,142,268,143,260,144,271,143,260,146,255,144,271,146,255,146,273,76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,143,260,142,268,142,265,178,335,171,340,171,335, +252,291,252,312,225,312,225,421,210,421,131,312,131,291,201,291,201,249,225,249,225,291,16383,16383,201,312,142,312,201,395,16383,16383,482,487,454,487,248,-45,246,-45,143,222,134,222,56,160,62,150,69,155,83,163,89,165,94,165,102,164,108,161,114,155,120,147,126,136,227,-128,243,-128,321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12, +131,291,201,291,131,312,131,312,201,291,142,312,131,312,142,312,210,421,210,421,142,312,201,395,210,421,201,395,225,249,225,249,201,395,201,312,225,249,201,312,201,291,201,291,201,312,142,312,210,421,225,249,225,421,225,312,225,291,252,291,225,312,252,291,252,312,76,159,83,163,134,222,134,222,83,163,89,165,134,222,89,165,94,165,94,165,102,164,134,222,134,222,102,164,108,161,134,222,108,161,114,155,143,222,134,222,227,-128,227,-128,134,222,126,136,120,147,126,136,134,222,120,147,134,222,114,155,134,222,56,160,62,150,134,222,62,150,69,155,134,222,69,155,76,159,143,222,227,-128,246,-45,246,-45,227,-128,243,-128,246,-45,243,-128,248,-45,248,-45,243,-128,482,487,248,-45,482,487,454,487,225,249,201,291,201,249, +321,42,304,45,287,54,270,70,253,92,235,121,235,123,245,137,258,150,275,162,296,170,321,173,321,215,294,211,272,201,254,185,239,165,225,142,199,174,177,195,156,207,137,213,116,215,95,212,70,201,46,180,28,147,21,100,26,63,39,35,59,15,83,4,108,0,135,3,159,12,180,27,198,47,213,73,232,47,250,27,271,12,294,3,321,0,16383,16383,202,90,193,78,180,66,164,54,144,45,120,42,96,47,76,59,62,78,53,101,50,126,53,144,60,161,71,174,85,182,100,185,121,181,140,169,160,150,181,124,202,92,427,111,422,148,408,177,387,198,363,210,336,215,309,211,287,201,269,185,253,165,239,142,213,174,191,195,171,207,151,213,131,215,110,212,84,201,60,180,42,147,35,100,40,63,54,35,73,15,97,4,123,0,150,3,174,12,195,27,213,47,228,73,246,47,264,27,284,12,305,3,328,0,363,7,390,25,410,51,423,81,427,111,16383,16383,249,123,259,136,270,149,285,161,304,170,328,173,352,169,371,157,385,138,394,115,397,89,394,70,387,54,377,41,363,33,347,30,327,33,308,45,290,63,270,89,249,121,16383,16383,217,90, +213,73,232,47,213,73,213,73,232,47,225,142,213,73,225,142,202,92,202,92,199,174,181,124,181,124,199,174,177,195,181,124,177,195,160,150,160,150,177,195,156,207,160,150,156,207,140,169,140,169,156,207,137,213,140,169,137,213,121,181,121,181,137,213,116,215,121,181,116,215,100,185,53,144,60,161,70,201,70,201,60,161,71,174,70,201,71,174,95,212,95,212,71,174,85,182,95,212,85,182,100,185,21,100,26,63,28,147,28,147,26,63,39,35,28,147,39,35,46,180,46,180,39,35,59,15,46,180,59,15,50,126,50,126,53,144,46,180,46,180,53,144,70,201,202,90,193,78,198,47,198,47,193,78,180,66,198,47,180,66,180,27,180,27,180,66,164,54,180,27,164,54,159,12,159,12,164,54,144,45,159,12,144,45,135,3,135,3,144,45,120,42,135,3,120,42,108,0,108,0,120,42,96,47,108,0,96,47,83,4,83,4,96,47,76,59,83,4,76,59,62,78,59,15,83,4,62,78,59,15,62,78,53,101,59,15,53,101,50,126,287,54,270,70,271,12,271,12,270,70,253,92,271,12,253,92,250,27,250,27,253,92,235,121,250,27,235,121,232,47,321,173,321,215,296,170,296,170,321,215,294,211,296,170,294,211,275,162,275,162,294,211,272,201,275,162,272,201,258,150,258,150,272,201,254,185,258,150,254,185,245,137,245,137,254,185,239,165,245,137,239,165,235,123,235,123,239,165,225,142,235,123,225,142,232,47,235,123,232,47,235,121,304,45,287,54,294,3,304,45,294,3,321,0,304,45,321,0,321,42,199,174,202,92,225,142,213,73,202,92,202,90,213,73,202,90,198,47,100,185,116,215,95,212,287,54,271,12,294,3, +427,111,422,148,408,177,387,198,363,210,336,215,309,211,287,201,269,185,253,165,239,142,213,174,191,195,171,207,151,213,131,215,110,212,84,201,60,180,42,147,35,100,40,63,54,35,73,15,97,4,123,0,150,3,174,12,195,27,213,47,228,73,246,47,264,27,284,12,305,3,328,0,363,7,390,25,410,51,423,81,427,111,16383,16383,249,123,259,136,270,149,285,161,304,170,328,173,352,169,371,157,385,138,394,115,397,89,394,70,387,54,377,41,363,33,347,30,327,33,308,45,290,63,270,89,249,121,16383,16383,217,90,207,78,195,66,179,54,159,45,134,42,110,47,91,59,77,78,68,101,65,126,67,144,74,161,85,174,99,182,115,185,135,181,155,169,175,150,195,124,217,92,317,0,317,33,58,33,58,292,25,292,25,0,321,0,321,33,91,33,310,252,285,273,12,0,321,0,321,33,271,33,265,61,257,88,247,113,233,138,218,160,310,252,284,273,196,185,186,195,174,205,169,209,148,182,168,166,172,161,11,0,239,0,239,-18,238,-24,238,-30,270,-35,272,-21,272,0,16383,16383,90,33,194,137,207,118,217,98,226,77,233,56,237,33,326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,265,14,268,21,270,27,314,9,16383,16383,114,127,249,184, +228,73,246,47,228,73,228,73,246,47,239,142,228,73,239,142,217,92,217,92,213,174,195,124,195,124,213,174,191,195,195,124,191,195,175,150,175,150,191,195,171,207,175,150,171,207,155,169,155,169,171,207,151,213,155,169,151,213,135,181,135,181,151,213,131,215,135,181,131,215,115,185,67,144,74,161,84,201,84,201,74,161,85,174,84,201,85,174,110,212,110,212,85,174,99,182,110,212,99,182,115,185,35,100,40,63,42,147,42,147,40,63,54,35,42,147,54,35,60,180,60,180,54,35,73,15,60,180,73,15,65,126,65,126,67,144,60,180,60,180,67,144,84,201,217,90,207,78,213,47,213,47,207,78,195,66,213,47,195,66,195,27,195,27,195,66,179,54,195,27,179,54,174,12,174,12,179,54,159,45,174,12,159,45,150,3,150,3,159,45,134,42,150,3,134,42,123,0,123,0,134,42,110,47,123,0,110,47,97,4,97,4,110,47,91,59,97,4,91,59,77,78,73,15,97,4,77,78,73,15,77,78,68,101,73,15,68,101,65,126,336,215,328,173,352,169,336,215,352,169,363,210,363,210,352,169,371,157,363,210,371,157,387,198,387,198,371,157,385,138,387,198,385,138,394,115,270,149,285,161,287,201,287,201,285,161,304,170,287,201,304,170,309,211,309,211,304,170,328,173,309,211,328,173,336,215,239,142,249,123,253,165,253,165,249,123,259,136,253,165,259,136,269,185,269,185,259,136,270,149,269,185,270,149,287,201,264,27,249,121,246,47,246,47,249,121,249,123,246,47,249,123,239,142,249,121,264,27,270,89,270,89,264,27,284,12,270,89,284,12,290,63,290,63,284,12,305,3,290,63,305,3,308,45,308,45,305,3,328,0,308,45,328,0,327,33,327,33,328,0,347,30,363,33,347,30,363,7,363,33,363,7,390,25,387,198,394,115,408,177,408,177,394,115,397,89,410,51,397,89,394,70,410,51,394,70,390,25,390,25,394,70,387,54,390,25,387,54,377,41,422,148,408,177,410,51,422,148,410,51,423,81,422,148,423,81,427,111,347,30,328,0,363,7,213,174,217,92,239,142,228,73,217,92,217,90,228,73,217,90,213,47,115,185,131,215,110,212,363,33,390,25,377,41,397,89,410,51,408,177, +317,0,317,33,58,33,58,292,25,292,25,0,321,0,321,33,91,33,310,252,285,273,12,0, +58,33,58,292,25,292,58,33,25,292,25,0,58,33,25,0,317,0,58,33,317,0,317,33, +321,0,321,33,91,33,310,252,285,273,12,0,321,0,321,33,271,33,265,61,257,88,247,113, +91,33,310,252,285,273,91,33,285,273,12,0,91,33,12,0,321,0,91,33,321,0,321,33, +321,0,321,33,271,33,265,61,257,88,247,113,233,138,218,160,310,252,284,273,196,185,186,195,174,205,169,209,148,182,168,166,172,161,11,0,239,0,239,-18,238,-24,238,-30,270,-35,272,-21,272,0,16383,16383,90,33,194,137,207,118,217,98,226,77,233,56,237,33,326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8, +90,33,194,137,172,161,172,161,174,205,169,209,172,161,169,209,168,166,168,166,169,209,163,170,169,209,148,182,153,178,169,209,153,178,158,174,169,209,158,174,163,170,194,137,207,118,196,185,196,185,207,118,218,160,196,185,218,160,284,273,284,273,218,160,310,252,207,118,217,98,218,160,218,160,217,98,226,77,218,160,226,77,233,138,233,138,226,77,233,56,233,138,233,56,237,33,194,137,196,185,191,190,194,137,191,190,186,195,194,137,186,195,180,200,194,137,180,200,174,205,194,137,174,205,172,161,233,138,237,33,247,113,239,0,237,33,90,33,239,0,90,33,11,0,11,0,90,33,172,161,265,61,257,88,270,-35,270,-35,257,88,247,113,270,-35,247,113,239,0,239,0,247,113,237,33,272,0,321,0,321,33,272,0,321,33,271,33,272,0,271,33,271,-28,272,0,271,-28,272,-21,272,0,272,-21,272,-14,272,0,272,-14,272,-6,271,33,265,61,270,-35,271,33,270,-35,271,-28,270,-35,239,0,239,-5,270,-35,239,-5,239,-12,270,-35,239,-12,239,-18,270,-35,239,-18,238,-24,270,-35,238,-24,238,-30, +326,40,281,59,284,72,286,86,288,99,290,127,289,140,288,154,286,168,280,196,326,216,314,246,269,228,266,234,263,241,257,253,253,259,225,243,228,237,231,232,233,226,236,220,238,215,28,127,239,40,237,34,234,29,232,23,229,17,225,12,254,-5,258,1,261,8,265,14,268,21,270,27,314,9,16383,16383,114,127,249,184,252,172,254,161,255,149,257,127,256,115,254,93,252,82,249,71,83,-93,83,345,50,345,50,-93,190,152,179,178,118,147,118,345,84,345,84,130,12,93,23,66,84,98,84,-93,118,-93,118,114,197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,86,108,12,70,23,44,86,75,86,-93,119,-93,119,93,185,126,185,-93,219,-93,219,143,295,-14,157,268,152,268, +256,115,258,1,257,127,257,127,258,1,260,247,260,247,258,1,261,8,260,247,261,8,263,241,263,241,261,8,265,14,263,241,265,14,266,234,266,234,265,14,268,21,266,234,268,21,269,228,269,228,268,21,270,27,269,228,270,27,280,196,280,196,270,27,281,59,280,196,281,59,283,182,283,182,281,59,284,72,283,182,284,72,286,168,286,168,284,72,286,86,286,168,286,86,288,154,288,154,286,86,288,99,288,154,288,99,289,140,289,140,288,99,289,113,289,140,289,113,290,127,314,9,326,40,281,59,314,9,281,59,270,27,314,246,269,228,280,196,314,246,280,196,326,216,255,149,256,138,257,253,257,253,256,138,257,127,257,253,257,127,260,247,249,184,252,172,253,259,253,259,252,172,254,161,253,259,254,161,257,253,257,253,254,161,255,149,253,259,225,243,228,237,253,259,228,237,231,232,253,259,231,232,233,226,253,259,233,226,236,220,253,259,236,220,238,215,253,259,238,215,249,184,255,104,254,93,254,-5,255,104,254,-5,258,1,255,104,258,1,256,115,254,-5,254,93,252,82,254,-5,252,82,249,71,254,-5,249,71,239,40,254,-5,239,40,237,34,254,-5,237,34,234,29,254,-5,234,29,232,23,254,-5,232,23,229,17,254,-5,229,17,225,12,238,215,28,127,114,127,114,127,28,127,239,40,114,127,239,40,249,71,238,215,114,127,249,184, +83,-93,83,345,50,345,50,-93,190,152,179,178,118,147,118,345, +83,-93,83,345,50,345,83,-93,50,345,50,-93, +190,152,179,178,118,147,118,345,84,345,84,130,12,93,23,66,84,98,84,-93,118,-93,118,114,197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175, +84,130,12,93,23,66,84,130,23,66,84,98,84,130,84,98,118,-93,84,130,118,-93,84,345,84,345,118,-93,118,345,118,147,118,114,190,152,118,147,190,152,179,178,118,-93,84,98,84,-93, +197,-93,197,345,164,345,164,-93,16383,16383,98,-93,98,345,65,345,65,-93,293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345, +164,345,164,-93,197,-93,164,345,197,-93,197,345,65,345,65,-93,98,-93,65,345,98,-93,98,345, +293,181,281,207,219,175,219,345,185,345,185,158,119,125,119,345,86,345,86,108,12,70,23,44,86,75,86,-93,119,-93,119,93,185,126,185,-93,219,-93,219,143,295,-14,157,268,152,268,16,-14,47,-14,155,201,262,-14,295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,286,-15,286,132,280,177,261,215,233,243,197,261, +86,108,12,70,23,44,86,108,23,44,86,75,86,108,86,75,119,-93,86,108,119,-93,86,345,219,345,185,345,219,-93,219,-93,185,345,185,158,219,-93,185,158,185,126,185,126,185,158,119,125,185,126,119,125,119,93,119,-93,119,345,86,345,219,143,293,181,219,175,219,175,293,181,281,207,219,-93,185,126,185,-93,119,-93,86,75,86,-93, +295,-14,157,268,152,268,16,-14,47,-14,155,201,262,-14,295,268,263,268,156,52,48,268,16,268,153,-14,158,-14, +16,-14,47,-14,152,268,152,268,47,-14,155,201,152,268,155,201,157,268,157,268,155,201,262,-14,157,268,262,-14,295,-14, +295,268,263,268,156,52,48,268,16,268,153,-14,158,-14,286,-15,286,132,280,177,261,215,233,243,197,261,155,268, +295,268,263,268,158,-14,158,-14,263,268,156,52,158,-14,156,52,153,-14,153,-14,156,52,48,268,153,-14,48,268,16,268, +286,-15,286,132,280,177,261,215,233,243,197,261,155,268,113,262,77,244,49,216,30,178,24,134,24,-15,57,-15,57,132,62,165,76,193,97,215,124,230,155,235,186,230,212,215,234,193,248,165,253,132,253,-15,286,268,253,268,253,120,248,87,234,59,212,37,186,23,155,17,124,23,97,37,76,60,62,88,57,121,57,268,24,268,24,118,30,74,49,37,77,9,113,-8,155,-15,197,-8,233,9,261,38,280,75,286,120, +253,132,253,132,248,165,248,165,253,132,261,215,248,165,261,215,234,193,234,193,261,215,233,243,234,193,233,243,212,215,212,215,233,243,197,261,212,215,197,261,186,230,186,230,197,261,155,235,124,230,155,235,155,268,124,230,155,268,113,262,62,165,76,193,77,244,77,244,76,193,97,215,77,244,97,215,113,262,113,262,97,215,124,230,49,216,30,178,57,-15,49,216,57,-15,57,132,49,216,57,132,62,165,49,216,62,165,77,244,24,134,24,-15,57,-15,24,134,57,-15,30,178,197,261,155,268,155,235,286,-15,286,132,280,177,286,-15,280,177,261,215,286,-15,261,215,253,132,286,-15,253,132,253,-15, +286,268,253,268,253,120,248,87,234,59,212,37,186,23,155,17,124,23,97,37,76,60,62,88,57,121,57,268,24,268,24,118,30,74,49,37,77,9,113,-8,155,-15,197,-8,233,9,261,38,280,75,286,120,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155, +253,120,248,87,261,38,261,38,248,87,234,59,261,38,234,59,233,9,233,9,234,59,212,37,233,9,212,37,197,-8,197,-8,212,37,186,23,197,-8,186,23,155,-15,155,-15,186,23,155,17,286,268,253,268,261,38,286,268,261,38,280,75,286,268,280,75,286,120,76,60,77,9,97,37,97,37,77,9,113,-8,97,37,113,-8,124,23,124,23,113,-8,155,-15,124,23,155,-15,155,17,62,88,57,121,49,37,62,88,49,37,77,9,62,88,77,9,76,60,57,268,24,268,30,74,57,268,30,74,49,37,57,268,49,37,57,121,30,74,24,268,24,118,253,120,261,38,253,268, +102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,359,201,330,193,303,223,-61,215,-89,207,-112,198,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,219,-135,238,-111,252,-84,261,-58,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359, +49,-140,49,-137,51,-109,51,-109,49,-137,52,-135,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,18,-127,18,-143,21,-119,21,-119,18,-143,22,-150,21,-119,22,-150,27,-113,27,-113,22,-150,28,-155,27,-113,28,-155,34,-109,34,-109,28,-155,37,-158,34,-109,37,-158,42,-107,42,-107,37,-158,49,-159,42,-107,49,-159,46,-108,46,-108,49,-159,49,-140,86,-112,77,-129,78,-153,78,-153,77,-129,67,-140,78,-153,67,-140,54,-144,54,-144,52,-143,78,-153,78,-153,52,-143,50,-143,78,-153,50,-143,49,-159,49,-159,50,-143,49,-142,49,-159,49,-142,49,-141,285,396,287,412,283,397,283,397,287,412,281,397,268,393,281,397,287,412,268,393,287,412,255,404,289,360,294,360,298,411,298,411,294,360,302,361,298,411,302,361,307,407,307,407,302,361,309,366,307,407,309,366,314,402,314,402,309,366,315,372,314,402,315,372,318,396,318,396,315,372,318,380,318,396,318,380,320,390,279,379,279,368,281,384,281,384,279,368,281,364,281,384,281,364,284,387,284,387,281,364,285,362,284,387,285,362,286,390,286,390,285,362,289,360,286,390,289,360,287,392,287,392,289,360,298,411,287,412,285,396,286,395,287,412,286,395,287,394,287,412,287,394,287,392,287,412,287,392,298,411,255,404,231,385,231,308,255,404,231,308,239,337,255,404,239,337,247,362,255,404,247,362,257,380,255,404,257,380,268,393,231,308,231,385,213,359,231,308,213,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,102,-135,102,-61,102,-61,102,-135,119,-111,102,-61,119,-111,193,303,193,303,119,-111,131,-84,193,303,131,-84,140,-58,86,-112,78,-153,102,-135,86,-112,102,-135,94,-89,49,-140,49,-159,49,-141,279,368,279,379,278,372,18,-143,18,-127,16,-136,46,-108,49,-140,51,-109, +223,-61,215,-89,207,-112,198,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,219,-135,238,-111,252,-84,261,-58,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,293,-143,291,-141,291,-140,292,-137,297,-132,299,-127,300,-120,299,-116,296,-112,293,-109,288,-108,284,-107,276,-109,269,-113,263,-119,259,-127,258,-136,259,-143,262,-150,267,-155,275,-158,286,-159,316,-153,341,-135,359,-111,373,-84,382,-58,473,308,481,337,489,362,499,380,510,393,523,397,525,397,527,396,529,394,529,392,528,390,526,387,523,384,521,379,520,372,521,368,523,364,531,360,536,360,544,361,551,366,556,372,560,380,561,390,560,396,558,402,552,407,545,411,534,412,502,404,476,385,457,359,443,330,435,303,16383,16383,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,352,308,359,337,368,362,377,380,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303, +49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,98,-135,98,-135,86,-112,77,-129,98,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,171,-137,172,-109,170,-140,170,-140,168,-108,165,-159,165,-159,168,-108,163,-107,165,-159,163,-107,155,-109,172,-109,173,-135,175,-112,175,-112,173,-135,175,-132,175,-112,175,-132,178,-116,178,-116,175,-132,178,-127,178,-116,178,-127,179,-120,215,-89,207,-112,219,-135,219,-135,207,-112,198,-129,219,-135,198,-129,195,-153,195,-153,198,-129,188,-140,195,-153,188,-140,175,-144,175,-144,173,-143,195,-153,195,-153,173,-143,172,-143,195,-153,172,-143,165,-159,165,-159,172,-143,170,-142,165,-159,170,-142,170,-141,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,231,308,239,337,234,385,231,308,234,385,215,359,231,308,215,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,98,-135,102,-61,102,-61,98,-135,117,-111,102,-61,117,-111,193,303,193,303,117,-111,131,-84,193,303,131,-84,140,-58,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,406,396,413,412,404,397,404,397,413,412,402,397,389,393,402,397,413,412,389,393,413,412,381,404,423,361,424,411,415,360,415,360,424,411,413,412,415,360,413,412,410,360,410,360,413,412,408,392,410,360,408,392,407,390,410,360,407,390,406,362,406,362,407,390,405,387,406,362,405,387,402,364,402,364,405,387,402,384,402,364,402,384,400,379,400,379,399,372,400,368,400,379,400,368,402,364,440,390,439,396,439,380,439,380,439,396,436,402,439,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,430,366,430,366,431,407,424,411,430,366,424,411,423,361,413,412,406,396,407,395,413,412,407,395,408,394,413,412,408,394,408,392,381,404,355,385,360,337,381,404,360,337,368,362,381,404,368,362,378,380,381,404,378,380,389,393,352,308,360,337,355,385,352,308,355,385,336,359,352,308,336,359,323,330,352,308,323,330,314,303,352,308,314,303,261,-58,215,-89,219,-135,223,-61,223,-61,219,-135,238,-111,223,-61,238,-111,314,303,314,303,238,-111,252,-84,314,303,252,-84,261,-58,170,-140,165,-159,170,-141,137,-136,138,-143,139,-127,139,-127,138,-143,141,-150,139,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,148,-113,148,-113,146,-155,154,-158,148,-113,154,-158,155,-109,155,-109,154,-158,165,-159,168,-108,170,-140,172,-109,172,-109,171,-137,173,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135, +344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,293,-143,291,-141,291,-140,292,-137,297,-132,299,-127,300,-120,299,-116,296,-112,293,-109,288,-108,284,-107,276,-109,269,-113,263,-119,259,-127,258,-136,259,-143,262,-150,267,-155,275,-158,286,-159,316,-153,341,-135,359,-111,373,-84,382,-58,473,308,481,337,489,362,499,380,510,393,523,397,525,397,527,396,529,394,529,392,528,390,526,387,523,384,521,379,520,372,521,368,523,364,531,360,536,360,544,361,551,366,556,372,560,380,561,390,560,396,558,402,552,407,545,411,534,412,502,404,476,385,457,359,443,330,435,303,16383,16383,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,352,308,359,337,368,362,377,380,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,16383,16383,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,98,-135,117,-111,131,-84,140,-58,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,176,238,167,238,131,232,101,216,76,192,60,161,55,126,58,99,67,74,81,53,100,35,123,22,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,157,13,167,13,202,19,233,35,258,59,274,90,280,126,276,152,267,177,253,199,234,216,211,229,231,308,239,337,247,362,257,381,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,358,201,330,193,303,16383,16383,162,32,206,210,224,199,239,185,251,167,258,147,261,126,256,96,243,70,222,50,197,37,167,32,16383,16383,172,219,127,41,109,52,95,66,83,84,76,104,74,126,78,155,92,181,112,201,137,214,167,219,296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13, +49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,98,-135,98,-135,86,-112,77,-129,98,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,170,-137,171,-109,169,-140,169,-140,167,-108,164,-159,164,-159,167,-108,162,-107,164,-159,162,-107,154,-109,171,-109,172,-135,175,-112,175,-112,172,-135,175,-132,175,-112,175,-132,177,-116,177,-116,175,-132,177,-127,177,-116,177,-127,178,-120,215,-89,207,-112,219,-135,219,-135,207,-112,198,-129,219,-135,198,-129,194,-153,194,-153,198,-129,187,-140,194,-153,187,-140,175,-144,175,-144,173,-143,194,-153,194,-153,173,-143,171,-143,194,-153,171,-143,164,-159,164,-159,171,-143,170,-142,164,-159,170,-142,169,-141,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,292,-137,293,-109,291,-140,291,-140,288,-108,286,-159,286,-159,288,-108,284,-107,286,-159,284,-107,276,-109,293,-109,294,-135,296,-112,296,-112,294,-135,297,-132,296,-112,297,-132,299,-116,299,-116,297,-132,299,-127,299,-116,299,-127,300,-120,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,231,308,239,337,234,385,231,308,234,385,215,359,231,308,215,359,201,330,231,308,201,330,193,303,231,308,193,303,140,-58,94,-89,98,-135,102,-61,102,-61,98,-135,117,-111,102,-61,117,-111,193,303,193,303,117,-111,131,-84,193,303,131,-84,140,-58,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,336,-89,328,-112,341,-135,341,-135,328,-112,319,-129,341,-135,319,-129,316,-153,316,-153,319,-129,309,-140,316,-153,309,-140,296,-144,296,-144,294,-143,316,-153,316,-153,294,-143,293,-143,316,-153,293,-143,286,-159,286,-159,293,-143,292,-142,286,-159,292,-142,291,-141,405,396,412,412,404,397,404,397,412,412,402,397,388,393,402,397,412,412,388,393,412,412,380,404,422,361,423,411,414,360,414,360,423,411,412,412,414,360,412,412,409,360,409,360,412,412,407,392,409,360,407,392,406,390,409,360,406,390,405,362,405,362,406,390,404,387,405,362,404,387,402,364,402,364,404,387,402,384,402,364,402,384,399,379,399,379,398,372,399,368,399,379,399,368,402,364,440,390,439,396,438,380,438,380,439,396,436,402,438,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,429,366,429,366,431,407,423,411,429,366,423,411,422,361,412,412,405,396,407,395,412,412,407,395,407,394,412,412,407,394,407,392,380,404,355,385,359,337,380,404,359,337,368,362,380,404,368,362,377,380,380,404,377,380,388,393,352,308,359,337,355,385,352,308,355,385,336,359,352,308,336,359,322,330,352,308,322,330,314,303,352,308,314,303,260,-58,215,-89,219,-135,223,-61,223,-61,219,-135,238,-111,223,-61,238,-111,314,303,314,303,238,-111,251,-84,314,303,251,-84,260,-58,169,-140,164,-159,169,-141,137,-136,138,-143,138,-127,138,-127,138,-143,141,-150,138,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,147,-113,147,-113,146,-155,154,-158,147,-113,154,-158,154,-109,154,-109,154,-158,164,-159,435,303,344,-61,359,-111,435,303,359,-111,373,-84,435,303,373,-84,382,-58,435,303,382,-58,473,308,435,303,473,308,443,330,344,-61,336,-89,341,-135,344,-61,341,-135,359,-111,291,-140,286,-159,291,-141,258,-136,259,-143,259,-127,259,-127,259,-143,262,-150,259,-127,262,-150,263,-119,263,-119,262,-150,267,-155,263,-119,267,-155,269,-113,269,-113,267,-155,275,-158,269,-113,275,-158,276,-109,276,-109,275,-158,286,-159,527,396,534,412,525,397,525,397,534,412,523,397,510,393,523,397,534,412,510,393,534,412,502,404,544,361,545,411,536,360,536,360,545,411,534,412,536,360,534,412,531,360,531,360,534,412,529,392,531,360,529,392,528,390,531,360,528,390,527,362,527,362,528,390,526,387,527,362,526,387,523,364,523,364,526,387,523,384,523,364,523,384,521,379,521,379,520,372,521,368,521,379,521,368,523,364,561,390,560,396,560,380,560,380,560,396,558,402,560,380,558,402,556,372,556,372,558,402,552,407,556,372,552,407,551,366,551,366,552,407,545,411,551,366,545,411,544,361,534,412,527,396,528,395,534,412,528,395,529,394,534,412,529,394,529,392,502,404,476,385,481,337,502,404,481,337,489,362,502,404,489,362,499,380,502,404,499,380,510,393,473,308,481,337,476,385,473,308,476,385,457,359,473,308,457,359,443,330,288,-108,291,-140,293,-109,293,-109,292,-137,294,-135,167,-108,169,-140,171,-109,171,-109,170,-137,172,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135, +176,238,167,238,131,232,101,216,76,192,60,161,55,126,58,99,67,74,81,53,100,35,123,22,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,18,-143,22,-150,28,-155,37,-158,49,-159,78,-153,102,-135,119,-111,131,-84,140,-58,157,13,167,13,202,19,233,35,258,59,274,90,280,126,276,152,267,177,253,199,234,216,211,229,231,308,239,337,247,362,257,381,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,318,396,314,402,307,407,298,411,287,412,255,404,231,385,213,358,201,330,193,303,16383,16383,162,32,206,210,224,199,239,185,251,167,258,147,261,126,256,96,243,70,222,50,197,37,167,32,16383,16383,172,219,127,41,109,52,95,66,83,84,76,104,74,126,78,155,92,181,112,201,137,214,167,219,296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,235,13,237,14,242,14,223,-61,216,-89,208,-112,199,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143, +49,-140,49,-137,51,-109,51,-109,49,-137,52,-135,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,18,-127,18,-143,21,-119,21,-119,18,-143,22,-150,21,-119,22,-150,27,-113,27,-113,22,-150,28,-155,27,-113,28,-155,34,-109,34,-109,28,-155,37,-158,34,-109,37,-158,42,-107,42,-107,37,-158,49,-159,42,-107,49,-159,46,-108,46,-108,49,-159,49,-140,86,-112,77,-129,78,-153,78,-153,77,-129,67,-140,78,-153,67,-140,54,-144,54,-144,52,-143,78,-153,78,-153,52,-143,50,-143,78,-153,50,-143,49,-159,49,-159,50,-143,49,-142,49,-159,49,-142,49,-141,95,66,100,35,109,52,109,52,100,35,123,22,109,52,123,22,127,41,127,41,123,22,131,-84,127,41,131,-84,172,219,172,219,131,-84,140,-58,172,219,140,-58,157,13,83,84,76,104,81,53,83,84,81,53,100,35,83,84,100,35,95,66,76,104,74,126,81,53,81,53,74,126,67,74,67,74,74,126,76,192,76,192,74,126,78,155,201,330,193,303,206,210,206,210,193,303,176,238,206,210,176,238,172,219,172,219,176,238,167,238,172,219,167,238,167,219,167,219,167,238,137,214,78,155,92,181,101,216,101,216,92,181,112,201,101,216,112,201,131,232,131,232,112,201,137,214,131,232,137,214,167,238,60,161,55,126,58,99,60,161,58,99,67,74,60,161,67,74,76,192,289,360,294,360,298,411,298,411,294,360,302,361,298,411,302,361,307,407,307,407,302,361,309,366,307,407,309,366,314,402,314,402,309,366,315,372,314,402,315,372,318,396,318,396,315,372,318,380,318,396,318,380,320,390,279,379,279,368,281,384,281,384,279,368,281,364,281,384,281,364,284,387,284,387,281,364,285,362,284,387,285,362,286,390,286,390,285,362,289,360,286,390,289,360,287,392,287,392,289,360,298,411,287,412,255,404,268,393,287,412,268,393,281,397,287,412,281,397,283,397,287,412,283,397,285,396,287,412,285,396,286,395,287,412,286,395,287,394,287,412,287,394,287,392,287,412,287,392,298,411,255,404,231,385,231,308,255,404,231,308,239,337,255,404,239,337,247,362,255,404,247,362,257,381,255,404,257,381,268,393,213,358,201,330,206,210,213,358,206,210,211,229,213,358,211,229,231,308,213,358,231,308,231,385,162,32,206,210,172,219,162,32,172,219,159,13,162,32,159,13,161,13,162,32,161,13,163,13,162,32,163,13,167,32,94,-89,102,-135,102,-61,102,-61,102,-135,119,-111,102,-61,119,-111,123,22,123,22,119,-111,131,-84,86,-112,78,-153,102,-135,86,-112,102,-135,94,-89,49,-140,49,-159,49,-141,258,59,274,90,261,126,261,126,267,177,258,147,258,147,267,177,253,199,258,147,253,199,251,167,251,167,253,199,239,185,234,216,211,229,224,199,234,216,224,199,239,185,234,216,239,185,253,199,274,90,280,126,276,152,274,90,276,152,267,177,274,90,267,177,261,126,258,59,261,126,256,96,258,59,256,96,243,70,258,59,243,70,233,35,163,13,165,13,167,32,167,32,165,13,167,13,167,32,167,13,197,37,197,37,167,13,202,19,197,37,202,19,222,50,222,50,202,19,233,35,222,50,233,35,243,70,224,199,211,229,206,210,279,368,279,379,278,372,18,-143,18,-127,16,-136,172,219,157,13,159,13,76,192,78,155,101,216,46,-108,49,-140,51,-109, +296,231,284,234,271,236,258,237,244,238,214,238,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,358,201,330,193,303,175,233,135,222,101,204,76,182,61,155,55,126,58,104,67,84,82,65,102,48,126,35,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,160,22,172,19,200,15,230,13,235,13,237,14,242,14,223,-61,216,-89,208,-112,199,-129,188,-140,175,-144,173,-143,172,-143,170,-142,170,-140,171,-137,173,-135,175,-132,178,-127,179,-120,178,-116,175,-112,172,-109,168,-108,163,-107,155,-109,148,-113,142,-119,139,-127,137,-136,138,-143,141,-150,146,-155,154,-158,165,-159,195,-153,220,-135,239,-111,252,-84,261,-58,280,18,321,29,356,47,382,70,398,96,404,126,401,149,391,170,376,189,355,206,330,219,352,308,360,337,368,362,378,380,389,393,402,397,404,397,406,396,408,394,408,392,407,390,405,387,402,384,400,379,399,372,400,368,402,364,410,360,415,360,423,361,430,366,435,372,439,380,440,390,439,396,436,402,431,407,424,411,413,412,381,404,355,385,336,359,323,330,314,303,16383,16383,325,200,345,188,362,175,374,160,382,143,385,126,380,103,367,82,345,64,318,50,285,39,16383,16383,247,33,235,33,232,32,228,32,214,33,201,34,188,36,176,38,165,41,209,219,241,219,267,217,291,211,16383,16383,131,54,111,65,96,78,84,93,77,109,74,126,79,149,91,170,112,188,138,203,171,213,415,225,385,231,368,234,351,236,334,237,352,308,360,337,368,362,377,381,388,393,402,397,404,397,405,396,407,395,407,392,406,390,402,384,399,379,398,372,399,368,402,364,405,362,409,360,414,360,422,361,429,366,435,372,438,380,440,390,439,396,436,402,431,407,423,411,412,412,380,404,355,385,336,359,322,330,314,303,297,238,257,238,227,236,213,234,231,308,239,337,247,362,257,380,268,393,281,397,283,397,285,396,287,394,287,392,286,390,284,387,281,384,279,379,278,372,279,368,281,364,289,360,294,360,302,361,309,366,315,372,318,380,320,390,319,396,316,402,310,407,302,411,292,412,260,404,234,385,215,359,201,330,193,303,174,227,132,214,99,197,74,177,59,153,54,126,57,103,66,82,80,64,101,49,127,37,102,-61,94,-89,86,-112,77,-129,67,-140,54,-144,52,-143,50,-143,49,-142,49,-137,52,-135,54,-132,57,-127,57,-116,54,-112,51,-109,46,-108,42,-107,34,-109,27,-113,21,-119,18,-127,16,-136,17,-143,20,-150,25,-155,33,-158,44,-159,74,-153,99,-135,117,-111,131,-84,140,-58,161,26,175,23,191,20,207,18,224,16,242,15,223,-61,215,-89,207,-112,198,-129,187,-140,175,-144,173,-143,171,-143,169,-141,169,-140,170,-137,175,-132,177,-127,178,-120,177,-116,175,-112,171,-109,167,-108,162,-107,154,-109,147,-113,142,-119,138,-127,137,-136,138,-143,141,-150,146,-155,154,-158,164,-159,194,-153,219,-135,238,-111,251,-84,260,-58,278,13,289,13,305,14,320,14,335,15,349,16,363,18,344,-61,336,-89,328,-112,319,-129,309,-140,296,-144,294,-143,292,-143,290,-141,290,-140,291,-137,296,-132,298,-127,299,-120,298,-116,296,-112,292,-109,288,-108,283,-107,275,-109,268,-113,262,-119,259,-127,257,-136,258,-143,261,-150,267,-155,275,-158,285,-159,316,-153,340,-135,359,-111,372,-84,381,-58,401,24,444,36,478,53,503,73,519,98,524,126,521,148, +49,-137,51,-109,49,-140,49,-140,46,-108,44,-159,44,-159,46,-108,42,-107,44,-159,42,-107,34,-109,51,-109,52,-135,54,-112,54,-112,52,-135,54,-132,54,-112,54,-132,57,-116,57,-116,54,-132,57,-127,57,-116,57,-127,57,-120,94,-89,86,-112,99,-135,99,-135,86,-112,77,-129,99,-135,77,-129,74,-153,74,-153,77,-129,67,-140,74,-153,67,-140,54,-144,54,-144,52,-143,74,-153,74,-153,52,-143,50,-143,74,-153,50,-143,44,-159,44,-159,50,-143,49,-142,44,-159,49,-142,49,-141,96,78,102,48,111,65,111,65,102,48,126,35,111,65,126,35,131,54,131,54,126,35,131,-84,131,54,131,-84,171,213,171,213,131,-84,140,-58,171,213,140,-58,160,22,84,93,77,109,82,65,84,93,82,65,102,48,84,93,102,48,96,78,77,109,74,126,82,65,82,65,74,126,67,84,67,84,74,126,76,182,76,182,74,126,79,149,171,-137,172,-109,170,-140,170,-140,168,-108,165,-159,165,-159,168,-108,163,-107,165,-159,163,-107,155,-109,172,-109,173,-135,175,-112,175,-112,173,-135,175,-132,175,-112,175,-132,178,-116,178,-116,175,-132,178,-127,178,-116,178,-127,179,-120,216,-89,208,-112,220,-135,220,-135,208,-112,199,-129,220,-135,199,-129,195,-153,195,-153,199,-129,188,-140,195,-153,188,-140,175,-144,175,-144,173,-143,195,-153,195,-153,173,-143,172,-143,195,-153,172,-143,165,-159,165,-159,172,-143,170,-142,165,-159,170,-142,170,-141,201,330,193,303,209,219,209,219,193,303,175,233,209,219,175,233,171,213,171,213,175,233,138,203,138,203,175,233,135,222,138,203,135,222,112,188,112,188,135,222,101,204,112,188,101,204,91,170,91,170,101,204,79,149,61,155,55,126,58,104,61,155,58,104,67,84,61,155,67,84,76,182,285,396,292,412,283,397,283,397,292,412,281,397,268,393,281,397,292,412,268,393,292,412,260,404,302,361,302,411,294,360,294,360,302,411,292,412,294,360,292,412,289,360,289,360,292,412,287,392,289,360,287,392,286,390,289,360,286,390,285,362,285,362,286,390,284,387,285,362,284,387,281,364,281,364,284,387,281,384,281,364,281,384,279,368,279,368,281,384,279,379,279,368,279,379,278,372,320,390,319,396,318,380,318,380,319,396,316,402,318,380,316,402,315,372,315,372,316,402,310,407,315,372,310,407,309,366,309,366,310,407,302,411,309,366,302,411,302,361,292,412,285,396,286,395,292,412,286,395,287,394,292,412,287,394,287,392,260,404,234,385,239,337,260,404,239,337,247,362,260,404,247,362,257,380,260,404,257,380,268,393,239,337,234,385,231,308,231,308,234,385,215,358,231,308,215,358,214,238,214,238,215,358,212,219,214,238,212,219,216,219,215,358,201,330,209,219,215,358,209,219,212,219,176,38,165,41,172,19,171,213,165,41,209,219,160,22,172,19,165,41,160,22,165,41,171,213,94,-89,99,-135,102,-61,102,-61,99,-135,117,-111,102,-61,117,-111,126,35,126,35,117,-111,131,-84,49,-140,44,-159,49,-141,16,-136,17,-143,18,-127,18,-127,17,-143,20,-150,18,-127,20,-150,21,-119,21,-119,20,-150,25,-155,21,-119,25,-155,27,-113,27,-113,25,-155,33,-158,27,-113,33,-158,34,-109,34,-109,33,-158,44,-159,296,231,284,234,291,211,291,211,325,200,296,231,296,231,325,200,314,303,406,396,413,412,404,397,404,397,413,412,402,397,389,393,402,397,413,412,389,393,413,412,381,404,423,361,424,411,415,360,415,360,424,411,413,412,415,360,413,412,410,360,410,360,413,412,408,392,410,360,408,392,407,390,410,360,407,390,406,362,406,362,407,390,405,387,406,362,405,387,402,364,402,364,405,387,402,384,402,364,402,384,400,379,400,379,399,372,400,368,400,379,400,368,402,364,440,390,439,396,439,380,439,380,439,396,436,402,439,380,436,402,435,372,435,372,436,402,431,407,435,372,431,407,430,366,430,366,431,407,424,411,430,366,424,411,423,361,413,412,406,396,407,395,413,412,407,395,408,394,413,412,408,394,408,392,381,404,355,385,360,337,381,404,360,337,368,362,381,404,368,362,378,380,381,404,378,380,389,393,336,359,330,219,352,308,336,359,352,308,355,385,355,385,352,308,360,337,336,359,325,200,330,219,330,219,325,200,345,188,330,219,345,188,355,206,355,206,345,188,362,175,355,206,362,175,376,189,376,189,362,175,374,160,376,189,374,160,382,143,323,330,314,303,325,200,323,330,325,200,336,359,291,211,247,33,252,-84,291,211,252,-84,261,-58,291,211,261,-58,280,18,291,211,280,18,285,39,291,211,285,39,325,200,243,33,239,33,239,14,243,33,239,14,242,14,243,33,242,14,252,-84,243,33,252,-84,247,33,216,-89,220,-135,223,-61,223,-61,220,-135,239,-111,223,-61,239,-111,242,14,242,14,239,-111,252,-84,170,-140,165,-159,170,-141,137,-136,138,-143,139,-127,139,-127,138,-143,141,-150,139,-127,141,-150,142,-119,142,-119,141,-150,146,-155,142,-119,146,-155,148,-113,148,-113,146,-155,154,-158,148,-113,154,-158,155,-109,155,-109,154,-158,165,-159,404,126,401,149,398,96,398,96,401,149,391,170,398,96,391,170,385,126,385,126,382,70,398,96,391,170,376,189,382,143,391,170,382,143,385,126,385,126,380,103,382,70,382,70,380,103,367,82,382,70,367,82,356,47,356,47,367,82,345,64,356,47,345,64,321,29,321,29,345,64,318,50,321,29,318,50,285,39,280,18,321,29,285,39,176,38,186,17,188,36,188,36,186,17,200,15,188,36,200,15,201,34,201,34,200,15,215,14,201,34,215,14,214,33,214,33,215,14,228,32,232,32,228,32,230,13,232,32,230,13,232,13,291,211,284,234,279,214,279,214,284,234,271,236,279,214,271,236,267,217,267,217,271,236,258,237,267,217,258,237,254,218,254,218,258,237,244,238,254,218,244,238,241,219,241,219,244,238,230,238,241,219,230,238,228,219,232,13,235,13,235,33,235,33,235,13,237,14,235,33,237,14,239,33,239,33,237,14,239,14,230,238,214,238,216,219,230,238,216,219,220,219,230,238,220,219,224,219,230,238,224,219,228,219,228,32,215,14,230,13,232,32,232,13,235,33,176,38,172,19,186,17,76,182,79,149,101,204,168,-108,170,-140,172,-109,172,-109,171,-137,173,-135,46,-108,49,-140,51,-109,51,-109,49,-137,52,-135, +319,60,319,93,170,93,200,160,319,160,319,193,214,193,274,331,247,331,187,193,24,193,24,160,172,160,143,93,24,93,24,60,128,60,69,-77,95,-77,156,60,319,206,319,239,24,239,24,206,16383,16383,319,110,319,143,24,143,24,110,16383,16383,319,14,319,47,24,47,24,14,319,14,319,47,150,47,177,110,319,110,319,143, +128,60,69,-77,95,-77,128,60,95,-77,156,60,128,60,156,60,143,93,128,60,143,93,24,93,128,60,24,93,24,60,172,160,143,93,156,60,172,160,156,60,170,93,172,160,170,93,200,160,172,160,200,160,187,193,172,160,187,193,24,193,172,160,24,193,24,160,214,193,274,331,247,331,214,193,247,331,200,160,214,193,200,160,319,160,214,193,319,160,319,193,170,93,156,60,319,60,170,93,319,60,319,93,187,193,200,160,247,331, +319,206,319,239,24,239,24,206,16383,16383,319,110,319,143,24,143,24,110,16383,16383,319,14,319,47,24,47,24,14,319,14,319,47,150,47,177,110,319,110,319,143,192,143,219,206,319,206,319,239,233,239,274,331,247,331,207,239, +24,239,24,206,319,206,24,239,319,206,319,239,24,143,24,110,319,110,24,143,319,110,319,143,24,47,24,14,319,14,24,47,319,14,319,47, +319,14,319,47,150,47,177,110,319,110,319,143,192,143,219,206,319,206,319,239,233,239,274,331,247,331,207,239,24,239,24,206,193,206,165,143,24,143,24,110,151,110,123,47,24,47,24,14,108,14,69,-77,95,-77,136,14,319,239,319,272,24,272,24,239,16383,16383,319,153,319,186,24,186,24,153,16383,16383,319,67,319,100,24,100,24,67,16383,16383,319,-18,319,14,24,14,24,-18,315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50, +108,14,69,-77,95,-77,108,14,95,-77,136,14,108,14,136,14,123,47,108,14,123,47,24,47,108,14,24,47,24,14,151,110,123,47,136,14,151,110,136,14,150,47,151,110,150,47,177,110,151,110,177,110,165,143,151,110,165,143,24,143,151,110,24,143,24,110,193,206,165,143,177,110,193,206,177,110,192,143,193,206,192,143,219,206,193,206,219,206,207,239,193,206,207,239,24,239,193,206,24,239,24,206,233,239,274,331,247,331,233,239,247,331,219,206,233,239,219,206,319,206,233,239,319,206,319,239,192,143,177,110,319,110,192,143,319,110,319,143,150,47,136,14,319,14,150,47,319,14,319,47,207,239,219,206,247,331, +319,239,319,272,24,272,24,239,16383,16383,319,153,319,186,24,186,24,153,16383,16383,319,67,319,100,24,100,24,67,16383,16383,319,-18,319,14,24,14,24,-18,315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,315,-17,32,-17,32,-50,315,162,315,167,32,305,32,272,248,165,32,57,32,26, +24,272,24,239,319,239,24,272,319,239,319,272,24,186,24,153,319,153,24,186,319,153,319,186,24,100,24,67,319,67,24,100,319,67,319,100,24,14,24,-18,319,-18,24,14,319,-18,319,14, +315,26,315,57,99,165,315,272,315,305,32,167,32,162,16383,16383,315,-50,315,-17,32,-17,32,-50,315,162,315,167,32,305,32,272,248,165,32,57,32,26,16383,16383,315,-50,315,-17,32,-17,32,-50, +99,165,315,272,315,305,99,165,315,305,32,167,99,165,32,167,315,26,99,165,315,26,315,57,32,-17,32,-50,315,-50,32,-17,315,-50,315,-17,315,26,32,167,32,162, +315,162,315,167,32,305,32,272,248,165,32,57,32,26,16383,16383,315,-50,315,-17,32,-17,32,-50,311,80,311,112,95,219,311,326,311,359,28,222,28,217,16383,16383,311,-5,311,27,28,27,28,-5, +248,165,32,57,315,162,248,165,315,162,315,167,248,165,315,167,32,305,248,165,32,305,32,272,32,-17,32,-50,315,-50,32,-17,315,-50,315,-17,315,162,32,57,32,26, +311,80,311,112,95,219,311,326,311,359,28,222,28,217,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,311,217,311,222,28,359,28,326,244,219,28,112,28,80,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104, +95,219,311,326,311,359,95,219,311,359,28,222,95,219,28,222,311,80,95,219,311,80,311,112,28,27,28,-5,311,-5,28,27,311,-5,311,27,28,-72,28,-104,311,-104,28,-72,311,-104,311,-72,311,80,28,222,28,217, +311,217,311,222,28,359,28,326,244,219,28,112,28,80,16383,16383,311,-5,311,27,28,27,28,-5,16383,16383,311,-104,311,-72,28,-72,28,-104,310,94,310,126,94,233,310,340,310,373,28,235,28,230,16383,16383,310,-91,310,-58,158,-58,200,8,310,8,310,41,221,41,245,79,215,79, +244,219,28,112,311,217,244,219,311,217,311,222,244,219,311,222,28,359,244,219,28,359,28,326,28,27,28,-5,311,-5,28,27,311,-5,311,27,28,-72,28,-104,311,-104,28,-72,311,-104,311,-72,311,217,28,112,28,80, +310,94,310,126,94,233,310,340,310,373,28,235,28,230,16383,16383,310,-91,310,-58,158,-58,200,8,310,8,310,41,221,41,245,79,215,79,191,41,28,41,28,8,171,8,128,-58,28,-58,28,-91,108,-91,84,-129,114,-129,138,-91,310,230,310,235,28,373,28,340,244,233,28,126,28,94,16383,16383,310,-91,310,-58,165,-58,207,8,310,8,310,41,228,41,252,79,222,79,198,41,28,41,28,8,177,8,135,-58,28,-58,28,-91,114,-91,91,-129,121,-129,145,-91, +94,233,310,340,310,373,94,233,310,373,28,235,94,233,28,235,310,94,94,233,310,94,310,126,28,41,171,8,191,41,191,41,171,8,200,8,191,41,200,8,215,79,215,79,200,8,221,41,215,79,221,41,245,79,221,41,200,8,310,8,221,41,310,8,310,41,108,-91,114,-129,128,-58,128,-58,114,-129,138,-91,128,-58,138,-91,171,8,171,8,138,-91,158,-58,171,8,158,-58,200,8,28,-58,28,-91,108,-91,28,-58,108,-91,128,-58,158,-58,138,-91,310,-91,158,-58,310,-91,310,-58,114,-129,108,-91,84,-129,171,8,28,41,28,8,310,94,28,235,28,230, +310,230,310,235,28,373,28,340,244,233,28,126,28,94,16383,16383,310,-91,310,-58,165,-58,207,8,310,8,310,41,228,41,252,79,222,79,198,41,28,41,28,8,177,8,135,-58,28,-58,28,-91,114,-91,91,-129,121,-129,145,-91,454,-12,454,18,238,127,454,233,454,266,171,129,171,124,16383,16383,295,-12,295,18,79,127,295,233,295,266,12,129,12,124,454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127, +244,233,28,126,310,230,244,233,310,230,310,235,244,233,310,235,28,373,244,233,28,373,28,340,28,41,177,8,198,41,198,41,177,8,207,8,198,41,207,8,222,79,222,79,207,8,228,41,222,79,228,41,252,79,228,41,207,8,310,8,228,41,310,8,310,41,114,-91,121,-129,135,-58,135,-58,121,-129,145,-91,135,-58,145,-91,177,8,177,8,145,-91,165,-58,177,8,165,-58,207,8,28,-58,28,-91,114,-91,28,-58,114,-91,135,-58,165,-58,145,-91,310,-91,165,-58,310,-91,310,-58,121,-129,114,-91,91,-129,177,8,28,41,28,8,310,230,28,126,28,94, +454,-12,454,18,238,127,454,233,454,266,171,129,171,124,16383,16383,295,-12,295,18,79,127,295,233,295,266,12,129,12,124,454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,12,18,12,-12, +238,127,454,233,454,266,238,127,454,266,171,129,238,127,171,129,454,-12,238,127,454,-12,454,18,79,127,295,233,295,266,79,127,295,266,12,129,79,127,12,129,295,-12,79,127,295,-12,295,18,295,-12,12,129,12,124,454,-12,171,129,171,124, +454,124,454,129,171,266,171,233,387,127,171,18,171,-12,16383,16383,295,124,295,129,12,266,12,233,228,127,12,18,12,-12,190,-102,179,-89,167,-74,154,-59,130,-25,149,4,165,35,176,66,183,97,185,127,183,156,176,187,164,218,149,248,130,278, +387,127,171,18,454,124,387,127,454,124,454,129,387,127,454,129,171,266,387,127,171,266,171,233,228,127,12,18,295,124,228,127,295,124,295,129,228,127,295,129,12,266,228,127,12,266,12,233,295,124,12,18,12,-12,454,124,171,18,171,-12, +190,-102,179,-89,167,-74,154,-59,130,-25,149,4,165,35,176,66,183,97,185,127,183,156,176,187,164,218,149,248,130,278,142,296,154,312,167,328,179,342,190,355,190,365,174,353,158,340,143,326,130,312,117,296,103,312,89,326,74,340,59,353,42,365,42,357,66,329,78,313,91,296,103,278,84,249,68,218,57,187,50,156,47,127,50,97,57,66,68,35,84,4,103,-25,91,-42,78,-58,66,-74,42,-102,42,-111,59,-99,89,-73,117,-43,143,-73,158,-86,174,-99,190,-111,16383,16383,152,127,151,98,146,70,138,45,128,20,116,-2,104,20,95,45,87,71,82,98,80,127,82,155,87,182,95,208,105,233,117,256,128,233,138,208,146,182,151,155,152,127,319,22,300,49,273,71,242,87,207,96,174,100,198,155,227,162,255,173,281,188,303,208,319,232,319,249,302,230,283,215,261,204,237,195,213,190,254,286,228,286,184,186,171,186,138,188,105,195,75,206,47,224,24,249,24,232,43,204,69,182,101,166,135,156,170,153,146,98,116,92,88,81,61,65,40,46,24,22,24,4,40,22,60,38,82,49,106,58,131,64,89,-32,116,-32,159,66,161,67,171,67,204,65,237,58,268,46,295,28,319,4,310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331, +130,278,142,296,143,326,143,326,142,296,154,312,143,326,154,312,158,340,158,340,154,312,167,328,158,340,167,328,174,353,174,353,167,328,179,342,174,353,179,342,190,365,190,365,179,342,190,355,117,296,103,312,105,233,117,296,105,233,117,256,117,256,128,233,130,312,130,312,128,233,130,278,130,312,130,278,143,326,116,-2,117,-43,128,20,128,20,117,-43,130,-58,128,20,130,-58,130,-25,130,-25,130,-58,143,-73,130,-25,138,45,128,20,183,97,183,156,176,66,176,66,183,156,176,187,176,66,176,187,165,35,165,35,176,187,164,218,165,35,164,218,152,127,152,127,164,218,151,155,149,248,130,278,138,208,149,248,138,208,146,182,149,248,146,182,151,155,149,248,151,155,164,218,130,312,117,296,117,256,165,35,152,127,151,98,165,35,151,98,149,4,149,4,151,98,146,70,149,4,146,70,138,45,142,-42,143,-73,154,-59,154,-59,143,-73,158,-86,154,-59,158,-86,167,-74,167,-74,158,-86,174,-99,167,-74,174,-99,179,-89,179,-89,174,-99,190,-111,179,-89,190,-111,190,-102,105,233,103,312,103,278,103,278,103,312,91,296,91,296,103,312,89,326,91,296,89,326,78,313,78,313,89,326,74,340,78,313,74,340,66,329,66,329,74,340,59,353,66,329,59,353,54,343,54,343,59,353,42,365,54,343,42,365,42,357,103,-58,103,-25,91,-42,103,-58,91,-42,89,-73,89,-73,91,-42,78,-58,89,-73,78,-58,74,-86,74,-86,78,-58,66,-74,74,-86,66,-74,59,-99,59,-99,66,-74,54,-88,59,-99,54,-88,42,-102,104,20,95,45,103,-25,104,20,103,-25,103,-58,104,20,103,-58,117,-43,104,20,117,-43,116,-2,103,278,84,249,87,182,103,278,87,182,95,208,103,278,95,208,105,233,84,249,68,218,68,35,84,249,68,35,80,127,84,249,80,127,82,155,84,249,82,155,87,182,87,71,82,98,84,4,84,4,82,98,80,127,68,35,68,218,57,66,57,66,68,218,57,187,57,66,57,187,50,97,50,97,57,187,50,156,50,97,50,156,47,127,87,71,84,4,103,-25,87,71,103,-25,95,45,84,4,80,127,68,35,59,-99,42,-102,42,-111,130,-25,143,-73,142,-42,138,45,130,-25,149,4,183,156,183,97,185,127,130,278,128,233,138,208, +319,22,300,49,273,71,242,87,207,96,174,100,198,155,227,162,255,173,281,188,303,208,319,232,319,249,302,230,283,215,261,204,237,195,213,190,254,286,228,286,184,186,171,186,138,188,105,195,75,206,47,224,24,249,24,232,43,204,69,182,101,166,135,156,170,153,146,98,116,92,88,81,61,65,40,46,24,22,24,4,40,22,60,38,82,49,106,58,131,64,89,-32,116,-32,159,66,161,67,171,67,204,65,237,58,268,46,295,28,319,4,310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,310,-50,310,-17,129,-17,171,92,310,25,310,56,181,120,220,226,310,271,310,304,236,267,272,365,246,365,203,251,28,166, +40,22,60,38,61,65,61,65,60,38,82,49,61,65,82,49,88,81,88,81,82,49,106,58,88,81,106,58,116,92,116,92,106,58,131,64,146,98,131,64,159,66,146,98,159,66,170,153,170,153,159,66,161,67,170,153,161,67,164,67,40,22,61,65,40,46,40,22,40,46,24,22,40,22,24,22,24,4,135,156,170,153,138,188,138,188,170,153,171,186,173,186,171,186,171,67,173,186,171,67,174,100,174,100,171,67,204,65,174,100,204,65,207,96,207,96,204,65,237,58,207,96,237,58,242,87,242,87,237,58,268,46,242,87,268,46,273,71,273,71,268,46,295,28,273,71,295,28,300,49,300,49,295,28,319,4,300,49,319,4,319,22,24,249,43,204,47,224,47,224,43,204,69,182,47,224,69,182,75,206,75,206,69,182,101,166,75,206,101,166,105,195,105,195,101,166,135,156,105,195,135,156,138,188,171,67,171,186,170,153,171,67,170,153,168,67,170,153,164,67,166,67,170,153,166,67,168,67,131,64,89,-32,116,-32,131,64,116,-32,159,66,319,249,302,230,303,208,303,208,302,230,283,215,303,208,283,215,281,188,281,188,283,215,261,204,281,188,261,204,255,173,255,173,261,204,237,195,255,173,237,195,227,162,227,162,237,195,213,190,227,162,213,190,198,155,228,286,184,186,198,155,228,286,198,155,213,190,228,286,213,190,254,286,198,155,184,186,181,186,198,155,181,186,179,186,198,155,179,186,176,186,198,155,176,186,174,100,176,186,173,186,174,100,43,204,24,249,24,232,319,249,303,208,319,232,116,92,131,64,146,98, +310,-12,310,18,171,88,214,185,310,233,310,266,232,228,277,331,250,331,198,211,28,128,28,123,137,71,71,-77,99,-77,158,60,16383,16383,179,168,148,99,94,126,310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153, +198,211,28,128,94,126,94,126,28,128,137,71,94,126,137,71,148,99,148,99,137,71,158,60,148,99,158,60,179,168,179,168,158,60,171,88,179,168,171,88,214,185,94,126,179,168,198,211,198,211,179,168,214,185,198,211,214,185,250,331,250,331,214,185,232,228,250,331,232,228,277,331,137,71,71,-77,99,-77,137,71,99,-77,158,60,232,228,214,185,310,233,232,228,310,233,310,266,171,88,158,60,310,-12,171,88,310,-12,310,18,137,71,28,128,28,123, +310,123,310,128,203,181,268,331,241,331,180,192,28,266,28,233,168,164,126,68,28,18,28,-12,108,26,63,-77,89,-77,142,42,16383,16383,244,126,161,84,190,153,310,-50,310,-17,129,-17,171,92,310,25,310,56,181,120,220,226,310,271,310,304,236,267,272,365,246,365,203,251,28,166,28,161,147,103,103,-17,28,-17,28,-50, +108,26,63,-77,89,-77,108,26,89,-77,142,42,108,26,142,42,126,68,108,26,126,68,28,18,108,26,28,18,28,-12,168,164,126,68,142,42,168,164,142,42,161,84,168,164,161,84,190,153,168,164,190,153,180,192,168,164,180,192,28,266,168,164,28,266,28,233,203,181,268,331,241,331,203,181,241,331,190,153,203,181,190,153,244,126,203,181,244,126,310,128,310,123,310,128,244,126,310,123,244,126,161,84,310,123,161,84,142,42,180,192,190,153,241,331, +320,0,320,33,190,33,190,331,157,331,157,33,26,33,26,0,313,126,309,150,298,171,281,188,260,199,235,203,211,199,189,188, +190,331,157,331,190,33,190,33,157,331,157,33,190,33,157,33,320,0,320,0,157,33,26,33,320,0,26,33,26,0,190,33,320,0,320,33 }; -short mgl_buf_fnt[246080] = { -123, -123,132,123,164,390,164,395,165,400,165,416,163,436,159,451,151,463,141,471,128,473,114,471,103,463,96,452,92,437,91,420,91,404,92,398,93,390,16383,16383,165,30,163,42,158,52,150,61,140,66,128,68,116,66,106,61,98,52,92,42,91,30,92,19,97,8,105,1,115,-3,127,-5,140,-3,150,1,158,8,163,18,165,30,209,302,216,341,222,376,227,405,231,428,232,445,231,454,226,462,220,468,212,472,202,473,193,472,184,468,178,461,173,453,172,443,173,430,176,408,187,342,195,302,16383,16383,91,302,98,340,105,375,109,404,112,428,113,445,112,454,108,462,102,468,94,472,84,473,74,472,66,468,59,461,55,453,54,443,55,430,58,408,69,342,77,302,347,284,347,322,280,322,300,463,259,463,239,322,145,322,167,463,127,463,105,322,23,322,23,284,99,284,84,190,4,190,4,152,78,152,55,0,96,0,119,152,213,152,191,0,232,0,253,152,329,152,329,190,259,190,273,284,16383,16383,233,284,219,190,125,190,140,284,185,446,216,439,241,426,261,407,276,382,287,350,298,350,298,427,283,439,265,449,243,456,216,462,185,465,185,509,161,509,161,465,123,459,89,446,62,425,43,397,37,359,40,327,53,299,75,274,111,247,161,217,161,20,126,24,96,37,72,59,54,89,41,127,30,127,30,36,53,22,76,12,100,5,128,1,161,0,161,-60,185,-60,185,0,230,9,267,23,296,45,314,76,320,119,320,134,318,148,315,160,311,172,306,182,294,198,279,213,258,230,228,249,185,273,16383,16383,161,285,131,307,110,324,97,340,90,355,88,373,91,393,99,411,114,426,134,438,161,446,16383,16383,185,205,218,184,241,165,255,146,263,126,265,103,262,76,253,55,238,40,215,28,185,20,480,149,478,178,469,200,455,217,436,228,413,231,374,223,338,201,308,168,288,127,280,84,285,53,297,26,315,5,338,-7,366,-12,401,-4,432,19,457,55,474,100,480,149,16383,16383,464,151,459,107,445,68,424,35,399,13,370,5,358,8,347,14,338,25,333,38,331,53,334,83,342,114,353,145,368,173,386,195,391,201,405,209,413,211,420,212,435,209,447,201,456,188,462,171,464,151,16383,16383,434,495,404,495,371,463,348,444,328,432,310,428,287,427,272,427,259,430,247,436,234,443,220,454,209, -462,201,467,193,471,186,473,178,473,136,465,99,444,70,411,50,370,43,324,47,293,58,267,76,246,98,233,125,228,138,229,151,232,163,237,174,244,185,254,204,275,219,301,231,328,239,357,241,387,241,405,240,411,239,418,251,414,262,411,272,409,282,408,292,408,313,409,330,413,346,421,361,432,377,448,101,-12,134,-12,16383,16383,225,398,220,352,207,310,186,277,161,255,132,247,119,249,108,256,99,266,94,280,92,296,94,319,98,343,105,366,114,389,126,410,134,422,141,432,150,440,162,447,177,455,183,448,190,442,196,437,201,434,207,430,215,426,220,422,223,416,225,409,225,398,515,77,502,63,490,53,478,46,465,42,450,41,426,43,403,51,383,64,363,82,344,105,364,134,382,161,414,213,432,242,442,257,452,269,464,277,479,282,498,284,498,298,347,298,347,284,365,281,378,276,386,270,391,262,392,251,390,231,383,210,370,186,352,158,327,124,306,150,286,177,269,204,252,234,235,269,278,290,309,311,329,333,340,358,344,387,339,417,326,441,305,459,279,470,248,473,214,469,185,455,162,432,147,403,141,368,142,350,144,332,149,312,156,290,166,264,139,248,100,222,70,193,48,162,34,129,30,96,35,58,50,29,75,7,108,-4,149,-8,181,-6,212,0,241,12,270,30,300,55,326,31,350,13,373,0,396,-6,420,-8,447,-5,471,4,493,20,511,42,525,70,16383,16383,306,389,304,366,295,345,280,326,257,308,225,291,213,315,205,335,200,354,198,373,197,393,199,412,207,428,218,440,234,448,252,451,270,448,285,439,297,426,304,409,306,389,16383,16383,283,73,259,55,237,43,218,34,199,30,180,28,153,32,129,44,110,63,98,89,94,122,97,149,105,173,121,195,145,217,177,240,198,197,218,161,239,129,260,101,283,73,70,302,78,341,84,376,89,406,92,429,93,445,92,454,88,462,82,468,74,472,64,473,54,472,46,468,39,462,35,453,34,444,35,428,38,405,43,376,49,341,56,302,213,-112,163,-62,129,-11,107,43,97,106,94,178,97,252,108,312,129,365,163,413,213,462,206,473,145,430,97,378,62,318,41,251,34,177,41,105,62,37,97,-24,144,-79,205,-123,20,462,72,413,106,363,127,307,136,244,139,171,136,97,126,36,105,-15,71,-64,20,-112,27,-123,87,-79,136, --26,171,32,192,99,199,173,192,244,170,311,135,374,88,429,29,473,188,330,206,340,221,347,235,352,249,355,266,359,280,361,290,366,297,371,301,379,302,388,301,397,298,405,292,410,285,414,277,415,267,412,256,404,244,393,233,381,223,370,215,363,208,357,201,352,192,346,182,340,182,367,184,378,186,390,189,402,194,415,196,423,199,430,200,437,201,443,202,448,200,456,197,463,191,468,184,472,176,473,168,472,161,469,156,463,152,457,151,449,151,444,153,430,155,422,158,413,162,399,165,386,167,373,169,349,169,340,154,349,142,357,130,367,106,391,98,400,91,406,85,411,78,413,72,414,64,413,58,409,53,403,50,396,49,387,49,388,51,378,56,371,65,365,78,360,96,355,110,353,122,349,135,344,149,338,164,330,149,321,135,314,123,309,109,305,91,302,75,298,63,293,54,287,49,280,48,270,49,262,52,255,57,250,64,246,73,245,80,246,85,248,91,251,97,256,104,263,114,274,121,281,125,286,128,290,132,294,136,297,141,301,147,306,156,311,169,320,169,313,168,296,167,282,165,269,162,256,158,244,155,236,152,229,151,222,150,216,149,211,151,203,154,196,160,190,167,187,174,185,183,187,190,191,196,197,201,204,202,213,202,216,201,220,200,225,198,230,191,251,187,266,184,281,182,313,182,320,188,316,196,310,205,304,215,297,225,287,236,275,246,263,254,255,262,249,270,246,278,245,286,246,293,250,299,256,302,263,303,272,302,281,297,289,289,294,277,298,261,302,246,305,218,313,205,319,194,326,445,154,445,200,263,200,263,383,216,383,216,200,34,200,34,154,216,154,216,-28,263,-28,263,154,58,-97,85,-81,107,-61,123,-38,133,-14,137,10,134,31,126,47,114,60,98,68,80,71,66,69,55,64,46,56,40,45,38,31,40,19,45,9,53,2,65,-2,79,-3,83,-3,88,-2,92,-1,102,-1,105,-2,109,-6,109,-9,107,-23,100,-38,88,-53,72,-69,51,-84,199,136,199,180,27,180,27,136,127,30,125,42,119,53,111,62,100,68,88,70,76,68,65,63,57,54,51,43,49,30,51,18,56,8,65,0,75,-5,88,-7,100,-5,110,0,119,8,125,19,127,30,201,473,154,473,-5,-9,41,-9,333,231,325,311,305,378,272,429,229,462,178,473,118,461,73,425,41, -373,23,308,17,235,22,166,38,99,68,43,113,4,175,-9,235,3,280,40,310,94,327,160,333,231,16383,16383,266,227,262,151,251,91,233,46,207,18,175,9,142,18,117,46,99,91,88,153,84,230,88,308,99,371,117,417,142,445,173,455,207,445,233,417,251,370,262,307,266,227,276,0,276,10,249,12,230,17,218,25,211,37,209,53,209,471,203,473,77,409,77,400,97,407,104,410,111,412,118,413,128,415,136,414,142,410,146,403,148,393,149,380,149,66,147,46,141,31,128,20,110,14,83,10,83,0,332,96,322,100,309,80,297,67,285,58,271,54,255,53,91,53,206,177,239,214,265,250,282,284,293,317,296,350,290,390,273,423,246,450,210,467,166,473,120,467,82,448,54,418,34,380,21,334,36,330,53,366,70,392,89,409,111,418,138,421,172,417,199,405,219,385,232,357,236,323,233,288,223,253,205,218,179,181,145,141,20,9,20,0,294,0,43,357,60,385,79,405,100,420,122,428,147,431,172,428,193,420,209,405,219,386,223,360,220,336,212,314,201,295,185,279,166,266,157,261,147,256,135,251,122,246,107,241,107,231,128,231,145,230,158,229,169,227,178,224,204,213,225,198,240,177,249,152,252,123,247,89,234,59,215,36,189,21,160,16,149,16,138,18,127,22,114,28,100,37,89,44,80,49,72,53,64,55,57,55,48,54,40,51,34,45,30,38,29,30,32,16,42,5,58,-2,79,-7,107,-9,145,-7,181,0,215,13,245,31,270,55,280,72,289,91,296,111,300,131,302,153,300,175,296,195,290,213,282,229,271,244,253,260,242,266,229,273,212,280,213,280,237,298,256,317,269,337,276,357,278,377,273,409,258,436,235,456,205,469,169,473,128,468,95,453,67,429,46,397,31,360,331,117,331,162,259,162,259,473,228,473,9,162,9,117,205,117,205,0,259,0,259,117,16383,16383,205,162,37,162,205,402,306,477,300,481,294,474,288,469,282,466,275,464,266,463,122,463,45,298,45,292,46,290,47,289,50,288,53,288,91,286,125,279,155,268,180,254,202,239,219,223,232,204,241,183,247,160,249,134,244,99,230,67,209,41,183,23,155,16,146,17,137,20,127,24,116,30,105,38,92,48,82,54,72,58,63,60,53,60,42,59,34,56,27,50,23,43,22, -34,26,19,38,7,57,-1,81,-7,111,-9,138,-8,164,-4,187,2,209,12,230,24,255,46,274,71,288,100,296,133,298,170,298,191,295,210,290,227,283,243,273,259,249,288,223,309,192,325,151,337,98,348,127,408,269,408,277,412,280,414,281,417,313,479,259,471,213,460,173,444,136,421,100,388,73,356,52,320,36,281,27,240,23,195,25,166,29,137,36,110,46,84,57,61,74,36,95,17,120,2,149,-6,180,-9,207,-7,232,0,255,9,275,24,292,41,305,60,314,80,321,103,326,127,327,153,321,203,304,244,277,274,241,293,195,299,178,299,161,296,144,290,126,281,106,268,124,327,156,379,199,420,252,450,313,468,16383,16383,265,131,262,91,253,58,237,32,216,16,188,10,153,18,125,41,105,78,93,127,89,186,94,219,106,243,125,257,147,265,170,267,205,262,232,245,250,218,261,180,265,131,314,452,314,463,56,463,14,360,27,354,43,378,57,395,71,405,87,410,109,412,259,412,120,-4,166,-4,312,109,309,140,298,170,278,198,247,227,203,259,240,281,266,300,284,321,294,345,297,373,291,405,275,432,250,454,218,468,179,473,135,469,98,454,69,432,50,401,44,364,46,339,53,315,69,291,94,265,130,232,92,203,66,178,50,155,41,131,39,105,45,67,64,36,92,11,129,-4,173,-9,220,-4,259,11,287,36,305,69,312,109,16383,16383,248,373,246,349,239,327,226,307,208,289,183,273,150,294,125,315,108,337,98,359,95,384,99,408,109,427,125,442,146,451,172,454,198,450,219,439,235,422,245,400,248,373,16383,16383,190,191,215,171,234,152,248,133,256,111,259,87,255,61,244,40,228,24,207,14,181,10,152,14,127,27,108,47,96,76,92,111,94,136,100,159,111,179,127,199,148,219,41,-15,91,-6,132,4,169,19,203,40,238,68,267,101,291,140,308,182,318,228,321,276,319,310,314,342,304,371,292,397,277,420,259,439,239,454,217,464,193,471,166,473,119,465,79,442,48,407,28,361,21,308,27,260,44,221,70,191,105,172,147,166,171,167,193,171,214,179,234,190,252,205,230,142,196,88,152,46,99,16,39,-1,16383,16383,253,248,248,229,233,214,214,204,192,198,172,196,142,202,118,220,100,248,89,286,85,332,86,355,90,377,95,398,102,416,110,430,118,438,127, -445,137,450,149,453,161,454,194,447,220,425,238,389,249,340,253,276,134,282,132,294,127,305,119,313,108,319,96,321,83,319,73,314,64,306,59,295,57,282,59,270,65,259,73,251,84,246,96,244,108,246,119,251,127,259,132,270,134,282,16383,16383,134,30,132,43,127,54,119,62,108,68,96,70,83,68,73,63,64,54,59,43,57,30,59,19,65,8,73,0,84,-5,96,-7,108,-5,119,0,127,8,132,19,134,30,134,282,132,294,126,305,118,313,107,319,95,321,83,319,72,314,63,306,58,295,56,282,58,270,64,259,72,251,83,246,95,244,107,246,118,251,126,259,132,270,134,282,16383,16383,75,-97,102,-82,124,-63,140,-40,150,-16,153,9,150,30,143,47,131,60,115,68,98,71,84,69,73,64,64,56,58,45,56,32,58,20,63,10,71,2,82,-1,97,-3,101,-3,109,-1,119,-1,122,-3,124,-5,125,-7,126,-10,123,-24,116,-39,105,-54,89,-69,68,-84,434,-16,434,27,132,178,434,328,434,373,39,181,39,174,446,224,446,270,34,270,34,224,16383,16383,446,84,446,130,34,130,34,84,434,174,434,181,39,373,39,328,341,178,39,27,39,-16,171,115,176,142,183,165,192,187,203,206,216,225,247,262,268,292,281,316,288,339,290,363,283,400,265,431,237,454,202,468,162,473,163,473,125,469,93,455,69,434,53,406,48,373,49,357,54,344,61,335,70,329,81,327,91,328,99,332,105,339,109,347,110,357,107,369,101,378,93,386,86,396,84,409,87,422,97,434,112,443,129,450,149,452,174,448,195,437,211,420,222,397,226,370,224,344,218,318,210,292,200,266,190,239,177,205,168,177,163,153,160,133,159,115,16383,16383,203,31,201,43,196,53,188,61,178,67,166,69,154,67,144,62,136,54,131,43,129,31,131,20,135,10,143,2,154,-3,166,-4,178,-3,188,2,196,10,201,20,203,31,481,51,452,38,424,28,396,22,368,18,341,17,274,27,218,56,176,100,149,157,140,226,142,257,147,288,156,318,169,346,184,371,207,399,234,421,265,438,299,448,338,452,401,442,456,415,499,373,528,321,538,261,534,220,520,182,501,152,477,131,450,123,439,125,431,128,425,135,421,144,420,156,420,159,421,162,421,166,422,168,468,346,420,346,413,320,412,320,405,333,397,343,387,350,375, -354,360,355,339,353,320,347,303,337,286,324,271,306,256,284,243,259,233,233,227,206,225,179,228,152,237,131,250,115,267,104,286,101,306,103,325,109,343,120,359,134,373,152,375,152,380,134,390,120,403,109,420,102,438,100,478,109,513,133,541,170,560,216,566,268,555,334,523,390,474,434,410,463,337,473,301,471,268,466,237,456,207,442,180,425,147,395,120,360,99,320,86,276,81,229,94,151,130,85,185,34,255,1,338,-9,366,-8,394,-4,422,3,454,14,490,30,16383,16383,401,283,399,262,395,240,388,216,380,193,370,172,360,158,350,146,339,138,328,133,316,131,302,134,290,142,282,154,276,171,274,192,275,210,279,228,284,245,291,261,299,276,313,293,327,307,341,317,355,323,368,325,379,323,388,318,395,309,399,298,401,283,495,0,495,13,476,17,462,24,450,36,440,54,429,77,257,472,243,472,98,130,77,81,61,48,47,28,31,18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364,44,365,37,363,29,361,25,358,22,355,20,350,17,345,15,338,14,329,13,316,13,316,0,16383,16383,313,180,152,180,232,373,295,245,315,249,330,254,342,260,353,266,363,273,372,284,380,298,386,313,390,330,391,347,384,387,362,420,325,443,273,458,208,463,12,463,12,450,41,447,60,442,72,431,77,413,79,385,79,79,77,52,71,33,59,22,40,16,12,13,12,0,248,0,304,5,350,21,385,47,407,82,415,124,413,143,409,160,402,177,393,192,380,205,368,216,355,224,339,232,320,238,295,244,16383,16383,151,256,151,424,153,430,156,434,161,437,167,438,196,438,241,433,276,421,300,402,315,375,320,343,315,312,303,287,282,270,253,260,215,256,16383,16383,151,228,194,227,227,225,254,221,278,213,302,200,314,190,323,177,330,162,333,144,334,125,333,108,330,92,325,78,317,66,308,56,290,43,271,34,250,29,225,26,194,26,177,27,165,30,157,36,152,45,151,57,430,91,400,65,371,45,342,32,311,24,276,21,247,23,220,29,194,39,172,53,152,71,133,95,119,123,109,157,103,195,101,239,108,307,130,364,164,408,211,435,269,445,295,443,319,436,342,425,362,410,381,392,391,381,399, -368,407,353,413,335,418,314,434,314,427,473,414,473,410,465,405,459,399,454,392,451,384,450,376,451,367,453,356,456,346,460,336,463,285,472,269,473,252,473,214,471,177,462,143,448,111,427,83,401,61,372,43,340,30,306,22,268,20,227,22,186,31,148,45,112,63,80,87,52,113,31,144,13,178,0,214,-6,252,-9,300,-5,343,5,382,23,415,47,443,79,11,463,11,450,38,447,56,442,66,431,71,413,73,385,73,80,71,53,67,34,56,23,38,17,11,13,11,0,208,0,249,2,288,8,323,17,356,29,384,45,418,72,445,104,464,143,476,186,480,234,477,275,468,312,454,345,434,374,410,400,378,422,341,440,299,453,252,461,200,463,16383,16383,145,408,146,420,150,428,157,434,167,437,181,438,220,436,254,431,284,422,311,408,337,389,360,364,379,337,392,306,400,270,403,230,400,185,392,146,377,113,357,85,330,62,330,63,305,48,279,37,251,31,218,27,178,26,164,27,154,30,148,37,145,46,145,59,418,118,398,118,379,80,357,53,328,37,289,28,237,26,184,26,164,29,151,35,143,44,141,59,141,229,246,229,277,227,298,222,311,210,320,191,326,161,341,161,341,325,326,325,320,297,311,277,298,265,277,259,246,258,141,258,141,423,144,430,148,434,155,436,165,437,257,437,298,435,327,429,346,416,357,395,365,363,382,363,380,463,9,463,9,450,35,447,53,441,63,430,68,411,70,385,70,80,68,52,64,34,53,23,36,17,9,13,9,0,386,0,382,363,379,463,9,463,9,450,36,447,53,440,64,429,68,412,70,386,70,86,68,55,63,35,52,23,35,16,8,13,8,0,205,0,205,13,177,16,159,22,148,33,142,51,141,78,141,229,240,229,271,227,292,222,306,210,315,190,320,161,335,161,335,324,320,324,315,296,306,277,292,265,270,259,240,258,141,258,141,421,143,428,148,433,155,436,165,437,257,437,300,435,328,429,346,416,358,395,365,363,496,248,317,248,317,235,345,232,363,227,374,216,379,198,380,171,380,61,375,47,362,36,342,26,316,20,286,18,225,27,174,54,135,97,111,155,102,227,104,267,111,306,121,341,136,372,156,397,175,414,196,427,220,437,245,443,273,445,296,444,318,439,339,431,358,421,375,407,387,395,397,382,406,367,415, -348,425,326,441,326,435,473,420,473,417,466,411,459,405,454,397,451,388,450,384,450,378,451,372,453,358,457,340,463,322,468,305,471,286,473,265,473,225,471,189,463,155,451,124,434,98,413,72,385,51,352,36,315,26,274,23,229,25,189,32,153,43,121,59,91,80,65,111,39,146,18,186,3,227,-6,270,-9,312,-7,352,-1,389,8,421,22,448,39,448,179,449,202,453,218,461,227,475,233,496,235,492,0,492,13,466,17,448,23,437,35,431,52,430,77,430,384,431,411,437,429,448,440,466,447,492,450,492,463,296,463,296,450,323,447,341,441,352,430,357,411,359,384,359,252,146,252,146,384,148,411,153,429,165,441,183,447,209,450,209,463,13,463,13,450,40,447,58,441,69,429,74,411,75,384,75,85,74,55,69,35,58,23,40,16,12,13,13,13,13,0,208,0,207,13,181,16,163,23,153,35,147,53,146,79,146,220,359,220,359,87,357,57,353,37,342,24,324,17,297,13,297,0,220,0,220,13,191,16,171,22,159,33,153,52,152,78,152,386,153,413,159,431,171,442,191,448,220,450,220,463,13,463,13,450,42,447,62,442,74,431,79,413,80,386,80,78,79,51,73,32,62,21,42,16,12,13,13,13,13,0,248,463,47,463,47,450,76,447,94,441,105,431,110,413,112,385,112,66,111,47,109,33,104,24,97,19,86,17,79,19,74,23,71,30,68,38,64,48,59,58,53,66,47,72,39,76,30,77,19,75,10,70,3,61,-1,51,-3,41,0,23,9,9,23,-1,43,-7,66,-9,107,-4,140,11,164,39,179,78,184,130,184,384,185,412,190,430,201,441,219,447,248,450,506,0,506,13,488,15,471,22,451,35,427,57,397,90,233,269,363,394,389,417,409,433,428,442,448,447,473,450,473,463,291,463,291,450,309,449,320,448,329,445,334,441,337,435,338,427,335,417,328,405,317,391,301,376,283,359,158,244,158,384,159,411,163,429,174,440,192,447,221,450,221,463,23,463,23,450,51,447,70,440,80,429,85,411,87,384,87,88,85,57,80,36,69,23,51,16,23,13,23,0,220,0,220,13,194,16,176,22,165,33,159,50,158,77,158,207,177,222,246,150,277,117,304,89,324,64,338,45,342,30,341,25,338,21,332,17,324,15,313,14,294,13,294, -0,419,122,401,122,394,108,388,97,382,87,377,78,371,70,355,54,335,42,312,34,284,29,252,27,204,27,178,28,159,31,148,36,142,45,141,59,141,384,142,411,147,429,159,441,178,447,206,450,206,463,9,463,9,450,36,447,54,440,64,428,68,409,70,382,70,80,68,53,63,35,52,23,35,16,9,13,9,0,385,0,605,0,605,13,579,17,561,24,550,35,545,53,543,78,543,385,545,412,550,430,561,442,578,448,604,450,604,463,465,463,310,112,148,463,10,463,10,450,39,447,58,441,70,430,75,411,77,384,77,105,75,66,69,40,57,25,38,17,9,13,9,0,172,0,172,13,144,17,126,25,114,41,109,67,107,105,107,384,284,0,293,0,472,401,472,86,471,57,466,37,455,24,436,17,409,13,409,0,495,463,329,463,329,450,346,448,359,446,369,443,377,439,384,432,390,424,393,413,396,400,397,383,398,363,398,125,127,463,9,463,9,450,27,449,41,445,52,438,64,428,77,413,77,105,75,67,69,42,57,27,38,18,9,13,9,0,172,0,172,13,144,19,126,28,114,44,109,68,107,105,107,377,416,-7,428,-7,428,355,429,383,431,404,436,419,441,430,448,438,454,442,461,445,470,447,480,449,495,450,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481,232,16383,16383,402,236,399,188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,11,463,11,450,37,447,54,441,64,430,69,412,70,386,70,85,69,55,65,35,55,23,38,16,11,13,11,0,207,0,207,13,179,16,160,22,148,33,143,51,141,78,141,204,152,203,161,202,190,202,230,203,263,206,291,214,316,226,340,245,354,259,365,276,373,294,378,315,380,336,378,356,374,375,367,392,357,407,345,420,323,434,298,446,267,456,232,461,192,463,16383,16383,141,413,142,422,144,429,148,434,155,437,166,438,217,434,255, -423,282,403,298,373,303,333,298,298,283,269,259,248,226,234,184,230,168,230,160,231,151,231,141,232,491,-123,491,-110,445,-104,403,-91,365,-71,330,-42,298,-4,325,1,348,8,368,17,387,29,406,45,433,75,454,108,469,145,478,186,481,233,470,314,439,380,391,431,328,462,252,473,178,463,115,431,66,381,35,314,23,232,26,195,33,161,44,128,59,98,77,70,94,51,111,35,132,22,156,10,185,0,214,-36,247,-68,289,-93,338,-110,394,-120,457,-123,16383,16383,402,237,400,195,394,155,385,119,372,89,357,66,340,49,321,35,300,25,277,18,252,16,228,18,204,25,181,37,161,52,145,70,130,95,119,125,111,158,106,195,104,234,106,274,112,311,122,346,134,375,150,398,167,416,186,429,206,439,228,446,251,448,270,446,289,443,306,437,323,428,338,416,360,393,378,362,391,325,399,283,402,237,462,0,462,13,445,15,431,19,419,24,408,33,396,46,256,223,303,235,339,252,363,275,378,304,383,338,381,357,377,375,371,393,361,409,348,422,328,436,303,447,274,456,240,461,202,463,12,463,12,450,39,447,56,441,66,430,70,412,71,386,71,87,70,56,65,35,55,23,38,16,12,13,12,0,205,0,205,13,178,16,160,22,149,33,144,51,143,78,143,214,182,216,348,0,16383,16383,143,408,144,421,149,429,156,434,165,437,178,438,225,434,261,423,286,404,301,378,306,344,305,323,300,305,292,288,280,274,266,264,248,255,228,248,206,244,179,241,143,240,328,324,313,473,298,473,296,465,292,458,288,453,282,450,276,449,266,451,259,452,253,455,245,458,230,464,216,468,202,471,188,473,172,473,132,468,99,452,73,427,56,393,50,351,53,325,62,299,78,275,102,252,135,230,162,215,188,199,213,182,235,165,252,149,260,140,265,130,269,119,272,107,273,94,269,68,258,46,240,30,217,19,190,16,152,20,120,35,91,59,66,94,45,139,30,139,51,-8,66,-8,67,0,70,5,74,10,79,13,85,14,90,14,96,13,110,9,134,0,150,-3,167,-7,184,-9,201,-9,247,-3,286,14,317,41,337,77,344,121,340,152,327,180,305,207,275,233,235,259,194,283,159,305,133,328,116,351,110,378,113,400,123,418,137,432,157,441,180,445,205,442,227,434,248,423,266,408,282,390,289,380,301, -356,306,341,311,324,415,345,410,463,17,463,12,345,29,345,38,383,51,409,70,425,98,432,136,434,178,434,178,86,177,55,172,35,160,23,141,16,112,13,112,0,316,0,316,13,288,16,268,22,256,33,251,51,249,77,249,434,291,434,329,432,356,425,375,409,388,383,398,345,494,463,331,463,331,450,360,446,379,437,390,421,395,396,397,359,397,175,396,144,394,119,390,98,382,80,371,62,371,63,356,48,337,37,315,28,291,23,265,21,242,22,222,26,204,33,188,42,175,52,161,69,152,88,147,110,145,135,145,384,146,411,151,429,161,440,180,446,208,450,208,463,10,463,10,450,38,447,56,441,66,431,71,415,73,391,73,174,75,133,81,97,93,67,109,42,130,23,148,11,169,2,193,-4,219,-8,248,-9,285,-7,318,-1,346,9,370,23,390,41,405,63,416,87,423,114,426,145,427,183,427,361,429,395,434,419,445,435,464,445,494,450,488,463,345,463,345,450,361,449,375,447,386,442,393,434,395,421,395,413,393,405,390,394,386,383,382,371,280,113,173,352,162,377,154,396,149,409,146,420,145,427,146,434,150,440,156,444,165,447,177,448,197,450,197,463,11,463,11,450,29,448,44,442,57,429,71,407,87,373,258,-7,268,-7,423,387,435,413,447,431,459,442,473,448,488,450,652,463,515,463,515,450,533,449,547,445,556,439,562,432,563,421,563,412,559,392,556,380,552,367,463,130,363,385,360,395,356,404,354,413,352,420,352,426,354,434,360,440,371,445,386,449,405,450,405,463,220,463,220,450,240,449,255,444,267,433,279,413,291,383,311,330,238,132,138,395,135,403,132,410,131,417,130,423,130,428,131,436,135,442,143,446,156,449,174,450,174,463,3,463,3,450,22,447,38,439,51,424,63,400,77,366,102,294,129,220,157,144,184,68,211,-7,221,-7,329,288,351,231,374,172,397,112,419,52,441,-7,452,-7,482,85,505,156,528,221,556,297,595,401,602,419,610,432,620,440,634,446,652,450,493,0,493,13,473,16,457,22,443,31,430,45,415,65,280,257,380,380,404,408,424,428,443,440,463,447,488,450,488,463,321,463,321,450,341,449,354,446,363,442,367,436,369,427,368,421,365,414,359,406,351,395,341,380,263,283,232,327,212,357,195,381,183,400,176,416,173, -429,175,437,179,443,186,446,195,448,205,449,226,450,226,463,16,463,16,450,40,446,61,437,83,418,109,387,144,338,218,230,109,93,81,59,60,37,43,23,26,17,7,13,7,0,170,0,170,13,148,16,133,19,123,23,118,29,116,36,118,43,122,53,129,65,139,80,153,98,237,202,303,104,316,84,326,67,333,54,338,43,339,35,338,28,333,23,326,19,316,16,304,15,286,13,286,0,492,463,340,463,340,450,359,449,372,446,381,442,385,436,387,428,386,423,385,417,383,412,381,405,377,399,276,244,173,398,169,405,163,419,161,425,161,431,162,437,166,442,173,446,182,448,194,449,211,450,211,463,16,463,16,450,34,447,51,438,71,419,95,387,129,340,220,205,220,86,219,55,213,34,201,23,181,16,150,13,150,0,364,0,364,13,334,16,313,22,301,32,294,50,292,77,292,212,395,372,416,403,434,424,451,438,470,446,492,450,419,123,402,123,395,101,389,83,382,68,372,56,360,46,349,39,335,34,319,30,301,27,102,27,405,453,405,463,37,463,23,344,41,344,45,364,49,379,54,391,60,402,70,413,81,421,95,428,113,433,136,436,163,437,313,437,7,10,7,0,401,0,209,-108,209,-90,152,-90,139,-89,129,-85,121,-78,116,-68,115,-53,115,413,116,426,121,435,128,441,138,445,152,446,209,446,209,463,62,463,62,-108,201,-9,41,473,-5,473,153,-9,172,-108,172,463,23,463,23,446,83,446,97,445,107,440,113,432,117,421,118,408,118,-58,117,-70,114,-79,108,-85,98,-89,85,-90,23,-90,23,-108,313,208,185,463,144,463,17,208,64,208,165,410,265,208,350,-87,350,-51,0,-51,0,-87,170,355,68,459,61,465,55,469,50,472,44,474,38,474,29,473,22,471,17,466,14,460,13,452,13,445,16,439,20,433,26,427,34,422,141,355,309,46,303,41,297,37,291,35,286,33,280,33,272,35,266,40,262,49,259,62,258,79,258,213,257,235,256,253,252,267,247,279,238,291,227,302,213,310,197,317,177,321,155,322,137,321,119,318,103,314,88,308,75,301,62,291,52,280,45,268,40,257,39,245,41,234,46,225,52,218,61,214,70,213,80,214,89,219,95,225,100,233,102,241,101,249,100,255,98,265,98,271,100,282,107,291,117,299,130,304,146,305,164,303,179, -296,191,283,198,266,201,242,201,205,159,189,128,176,106,165,89,156,75,148,59,136,46,122,35,105,28,87,26,66,29,40,39,20,55,5,75,-3,99,-6,118,-5,138,0,158,8,179,23,201,44,202,44,205,24,212,10,220,0,232,-4,246,-6,260,-5,273,-2,285,3,297,13,309,27,16383,16383,201,89,200,78,198,69,194,60,187,53,177,45,169,40,161,37,153,35,144,34,136,34,120,36,107,42,97,53,90,68,88,88,88,100,91,111,96,122,102,132,111,141,123,151,138,160,156,169,177,178,201,188,107,477,104,478,87,473,72,468,57,464,41,459,23,454,2,448,2,435,4,436,9,436,11,437,14,437,29,436,39,433,45,426,48,414,48,39,55,25,73,13,99,2,130,-3,164,-6,216,1,261,25,296,61,319,110,327,168,321,217,305,260,278,293,243,314,202,322,177,319,154,312,134,299,118,283,107,263,16383,16383,107,223,111,240,121,255,136,267,155,275,177,278,191,277,205,272,218,266,229,257,239,245,248,228,256,208,261,186,264,163,266,138,265,115,261,94,256,75,249,59,240,45,230,35,218,26,205,20,191,17,175,16,154,17,135,22,120,29,111,39,107,52,279,109,260,84,241,65,222,53,202,46,180,44,144,50,114,68,91,97,76,135,71,180,76,220,88,254,109,280,135,296,166,302,180,300,190,297,197,291,203,281,208,268,212,252,216,241,222,232,229,226,237,222,245,220,256,222,265,226,272,232,277,241,279,250,273,272,258,292,234,308,205,318,171,322,151,320,132,316,113,309,94,299,77,286,56,265,39,241,27,213,20,182,17,148,24,97,42,55,70,22,107,0,151,-6,168,-5,185,-1,201,4,216,12,231,23,243,33,254,45,264,61,276,80,288,103,344,30,344,41,338,40,327,40,315,41,306,45,300,52,298,63,297,80,297,477,293,478,236,460,215,454,191,448,191,436,194,436,197,437,205,437,219,436,228,432,234,426,237,416,238,401,238,292,223,304,209,312,195,318,180,321,165,322,119,313,79,288,47,249,26,200,19,144,25,94,42,52,69,20,105,0,148,-6,170,-4,190,0,207,9,223,22,238,40,238,-4,241,-6,16383,16383,238,71,238,68,234,60,231,56,219,44,210,37,200,33,188,31,176,30,143,36,116,55,96,84,83,124,79,172,83, -216,94,252,113,279,137,296,166,302,189,299,208,288,224,273,234,254,238,232,286,115,266,87,247,67,226,52,204,44,178,41,159,43,142,47,126,55,112,66,100,80,87,99,79,119,73,140,70,165,68,194,284,194,281,215,278,232,273,248,267,261,259,273,245,290,228,304,209,314,187,320,162,322,163,322,113,314,73,290,43,254,24,207,17,152,23,98,40,54,68,21,105,0,151,-6,190,-1,224,12,254,36,278,69,297,110,16383,16383,70,216,77,245,88,267,103,284,122,294,144,297,168,294,186,285,198,269,206,246,212,216,15,315,15,293,72,293,72,73,71,47,66,30,56,19,39,13,14,10,14,0,196,0,196,10,167,13,148,18,137,29,132,46,131,73,131,293,216,293,216,315,131,315,131,396,133,418,137,436,145,449,156,456,170,459,179,458,186,455,193,450,200,442,207,431,214,421,220,414,226,410,232,407,239,406,248,408,256,412,263,418,267,425,268,434,264,449,255,461,239,470,219,476,195,478,170,476,147,469,127,459,110,445,97,427,87,409,80,390,76,370,73,345,72,315,329,272,329,299,267,299,259,300,252,301,245,303,221,312,210,315,198,318,187,320,165,322,128,316,96,300,71,276,54,244,48,208,51,184,58,163,70,145,89,129,113,114,107,108,101,103,95,97,89,92,84,86,71,74,62,64,56,55,52,46,51,37,51,38,52,29,55,22,62,16,73,9,88,1,62,-19,42,-37,29,-53,22,-68,20,-83,26,-105,43,-124,69,-138,102,-148,141,-151,171,-149,201,-144,230,-135,257,-122,280,-107,296,-93,308,-79,316,-65,321,-50,323,-33,319,-9,308,10,290,25,267,36,238,41,148,45,128,46,112,49,101,53,95,58,93,64,96,73,102,84,112,94,124,102,135,108,148,106,156,105,175,105,190,106,205,109,220,115,234,122,248,131,261,144,271,158,279,174,283,192,284,213,284,224,282,236,280,247,276,259,271,272,16383,16383,106,237,109,259,115,278,126,291,140,299,158,302,170,301,182,297,192,290,202,281,209,270,216,254,222,237,227,220,229,202,230,185,228,164,221,146,210,133,196,125,178,122,154,127,134,142,119,166,110,197,106,234,16383,16383,303,-44,297,-66,279,-85,251,-99,215,-108,170,-111,170,-112,136,-109,108,-102,87,-92,73,-78,69,-61,70,-51,73,-42,79,-32,89, --18,103,-1,121,-3,143,-6,168,-7,194,-9,216,-9,250,-10,274,-14,291,-20,300,-30,303,-44,341,0,341,10,322,15,310,21,303,31,300,47,299,71,299,211,296,251,285,282,268,304,244,317,212,322,213,322,189,320,168,313,148,302,129,286,110,263,110,476,106,478,92,473,79,469,64,465,47,459,26,453,7,448,7,436,9,436,10,437,16,437,31,436,41,433,47,427,50,416,51,401,51,71,50,47,47,31,39,20,26,14,6,10,6,0,158,0,158,10,137,14,123,20,115,30,111,47,110,71,110,240,127,257,142,270,157,278,172,283,188,284,207,281,221,272,232,258,238,237,240,210,240,71,239,47,235,30,227,20,213,14,192,10,192,0,126,442,124,453,119,463,112,471,102,476,91,478,79,476,69,471,61,463,56,453,55,442,56,431,61,421,69,414,79,409,90,407,102,409,112,414,119,421,124,431,126,442,16383,16383,177,0,177,10,154,13,139,19,130,30,126,47,125,73,125,320,123,322,14,284,14,273,28,275,34,276,44,276,53,274,59,270,63,262,66,249,66,73,65,46,61,29,51,18,35,13,11,10,11,0,136,442,134,453,129,463,121,471,111,476,100,478,89,476,79,471,71,463,66,453,64,442,66,431,71,421,78,414,88,409,99,407,111,409,121,414,129,421,134,431,136,442,16383,16383,135,320,131,322,108,313,87,306,67,298,46,292,23,284,23,273,26,273,32,275,38,275,44,276,54,276,63,274,69,270,73,262,76,250,77,234,77,-30,76,-58,75,-79,73,-95,70,-106,66,-115,63,-119,59,-123,54,-126,49,-127,43,-128,37,-127,31,-125,26,-122,20,-116,6,-100,0,-93,-6,-89,-13,-86,-19,-86,-29,-87,-37,-91,-43,-97,-47,-104,-48,-113,-45,-126,-36,-136,-22,-144,-4,-150,16,-151,58,-145,92,-126,116,-95,130,-53,135,0,353,0,353,10,336,13,319,19,304,28,288,42,272,62,165,198,185,216,230,256,263,282,288,297,311,303,336,305,336,315,193,315,193,305,207,305,217,303,224,301,227,297,228,293,227,289,225,284,222,279,217,273,212,268,116,183,116,477,113,478,98,473,83,469,67,464,48,459,26,453,5,448,5,436,10,436,15,437,23,437,27,438,39,436,48,432,53,424,56,412,57,395,57,57,56,39,53,27,45,20,30,15,5,10,5,0,169,0,169, -10,155,11,140,13,129,17,122,24,118,34,116,47,116,176,221,37,224,33,226,29,228,26,229,23,229,21,228,18,226,15,223,12,219,11,214,10,201,10,201,0,180,0,180,10,157,13,142,18,133,27,129,41,127,61,127,475,124,478,103,472,63,460,40,454,13,448,13,436,20,437,35,437,39,438,51,436,59,431,65,423,68,410,69,393,69,64,67,44,62,30,53,20,37,14,15,10,15,0,542,0,542,10,524,12,513,14,505,18,499,26,496,38,495,54,495,196,491,241,482,276,466,301,443,317,413,322,389,320,366,313,344,301,322,285,299,263,290,285,278,301,263,313,246,320,225,322,206,321,187,317,166,308,144,292,118,268,116,268,116,320,111,322,91,314,72,308,54,302,35,296,13,291,13,279,18,280,23,280,27,281,36,281,45,280,52,275,57,266,59,253,60,235,60,62,59,41,54,26,45,17,31,12,11,10,11,0,166,0,166,10,147,12,134,16,125,23,120,34,119,49,119,245,123,249,125,252,128,255,139,265,153,274,169,280,186,284,202,286,218,282,231,272,240,256,246,235,248,208,248,60,247,39,242,25,234,17,220,12,200,10,200,0,357,0,357,10,336,12,322,17,313,27,308,43,306,66,306,243,319,259,332,271,347,279,363,284,381,286,402,283,417,274,428,259,433,237,435,207,435,63,434,43,430,28,423,19,410,14,390,10,390,0,340,0,340,10,322,13,310,18,302,27,298,40,297,59,297,214,293,252,283,282,266,304,243,317,214,322,195,320,175,314,155,303,135,287,113,266,113,320,107,322,88,315,52,303,33,297,11,291,11,279,14,280,18,280,22,281,31,281,41,280,48,275,53,267,56,254,56,66,55,44,51,29,43,19,31,13,12,10,13,10,13,0,160,0,160,10,142,13,129,18,120,26,116,36,115,51,115,244,132,260,147,271,161,279,174,282,187,284,205,281,220,273,230,259,236,239,238,212,238,73,237,49,233,32,225,21,213,14,195,10,194,0,329,162,321,216,300,260,268,293,227,315,178,322,125,314,82,293,49,259,28,214,20,159,28,105,49,59,82,24,123,1,172,-6,224,1,268,24,301,60,322,107,329,162,16383,16383,266,143,262,98,252,62,235,35,212,18,184,13,169,14,155,18,142,25,130,35,120,48,107, -72,96,98,89,128,85,159,84,191,87,230,98,260,115,283,138,297,165,302,182,301,196,296,209,289,221,279,231,267,243,248,253,225,260,199,264,171,266,143,111,320,107,322,86,314,67,306,48,300,28,293,6,286,6,275,10,275,13,276,23,276,36,275,44,271,49,264,52,253,52,-90,51,-109,47,-122,38,-131,24,-136,3,-139,3,-151,173,-151,173,-138,146,-137,128,-132,118,-123,112,-108,111,-86,111,23,125,11,139,3,152,-2,166,-5,182,-6,229,2,270,27,301,66,322,115,329,173,323,221,307,263,282,294,250,315,212,322,189,320,168,314,149,303,130,287,111,266,16383,16383,111,234,115,246,127,259,144,270,163,277,183,280,212,274,235,256,253,228,265,190,269,145,265,102,253,66,236,39,212,22,184,16,164,18,144,26,127,36,115,49,111,62,341,-151,341,-139,323,-136,310,-131,302,-124,299,-113,298,-97,298,320,290,320,252,298,234,307,217,314,202,319,187,321,171,322,122,313,79,288,46,250,25,201,17,144,23,94,38,53,61,21,92,0,129,-6,153,-4,176,1,198,12,220,26,239,45,239,-86,237,-106,231,-120,220,-130,202,-136,177,-139,177,-151,16383,16383,239,89,239,80,238,73,236,66,230,58,220,50,209,44,196,40,182,37,169,36,157,37,146,39,135,43,125,48,116,55,103,70,92,90,84,114,79,140,77,169,82,214,94,251,114,279,141,296,173,302,197,299,215,291,229,277,236,258,239,233,112,320,109,322,87,314,68,306,28,292,5,284,5,273,15,275,20,275,25,276,30,276,39,274,45,270,50,262,52,250,53,234,53,59,52,41,49,29,40,21,26,15,3,10,3,0,172,0,172,10,147,13,130,18,119,28,113,43,112,63,112,220,115,235,123,250,135,264,148,274,161,278,164,278,167,276,171,274,175,271,179,267,186,262,191,258,197,255,207,253,216,255,224,259,230,265,233,274,234,285,233,298,228,308,220,315,209,320,196,322,179,320,164,313,148,301,131,282,112,256,109,211,99,219,90,228,84,238,80,249,79,259,82,276,89,290,100,299,114,304,131,306,154,303,173,294,188,277,200,253,211,220,221,220,218,315,210,315,205,310,202,308,195,308,192,309,188,310,183,312,179,313,170,317,161,319,152,320,142,321,132,321,100,317,74,307,53,289,40,265,36,235,39, -214,49,193,65,173,89,153,120,134,158,113,170,104,180,95,188,84,193,73,195,60,192,44,184,30,172,18,156,11,137,9,110,12,89,24,71,43,58,71,48,107,37,107,37,-2,45,-2,48,0,51,3,54,4,58,5,72,5,78,4,85,2,95,0,105,-3,115,-4,126,-5,136,-6,145,-6,176,-1,203,10,224,29,239,53,244,80,242,102,235,120,223,136,206,151,182,166,186,54,177,44,169,38,161,33,153,30,145,30,131,32,120,39,113,51,109,69,108,92,108,293,178,293,178,315,108,315,108,400,106,404,105,405,103,405,94,393,92,390,89,386,74,364,59,346,45,330,33,319,21,311,17,308,14,305,11,303,10,300,9,298,9,296,10,295,10,294,11,294,12,293,49,293,49,82,52,50,59,25,72,7,89,-2,111,-6,131,-4,149,1,165,12,181,27,195,46,336,35,332,35,315,36,304,40,297,47,293,59,292,75,292,315,181,315,181,303,203,301,218,296,227,289,232,276,233,258,233,96,232,83,230,74,227,67,223,61,217,55,206,47,194,41,182,37,170,34,158,34,142,36,129,44,118,56,111,71,109,89,109,315,6,315,6,305,24,303,36,298,44,289,49,276,50,259,50,83,54,53,64,28,82,9,106,-2,135,-6,152,-4,172,1,193,12,214,29,235,53,237,53,237,-3,240,-5,260,2,279,8,297,14,316,20,336,25,334,315,237,315,237,305,249,303,258,300,265,295,268,289,270,282,269,278,269,274,268,269,266,261,196,80,124,259,120,271,118,281,118,286,119,292,123,297,129,300,138,303,151,305,151,315,13,315,13,305,27,303,38,296,49,283,61,260,77,224,161,23,163,20,164,16,165,13,166,11,166,9,169,2,172,-2,174,-6,177,-8,179,-9,182,-8,185,-4,189,1,193,11,198,25,288,250,298,273,306,289,314,298,323,303,334,305,486,315,400,315,400,305,421,298,426,294,430,289,430,276,428,268,426,258,423,248,419,237,355,81,297,238,292,250,289,259,287,266,285,280,286,287,290,293,297,298,309,301,326,305,326,315,184,315,184,305,197,302,208,297,216,288,224,275,232,256,245,217,182,77,113,260,111,264,110,269,109,273,109,281,110,289,113,295,119,299,128,302,141,305,141,315,15,315,15,305,23,303,30,299,37,292,44,279,52,260,146, -21,151,9,155,1,159,-4,162,-8,165,-9,167,-8,170,-5,173,0,177,7,182,17,260,185,324,20,329,7,333,-1,336,-6,338,-9,341,-9,344,-8,347,-5,350,0,354,10,360,24,457,266,463,281,468,290,473,297,479,301,486,305,335,0,335,10,323,12,311,16,300,25,289,37,278,52,188,190,246,273,255,284,265,293,277,299,290,303,303,305,303,315,192,315,192,305,203,303,211,301,216,298,219,294,220,289,219,283,216,276,210,268,203,257,195,244,190,237,186,231,182,224,178,218,173,212,173,213,172,216,170,218,164,227,153,244,144,259,137,272,133,282,131,289,132,295,136,299,142,302,150,304,162,305,162,315,17,315,17,305,23,305,35,303,45,299,55,292,65,279,77,262,77,263,143,162,63,46,52,31,43,22,34,15,24,12,12,10,12,0,113,0,113,10,103,11,95,12,89,15,86,18,85,23,87,31,90,37,94,43,99,52,155,138,219,40,220,37,222,33,222,30,223,27,222,21,220,16,215,13,206,11,195,10,195,0,333,315,239,315,239,305,251,304,260,302,267,299,271,294,272,287,272,286,271,283,271,281,269,275,201,82,123,257,117,269,115,275,114,281,113,286,115,293,119,297,126,301,138,303,153,305,153,315,10,315,10,305,20,303,29,300,36,295,42,289,47,280,139,84,147,66,155,49,162,34,167,21,169,12,169,13,167,2,163,-12,157,-30,149,-48,141,-62,134,-72,119,-87,112,-91,105,-93,103,-93,100,-92,92,-90,87,-88,88,-88,80,-85,73,-82,66,-80,58,-79,51,-79,41,-80,33,-85,27,-92,23,-101,21,-111,23,-124,30,-135,40,-144,53,-149,70,-151,100,-147,126,-133,149,-107,171,-69,192,-16,298,269,303,282,309,292,316,298,323,303,333,305,293,95,280,98,276,80,273,66,270,55,266,47,261,40,254,33,242,28,228,24,209,22,187,21,94,21,282,305,282,315,40,315,37,232,50,232,54,258,61,276,72,287,88,292,111,294,205,294,19,10,19,0,282,0,245,-118,220,-109,202,-97,190,-81,183,-60,181,-32,181,84,179,115,173,137,161,154,143,165,116,174,143,183,161,195,173,212,179,234,181,265,181,382,183,410,190,431,202,447,220,459,245,468,245,476,220,475,201,473,185,470,172,465,160,459,149,449,141,437,135,421,131,401,130,379,130,254,128, -228,122,209,111,195,94,184,70,175,94,166,111,154,122,140,128,121,130,95,130,-28,131,-50,135,-70,141,-86,149,-99,160,-108,172,-115,185,-120,201,-123,220,-125,245,-126,93,-9,93,473,47,473,47,-9,206,378,205,400,201,420,195,436,186,449,176,459,164,465,151,470,136,473,116,475,91,476,91,468,116,459,134,447,146,431,153,410,155,382,155,265,156,234,163,211,175,195,193,184,220,175,193,166,175,154,163,138,156,115,155,84,155,-32,153,-60,146,-81,134,-97,116,-109,91,-118,91,-126,116,-125,135,-123,151,-120,164,-115,176,-108,187,-99,195,-86,201,-70,205,-51,206,-29,206,95,208,121,214,140,224,155,241,166,266,175,241,184,224,195,214,209,208,228,206,254,327,227,317,211,307,197,296,186,282,179,265,177,250,178,235,183,220,189,207,195,198,200,173,210,155,217,141,221,128,224,116,224,96,222,78,216,60,205,43,188,28,163,53,128,61,146,72,160,84,170,97,177,112,179,129,178,145,175,159,170,171,166,180,162,201,150,217,142,232,136,247,132,264,131,283,133,300,140,317,151,334,168,352,192,141,292,140,304,134,313,126,321,116,326,105,327,92,326,82,321,74,314,69,304,67,292,69,280,74,269,82,261,92,255,104,253,116,255,126,261,134,269,139,280,141,292,16383,16383,109,198,100,198,69,-69,68,-75,68,-85,67,-91,67,-97,69,-116,73,-131,81,-142,91,-149,105,-151,117,-149,127,-141,135,-129,140,-114,141,-96,141,-75,140,-69,305,115,284,87,264,67,245,54,225,47,202,45,193,45,186,46,178,47,160,53,231,257,239,243,246,232,253,225,262,222,272,220,282,222,290,226,296,233,300,242,302,252,299,266,293,280,282,292,268,302,249,311,282,405,258,405,227,319,218,320,210,321,203,321,197,322,191,322,142,313,99,290,66,253,44,207,37,153,38,132,42,110,48,90,56,71,66,53,74,42,82,33,92,25,103,17,118,9,83,-96,106,-96,141,0,150,-1,158,-3,166,-4,173,-5,180,-5,196,-4,211,-1,226,4,240,11,252,20,266,33,278,47,289,63,300,83,313,109,16383,16383,138,69,120,88,107,108,98,129,92,154,91,182,95,222,108,255,128,279,154,295,186,301,193,301,205,299,219,295,241,230,241,261,153,261,150,287,148,308,146,326,146,343,145,359,148,392,157,418,170, -438,189,450,212,455,226,453,237,449,245,441,250,431,252,418,253,399,255,385,260,377,268,372,279,371,290,373,300,378,307,386,312,396,313,408,309,429,296,447,277,461,252,470,223,473,176,466,138,444,110,410,92,365,86,309,86,300,87,291,88,281,89,272,91,261,16,261,16,230,91,230,95,206,99,178,102,152,104,130,106,114,106,94,105,91,105,88,97,89,90,90,84,90,78,91,72,91,51,88,33,81,20,70,11,56,9,37,9,38,11,23,17,11,27,2,40,-3,56,-4,70,-3,83,0,95,8,109,20,124,38,150,21,172,8,191,1,208,-2,226,-4,245,-2,263,2,281,10,297,20,312,34,321,45,329,59,336,73,341,86,343,95,343,97,342,97,341,98,336,98,333,97,323,87,323,88,309,75,294,65,279,58,262,54,244,53,224,54,205,56,186,61,164,68,139,77,148,119,153,146,156,164,157,176,157,221,156,230,16383,16383,99,53,99,50,98,46,96,41,93,36,89,31,83,25,77,20,71,17,64,15,56,14,46,15,38,19,32,24,28,31,27,40,28,49,32,56,40,62,49,65,62,66,72,65,82,63,91,60,97,57,99,53,366,28,298,95,309,113,317,130,322,148,325,165,326,184,325,204,322,221,317,238,309,254,298,272,366,340,332,373,263,306,247,317,231,324,214,330,195,333,176,334,157,333,139,330,122,325,105,317,87,306,20,373,-15,340,53,272,42,255,34,238,29,221,25,203,24,184,25,164,29,146,34,129,42,112,53,95,-15,28,20,-6,87,62,104,51,121,43,139,37,157,34,176,33,195,34,213,37,230,43,247,51,263,62,332,-6,16383,16383,278,185,273,151,259,121,236,98,208,83,176,77,143,83,114,98,92,121,77,150,72,184,77,217,92,246,114,269,142,284,174,289,207,284,236,269,258,247,273,218,278,185,359,463,222,463,222,450,232,450,243,449,253,446,261,441,265,436,267,429,267,424,266,418,264,411,261,405,258,398,179,244,97,398,93,405,91,412,89,418,88,424,88,430,89,438,94,443,103,447,116,449,133,450,133,463,-36,463,-36,450,-19,447,-4,440,9,426,25,402,45,367,112,246,11,246,11,219,128,219,133,209,133,155,11,155,11,127,133,127,133,84,132,55,127,35,117,22,101,16,77,13,77,0,248,0,248,13,225, -16,209,22,199,33,194,51,192,77,192,127,313,127,313,155,192,155,192,209,198,219,313,219,313,246,212,246,276,375,290,401,305,420,321,434,339,444,359,450,93,280,93,473,47,473,47,280,16383,16383,93,-9,93,184,47,184,47,-9,140,359,132,367,126,377,121,387,117,398,116,409,119,425,127,439,139,450,156,456,176,459,190,457,201,454,211,449,217,443,219,436,219,435,218,434,216,430,213,428,207,423,202,417,198,411,196,404,195,398,197,388,201,380,208,373,217,369,228,367,241,369,251,374,258,381,263,392,264,405,260,427,247,446,228,460,203,470,174,473,142,469,115,458,95,440,82,416,77,387,77,388,79,367,86,348,98,329,118,308,147,283,139,283,135,284,129,284,103,279,81,268,64,250,53,227,49,200,53,170,67,140,90,111,124,79,169,45,192,28,210,11,222,-3,229,-18,231,-34,228,-52,220,-67,208,-79,191,-86,170,-88,155,-87,142,-83,130,-78,123,-71,120,-63,121,-61,122,-60,123,-57,126,-55,139,-42,142,-36,144,-30,145,-24,143,-15,138,-7,131,-1,122,2,111,4,99,2,88,-2,80,-10,75,-20,73,-33,77,-55,91,-74,112,-89,138,-99,170,-103,203,-99,231,-87,252,-68,266,-44,270,-14,269,6,262,24,250,42,232,63,205,88,213,88,242,91,265,102,283,120,295,143,298,172,296,194,288,216,275,238,258,259,236,280,16383,16383,262,148,259,134,252,122,241,112,228,105,213,102,197,104,181,111,162,122,142,138,118,160,106,174,97,186,90,197,87,209,86,222,88,237,95,250,105,259,118,266,133,268,148,265,165,258,185,247,205,232,225,213,238,199,248,185,256,172,260,159,262,148,221,401,219,412,214,421,207,428,197,433,186,435,175,433,166,429,158,421,153,412,152,401,153,390,158,380,165,373,174,368,185,366,197,368,207,373,214,380,219,390,221,401,16383,16383,82,401,80,412,75,421,67,428,58,433,47,435,36,433,27,429,19,421,14,412,13,401,14,390,19,380,26,373,35,368,46,366,57,368,67,373,75,380,80,390,82,401,383,173,372,173,360,151,346,133,330,122,312,115,291,113,256,118,227,133,206,159,192,193,187,236,191,276,204,310,225,336,253,353,287,359,309,356,328,348,343,336,354,318,360,295,372,295,372,345,370,351,366,355,362,357,363,357,349,362,333, -367,318,370,302,372,287,373,288,373,236,366,193,347,161,318,140,278,133,230,139,186,156,150,184,122,222,105,267,98,294,100,321,103,346,109,363,114,371,120,16383,16383,505,231,493,308,460,374,409,427,345,461,270,473,192,461,125,427,73,375,39,309,27,231,39,155,72,88,124,36,190,2,266,-9,343,2,409,36,460,88,494,154,505,231,16383,16383,467,234,457,166,428,108,385,61,330,31,266,20,203,30,148,61,104,107,75,165,65,232,75,298,104,356,148,402,202,433,264,444,328,433,383,403,428,358,457,300,467,234,189,309,185,306,177,302,174,301,170,301,166,302,163,304,161,309,160,316,160,406,157,430,148,449,134,463,113,471,87,473,62,471,41,465,25,455,15,442,11,427,12,419,15,413,20,409,26,406,34,405,40,406,46,408,51,412,54,417,55,422,55,427,54,430,54,432,53,434,53,438,55,443,60,447,67,451,75,453,84,454,93,453,101,449,106,443,109,435,110,424,110,403,78,391,55,382,40,375,29,368,18,359,13,354,9,347,6,340,4,332,3,323,5,308,12,295,23,284,36,278,52,276,65,277,77,280,90,286,103,295,116,306,119,295,124,286,130,280,138,277,148,276,157,276,164,278,172,282,180,288,189,297,16383,16383,111,332,111,329,110,326,108,322,106,319,103,316,96,313,90,311,84,310,79,309,73,309,65,310,58,315,52,321,48,330,47,340,49,350,55,359,67,367,85,376,111,386,164,159,220,108,240,89,263,67,285,46,302,30,311,23,313,24,316,25,318,26,320,30,318,36,313,44,306,55,296,69,284,84,274,97,263,112,251,127,239,143,226,159,284,233,296,249,306,261,313,271,318,279,320,284,319,286,319,288,317,290,315,291,312,291,303,285,285,270,264,250,241,229,220,210,16383,16383,30,159,86,108,106,89,129,67,150,46,168,30,177,23,183,26,185,28,185,30,184,36,179,44,172,55,162,69,150,84,140,97,129,112,117,127,91,159,150,233,162,249,172,261,179,271,184,279,185,284,185,286,183,290,181,291,177,291,168,285,151,270,129,250,106,229,86,210,387,80,387,275,34,275,34,229,340,229,340,80,199,136,199,180,27,180,27,136,397,106,397,112,387,121,364,144,353,157,342,172,302,227,323,236,338,248,349,263,356,279,358,295,354, -319,344,338,327,352,304,361,275,364,155,364,155,353,170,351,180,348,185,341,187,331,188,316,188,152,187,137,185,127,180,122,170,119,154,117,153,106,266,106,266,117,250,119,240,122,235,129,232,140,232,220,266,220,279,200,288,186,294,177,298,170,302,162,314,142,325,126,335,115,344,108,352,106,16383,16383,232,233,232,351,259,351,279,348,294,340,304,327,309,311,311,293,309,274,303,257,293,244,279,236,262,233,263,233,16383,16383,505,230,493,307,460,374,409,427,344,461,270,473,192,461,125,427,73,375,39,309,27,232,39,155,72,88,124,36,190,2,266,-9,343,2,409,36,460,88,494,154,505,230,16383,16383,467,231,457,165,428,107,384,61,329,31,266,20,203,30,148,61,104,107,75,165,65,232,75,298,104,356,148,402,203,433,265,444,329,433,384,403,428,357,457,299,467,231,226,383,226,420,8,420,8,383,240,373,235,405,221,432,200,454,173,468,141,473,109,468,81,454,59,433,45,405,40,373,45,341,59,314,80,292,108,278,140,273,172,278,199,292,221,314,235,341,240,373,16383,16383,213,373,209,350,198,329,183,312,163,301,140,297,117,301,97,312,81,328,71,349,67,373,71,397,81,418,97,434,116,445,138,449,162,445,182,434,198,418,209,397,212,373,446,170,446,216,263,216,263,352,216,352,216,216,34,216,34,170,216,170,216,23,263,23,263,170,16383,16383,446,-60,446,-14,34,-14,34,-60,207,248,195,253,188,245,181,240,173,237,164,235,154,234,75,234,134,291,157,316,174,338,186,358,192,377,194,397,190,422,178,443,160,459,136,470,105,473,74,470,49,461,29,444,13,421,1,390,18,380,28,398,39,412,51,423,65,429,80,431,96,428,109,421,120,409,127,395,130,378,127,364,121,346,110,326,94,304,75,281,4,205,4,189,180,189,143,358,160,368,172,379,180,391,184,403,185,415,181,434,171,450,154,462,133,470,109,473,85,471,65,464,47,451,30,432,15,407,32,394,43,410,54,421,66,429,78,433,92,434,106,433,117,429,125,422,130,412,131,401,129,387,122,374,109,363,91,352,65,342,65,322,73,323,79,324,84,324,106,322,123,314,136,303,144,287,147,266,145,250,138,237,128,226,115,220,99,217,92,218,86,219,79,221,72,225,64,231,56,236,50,240,40, -244,35,245,27,244,20,241,14,237,11,231,9,223,12,210,21,199,35,191,52,185,73,184,116,188,153,201,180,222,198,248,204,280,202,300,195,318,183,335,166,348,143,356,65,355,93,355,201,423,208,428,214,434,219,440,221,446,222,452,221,460,218,466,213,471,206,473,198,474,192,474,186,472,181,469,175,465,168,459,301,315,239,315,239,80,229,65,217,53,201,44,183,38,162,37,163,37,142,40,126,48,114,62,106,83,104,109,104,315,42,315,42,38,40,20,36,-7,31,-40,27,-72,25,-97,26,-115,30,-130,36,-141,45,-149,56,-151,68,-149,77,-143,84,-132,88,-117,90,-97,87,-72,81,-41,73,-9,67,20,64,45,77,26,92,11,108,1,127,-4,150,-6,172,-4,192,3,210,15,227,33,241,56,243,56,247,34,255,16,267,3,281,-3,296,-6,311,-5,323,-1,334,6,346,17,359,33,359,39,349,31,341,25,335,21,329,19,323,19,314,21,308,27,304,36,301,50,301,67,373,-107,373,-91,346,-88,328,-81,317,-70,312,-53,311,-28,311,380,312,406,317,425,328,438,346,446,373,450,373,463,188,463,133,458,92,442,64,416,47,378,42,330,48,278,65,241,92,215,130,199,178,191,178,-19,177,-49,172,-69,161,-81,143,-88,116,-91,116,-107,224,-107,224,448,265,448,265,-107,16383,16383,178,206,146,214,123,230,107,254,98,288,95,331,97,373,105,404,120,426,144,441,178,448,127,177,125,190,119,200,111,209,100,215,88,217,76,215,65,210,57,201,51,190,49,178,51,166,56,155,65,147,75,141,88,139,100,141,110,147,119,155,125,166,127,177,122,0,98,0,69,-69,73,-72,77,-71,80,-70,84,-69,93,-69,107,-70,118,-73,125,-78,129,-85,130,-94,129,-105,124,-113,116,-119,105,-123,91,-125,83,-125,75,-124,57,-120,46,-117,37,-138,49,-143,60,-146,71,-148,95,-150,125,-147,149,-139,168,-127,179,-111,183,-90,180,-74,172,-60,160,-51,143,-45,123,-43,112,-43,108,-44,105,-44,173,189,173,205,158,207,147,210,139,215,135,223,134,233,134,470,124,473,41,434,41,418,51,422,58,425,63,427,73,427,75,425,76,421,77,415,77,229,76,220,73,214,66,210,55,207,40,205,40,189,213,380,208,410,194,436,173,456,145,469,111,473,75,469,46,456,23,435,9,407,4,373,9,341,23,314,44, -294,72,280,105,276,140,281,170,295,193,317,207,346,212,380,16383,16383,162,361,160,339,154,322,143,309,130,302,112,299,102,300,93,303,85,308,78,314,73,323,67,336,62,350,58,366,56,382,55,398,58,416,64,430,74,441,88,448,104,450,123,446,139,434,151,415,159,391,162,361,320,155,264,206,244,225,221,247,200,269,182,285,173,291,171,291,169,290,165,286,165,284,166,278,171,270,178,260,188,246,200,230,210,217,221,203,233,187,259,155,200,81,188,65,178,53,171,43,166,35,165,30,165,29,167,25,169,24,173,23,182,29,199,44,221,64,243,86,264,105,16383,16383,185,155,129,206,109,225,86,247,65,269,47,285,38,291,36,291,34,290,32,288,30,284,32,278,36,270,44,260,53,246,65,230,75,217,86,203,98,187,124,155,65,81,44,53,36,43,32,35,30,30,31,29,31,27,32,25,34,24,38,23,46,29,64,44,85,64,108,86,129,105,499,63,499,103,461,103,461,284,427,284,286,98,286,63,412,63,412,0,461,0,461,63,16383,16383,412,103,317,103,412,228,16383,16383,442,473,410,473,93,-9,127,-9,16383,16383,156,189,156,205,140,207,129,210,122,215,118,223,116,233,116,470,106,473,30,434,30,418,40,422,48,425,53,427,62,427,64,425,65,421,66,415,66,229,65,220,62,214,55,210,45,207,30,205,30,189,519,59,506,64,500,56,493,51,485,48,476,46,466,45,387,45,445,102,469,127,486,148,497,168,504,188,505,208,502,233,490,254,472,270,447,281,417,284,385,281,360,272,341,255,325,232,312,201,313,201,330,191,340,209,351,223,363,234,377,240,391,242,407,240,421,232,431,221,438,206,441,189,438,175,432,157,421,137,406,115,387,92,316,17,316,0,491,0,16383,16383,416,473,384,473,67,-9,102,-9,16383,16383,152,189,152,205,136,207,125,210,117,215,113,223,112,233,112,470,102,473,27,434,27,418,36,422,43,425,49,427,58,427,60,425,61,421,62,415,63,407,63,229,62,220,58,214,51,210,41,207,25,205,25,189,502,63,502,103,464,103,464,284,431,284,289,98,289,63,415,63,415,0,464,0,464,63,16383,16383,415,103,320,103,415,228,16383,16383,446,473,414,473,97,-9,131,-9,16383,16383,143,358,160,368,172,379,180,391,184,403,185,415,181,434,171, -450,154,462,133,470,109,473,85,471,65,464,47,451,30,432,15,407,32,394,43,410,54,421,66,429,78,433,92,434,106,433,117,429,125,422,130,412,131,401,129,387,122,374,109,363,91,352,65,342,65,322,73,323,79,324,84,324,106,322,123,314,136,303,144,287,147,266,145,250,138,237,128,226,115,220,99,217,92,218,86,219,79,221,72,225,64,231,56,236,50,240,40,244,35,245,27,244,20,241,14,237,11,231,9,223,12,210,21,199,35,191,52,185,73,184,116,188,153,201,180,222,198,248,204,280,202,300,195,318,183,335,166,348,143,356,182,291,180,303,175,313,167,320,157,325,145,327,133,325,122,320,115,313,110,303,108,291,110,279,115,268,122,260,133,254,145,252,156,254,167,260,175,268,180,279,182,291,16383,16383,140,205,134,179,128,157,119,136,108,117,95,98,65,59,44,28,30,3,23,-19,21,-43,22,-59,25,-74,31,-88,37,-100,46,-111,62,-125,82,-136,104,-144,127,-150,150,-151,186,-146,218,-132,242,-111,258,-83,263,-50,262,-35,258,-23,251,-14,242,-9,230,-7,220,-8,212,-12,206,-18,202,-26,201,-36,201,-42,203,-47,206,-53,210,-59,216,-65,220,-71,223,-76,226,-80,227,-84,227,-87,224,-100,214,-112,199,-122,181,-128,162,-130,137,-126,116,-114,100,-96,89,-74,85,-47,86,-27,89,-6,94,15,101,38,111,62,130,105,141,138,148,165,151,187,152,205,316,530,214,634,207,640,201,644,196,647,190,649,184,649,176,648,169,646,163,641,160,635,159,627,160,620,162,614,172,602,180,597,288,530,16383,16383,495,0,495,13,476,17,462,24,450,36,440,54,429,77,257,472,243,472,98,130,77,81,61,48,47,28,31,18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364,44,365,37,363,29,361,25,358,22,355,20,350,17,345,15,338,14,329,13,316,13,316,0,16383,16383,313,180,152,180,232,373,193,530,221,530,329,598,337,603,347,615,349,621,350,627,349,635,346,641,341,646,334,648,326,649,320,649,314,647,309,644,303,640,296,634,16383,16383,495,0,495,13,476,17,462,24,450,36,440,54,429,77,257,472,243,472,98,130,77,81,61,48,47,28,31,18,10,13,10,0,150, -0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364,44,365,37,363,29,361,25,358,22,355,20,350,17,345,15,338,14,329,13,316,13,316,0,16383,16383,313,180,152,180,232,373,359,530,272,647,228,647,141,530,165,530,250,602,335,530,16383,16383,495,0,495,13,476,17,462,24,450,36,440,54,429,77,257,472,243,472,98,130,77,81,61,48,47,28,31,18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364,44,365,37,363,29,361,25,358,22,355,20,350,17,345,15,338,14,329,13,316,13,316,0,16383,16383,313,180,152,180,232,373,347,622,340,608,333,598,326,591,318,588,309,587,303,587,296,588,288,590,281,593,273,597,255,605,246,610,236,614,226,616,206,618,187,615,170,606,155,592,144,572,136,548,156,548,161,559,168,568,175,574,183,578,192,580,197,579,203,578,208,577,214,574,220,572,237,564,252,557,264,552,274,549,283,548,293,548,314,550,332,558,346,573,358,594,367,622,16383,16383,495,0,495,13,476,17,462,24,450,36,440,54,429,77,257,472,243,472,98,130,77,81,61,48,47,28,31,18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364,44,365,37,363,29,361,25,358,22,355,20,350,17,345,15,338,14,329,13,316,13,316,0,16383,16383,313,180,152,180,232,373,355,576,354,587,349,596,341,603,331,608,320,610,310,608,300,604,293,596,288,587,286,576,288,565,292,555,300,548,309,543,320,541,331,543,341,548,349,555,354,565,355,576,16383,16383,216,576,215,587,209,596,202,603,192,608,181,610,170,608,161,604,154,596,149,587,147,576,149,565,153,555,161,548,170,543,180,541,192,543,202,548,209,555,215,565,216,576,16383,16383,495,0,495,13,476,17,462,24,450,36,440,54,429,77,257,472,243,472,98,130,77,81,61,48,47,28,31,18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364, -44,365,37,363,29,361,25,358,22,355,20,350,17,345,15,338,14,329,13,316,13,316,0,16383,16383,313,180,152,180,232,373,321,602,318,624,308,644,293,659,274,669,252,673,230,669,211,659,196,644,186,625,182,603,185,581,195,562,210,547,229,537,251,534,273,537,292,547,308,562,318,580,321,602,16383,16383,298,603,295,588,289,576,279,566,266,559,251,557,236,559,224,566,214,576,208,588,205,603,208,618,214,630,224,640,237,647,251,649,266,647,278,640,289,630,295,618,298,603,16383,16383,495,0,495,13,476,17,462,24,450,36,440,54,429,77,257,472,243,472,98,130,77,81,61,48,47,28,31,18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364,44,365,37,363,29,361,25,358,22,355,20,350,17,345,15,338,14,329,13,316,13,316,0,16383,16383,313,180,152,180,232,373,604,118,588,118,566,79,545,52,520,36,489,29,448,27,375,27,360,30,352,37,348,48,348,230,447,230,472,228,491,222,504,209,513,189,518,160,533,160,533,325,518,325,514,296,503,276,484,264,457,258,420,256,348,256,348,421,351,428,355,433,360,437,367,438,427,438,478,437,513,431,535,418,548,397,555,365,571,365,571,463,177,463,177,449,200,448,217,446,229,441,237,435,239,427,239,423,238,420,237,416,235,411,233,407,62,68,50,47,40,32,29,22,16,16,0,13,0,0,138,0,138,13,122,16,108,19,99,23,93,28,91,34,93,47,100,67,112,95,130,133,155,182,279,182,279,78,278,54,274,37,265,26,251,19,229,15,217,13,217,0,573,0,16383,16383,279,209,168,209,279,433,430,91,399,65,370,45,339,32,308,24,274,21,245,23,217,30,191,41,168,56,148,76,131,101,118,131,108,166,103,203,101,242,108,310,130,366,165,409,211,436,267,445,310,439,349,421,381,392,405,357,418,315,434,315,427,473,413,473,410,465,405,459,399,454,392,451,384,450,380,450,375,451,369,453,363,454,356,456,336,463,294,471,274,473,253,473,225,472,196,467,169,458,142,446,117,431,83,402,55,367,36,326,24,281,20,230,22,188,30,150,43,115,60,84,81,57,102,38,126,22,152,9,181,0,212,-6,185, --69,191,-72,197,-70,201,-69,210,-69,224,-70,235,-73,242,-78,246,-85,247,-94,245,-105,240,-113,232,-119,222,-123,209,-125,200,-125,192,-124,174,-120,163,-117,153,-138,165,-143,176,-146,188,-148,199,-149,212,-150,242,-147,266,-139,284,-127,295,-111,299,-90,297,-74,289,-60,277,-51,260,-45,239,-43,228,-43,225,-44,221,-44,235,-8,239,-9,252,-9,299,-5,342,5,381,23,415,47,443,79,281,530,180,634,173,640,167,644,161,647,156,649,150,649,141,648,134,646,129,641,125,635,124,627,125,620,128,614,132,608,138,602,145,597,253,530,16383,16383,418,118,398,118,379,80,357,53,328,37,289,28,237,26,184,26,164,29,151,35,143,44,141,59,141,229,246,229,277,227,298,222,311,210,320,191,326,161,341,161,341,325,326,325,320,297,311,277,298,265,277,259,246,258,141,258,141,423,144,430,148,434,155,436,165,437,257,437,298,435,327,429,346,416,357,395,365,363,382,363,380,463,9,463,9,450,35,447,53,441,63,430,68,411,70,385,70,80,68,52,64,34,53,23,36,17,9,13,9,0,386,0,172,530,199,530,307,598,315,603,321,609,325,615,327,621,328,627,327,635,324,641,319,646,312,648,304,649,298,649,292,647,287,644,281,640,274,634,16383,16383,418,118,398,118,379,80,357,53,328,37,289,28,237,26,184,26,164,29,151,35,143,44,141,59,141,229,246,229,277,227,298,222,311,210,320,191,326,161,341,161,341,325,326,325,320,297,311,277,298,265,277,259,246,258,141,258,141,423,144,430,148,434,155,436,165,437,257,437,298,435,327,429,346,416,357,395,365,363,382,363,380,463,9,463,9,450,35,447,53,441,63,430,68,411,70,385,70,80,68,52,64,34,53,23,36,17,9,13,9,0,386,0,338,530,251,647,207,647,120,530,145,530,229,602,314,530,16383,16383,418,118,398,118,379,80,357,53,328,37,289,28,237,26,184,26,164,29,151,35,143,44,141,59,141,229,246,229,277,227,298,222,311,210,320,191,326,161,341,161,341,325,326,325,320,297,311,277,298,265,277,259,246,258,141,258,141,423,144,430,148,434,155,436,165,437,257,437,298,435,327,429,346,416,357,395,365,363,382,363,380,463,9,463,9,450,35,447,53,441,63,430,68,411,70,385,70,80,68,52,64,34,53,23,36, -17,9,13,9,0,386,0,333,576,331,587,326,596,318,603,309,608,298,610,287,608,277,604,270,596,265,587,263,576,265,565,270,555,277,548,286,543,297,541,308,543,318,548,326,555,331,565,333,576,16383,16383,193,576,191,587,186,596,179,603,169,608,158,610,147,608,138,604,131,596,126,587,124,576,126,565,130,555,138,548,147,543,158,541,169,543,179,548,186,555,191,565,193,576,16383,16383,418,118,398,118,379,80,357,53,328,37,289,28,237,26,184,26,164,29,151,35,143,44,141,59,141,229,246,229,277,227,298,222,311,210,320,191,326,161,341,161,341,325,326,325,320,297,311,277,298,265,277,259,246,258,141,258,141,423,144,430,148,434,155,436,165,437,257,437,298,435,327,429,346,416,357,395,365,363,382,363,380,463,9,463,9,450,35,447,53,441,63,430,68,411,70,385,70,80,68,52,64,34,53,23,36,17,9,13,9,0,386,0,188,530,87,634,80,640,74,644,68,647,63,649,57,649,48,648,41,646,36,641,32,635,31,627,32,620,35,614,39,608,45,602,52,597,160,530,16383,16383,220,0,220,13,191,16,171,22,159,33,153,52,152,78,152,386,153,413,159,431,171,442,191,448,220,450,220,463,13,463,13,450,42,447,62,442,74,431,79,413,80,386,80,78,79,51,73,32,62,21,42,16,12,13,13,13,13,0,45,530,73,530,180,598,188,603,194,609,198,615,201,621,202,627,200,635,197,641,192,646,186,648,177,649,171,649,166,647,160,644,154,640,148,634,16383,16383,220,0,220,13,191,16,171,22,159,33,153,52,152,78,152,386,153,413,159,431,171,442,191,448,220,450,220,463,13,463,13,450,42,447,62,442,74,431,79,413,80,386,80,78,79,51,73,32,62,21,42,16,12,13,13,13,13,0,225,530,138,647,94,647,7,530,30,530,116,602,201,530,16383,16383,215,0,215,13,186,16,166,22,154,33,148,52,146,78,146,386,148,413,153,431,165,442,185,448,215,450,215,463,7,463,7,450,37,447,57,442,68,431,74,413,75,386,75,78,74,51,68,32,56,21,37,16,7,13,7,0,220,576,219,587,214,596,206,603,196,608,185,610,174,608,165,604,158,596,153,587,152,576,153,565,158,555,165,548,174,543,185,541,196,543,206,548,214,555,219,565,220, -576,16383,16383,81,576,79,587,74,596,67,603,57,608,46,610,35,608,26,604,18,596,13,587,12,576,13,565,18,555,25,548,35,543,45,541,57,543,66,548,74,555,79,565,81,576,16383,16383,220,0,220,13,191,16,171,22,159,33,153,52,152,78,152,386,153,413,159,431,170,442,190,448,220,450,220,463,12,463,12,450,42,447,61,442,73,431,78,413,80,386,80,78,78,51,73,32,61,21,41,16,12,13,12,0,11,463,11,450,39,447,57,441,67,430,72,413,73,387,73,252,15,252,15,220,73,220,73,77,71,51,66,33,56,23,38,16,11,13,11,0,210,0,256,3,299,10,338,22,373,38,402,57,429,84,451,116,467,153,476,192,480,234,467,313,432,377,374,424,297,453,200,463,16383,16383,145,220,246,220,246,252,145,252,145,421,149,429,155,434,164,437,178,438,213,436,245,432,272,426,297,416,318,404,348,379,372,348,389,313,400,273,403,229,400,182,389,141,372,106,348,77,318,55,296,44,272,36,245,30,214,27,180,26,166,27,155,29,149,35,146,43,145,55,342,622,335,608,329,598,322,591,314,588,305,587,299,587,291,588,284,590,276,593,252,605,241,610,231,614,221,616,212,617,202,618,182,615,165,606,151,592,139,572,131,548,152,548,157,559,163,568,170,574,179,578,188,580,198,578,204,577,210,574,216,572,232,564,247,557,260,552,270,549,279,548,289,548,310,550,327,558,341,573,353,594,363,622,16383,16383,495,463,329,463,329,450,346,448,359,446,369,443,377,439,384,432,390,424,393,413,396,400,397,383,398,363,398,125,127,463,9,463,9,450,27,449,41,445,52,438,64,428,77,413,77,105,75,67,69,42,57,27,38,18,9,13,9,0,172,0,172,13,144,19,126,28,114,44,109,68,107,105,107,377,416,-7,428,-7,428,355,429,383,431,404,436,419,441,430,448,438,454,442,461,445,470,447,480,449,495,450,315,530,213,634,207,640,201,644,195,647,189,649,184,649,175,648,168,646,162,641,159,635,158,627,159,620,161,614,166,608,172,602,179,597,287,530,16383,16383,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481,232,16383,16383,402,236,399, -188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,181,530,209,530,317,598,325,603,331,609,335,615,337,621,338,627,337,635,334,641,329,646,322,648,313,649,308,649,302,647,297,644,291,640,284,634,16383,16383,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481,232,16383,16383,402,236,399,188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,357,530,270,647,226,647,139,530,163,530,248,602,333,530,16383,16383,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481,232,16383,16383,402,236,399,188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,342,622,335,608,329,598,322,591,314,588,305,587,299,587,291,588,284,590,276,593,252,605,241,610,231,614,221,616,212,617,202,618,182,615,165,606,151,592,139,572,131,548,152,548,157,559,163,568,170,574,179,578,188,580,198,578,204,577,210,574,216,572,232,564,247,557,260,552,270,549,279,548,289,548,310,550,327,558,341,573,353,594,363,622,16383,16383,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481, -232,16383,16383,402,236,399,188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,352,576,350,587,345,596,338,603,328,608,317,610,306,608,297,604,290,596,285,587,283,576,285,565,289,555,296,548,306,543,316,541,328,543,337,548,345,555,350,565,352,576,16383,16383,213,576,211,587,206,596,198,603,189,608,178,610,167,608,158,604,150,596,145,587,144,576,145,565,150,555,157,548,166,543,177,541,189,543,198,548,206,555,211,565,213,576,16383,16383,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481,232,16383,16383,402,236,399,188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,418,16,257,177,418,339,386,370,224,209,63,370,30,338,191,177,30,15,63,-16,224,144,386,-16,461,514,427,514,376,439,350,452,327,462,303,469,279,472,253,473,177,462,114,429,65,378,34,311,23,231,25,205,28,180,34,155,41,132,51,111,58,96,67,83,77,70,89,57,105,41,39,-55,73,-55,129,25,154,11,177,1,201,-4,225,-8,252,-9,328,1,391,34,440,85,470,152,481,232,480,258,476,284,470,308,463,332,455,353,446,368,438,381,428,394,399,423,16383,16383,136,86,123,113,114,139,108,166,105,197,104,231,111,305,130,365,161,410,202,438,252,448,275,446,295,441,315,432,333,419,352,402,16383,16383,369,378,381,351,391,325,397,297,400,266,402,231,395,158,376,98,345,53,304,25,252,16,229,17,209,22,190,31,171,44,153,62,317,530,216,634,209,640,203,644,197,647,191,649,185,649,177,648,170,646,165,641,161,635,160,627,161,620,164,614,168,608,174, -602,181,597,289,530,16383,16383,494,463,331,463,331,450,360,446,379,437,390,421,395,396,397,359,397,175,396,144,394,119,390,98,382,80,371,62,371,63,356,48,337,37,315,28,291,23,265,21,242,22,222,26,204,33,188,42,175,52,161,69,152,88,147,110,145,135,145,384,146,411,151,429,161,440,180,446,208,450,208,463,10,463,10,450,38,447,56,441,66,431,71,415,73,391,73,174,75,133,81,97,93,67,109,42,130,23,148,11,169,2,193,-4,219,-8,248,-9,285,-7,318,-1,346,9,370,23,390,41,405,63,416,87,423,114,426,145,427,183,427,361,429,395,434,419,445,435,464,445,494,450,185,530,213,530,320,598,328,603,334,609,338,615,341,621,341,627,340,635,337,641,332,646,326,648,317,649,311,649,306,647,300,644,294,640,287,634,288,634,16383,16383,494,463,331,463,331,450,360,446,379,437,390,421,395,396,397,359,397,175,396,144,394,119,390,98,382,80,371,62,371,63,356,48,337,37,315,28,291,23,265,21,242,22,222,26,204,33,188,42,175,52,161,69,152,88,147,110,145,135,145,384,146,411,151,429,161,440,180,446,208,450,208,463,10,463,10,450,38,447,56,441,66,431,71,415,73,391,73,174,75,133,81,97,93,67,109,42,130,23,148,11,169,2,193,-4,219,-8,248,-9,285,-7,318,-1,346,9,370,23,390,41,405,63,416,87,423,114,426,145,427,183,427,361,429,395,434,419,445,435,464,445,494,450,358,530,270,647,227,647,140,530,164,530,248,602,334,530,16383,16383,494,463,331,463,331,450,360,446,379,437,390,421,395,396,397,359,397,175,396,144,394,119,390,98,382,80,371,62,371,63,356,48,337,37,315,28,291,23,265,21,242,22,222,26,204,33,188,42,175,52,161,69,152,88,147,110,145,135,145,384,146,411,151,429,161,440,180,446,208,450,208,463,10,463,10,450,38,447,56,441,66,431,71,415,73,391,73,174,75,133,81,97,93,67,109,42,130,23,148,11,169,2,193,-4,219,-8,248,-9,285,-7,318,-1,346,9,370,23,390,41,405,63,416,87,423,114,426,145,427,183,427,361,429,395,434,419,445,435,464,445,494,450,352,576,350,587,345,596,338,603,328,608,317,610,306,608,297,604,290,596,285,587,283,576,285,565,289,555,296,548,306, -543,316,541,328,543,337,548,345,555,350,565,352,576,16383,16383,213,576,211,587,206,596,198,603,189,608,178,610,167,608,158,604,150,596,145,587,144,576,145,565,150,555,157,548,166,543,177,541,189,543,198,548,206,555,211,565,213,576,16383,16383,494,463,331,463,331,450,360,446,379,437,390,421,395,396,397,359,397,175,396,144,394,119,390,98,382,80,371,62,371,63,356,48,337,37,315,28,291,23,265,21,242,22,222,26,204,33,188,42,175,52,161,69,152,88,147,110,145,135,145,384,146,411,151,429,161,440,180,446,208,450,208,463,10,463,10,450,38,447,56,441,66,431,71,415,73,391,73,174,75,133,81,97,93,67,109,42,130,23,148,11,169,2,193,-4,219,-8,248,-9,285,-7,318,-1,346,9,370,23,390,41,405,63,416,87,423,114,426,145,427,183,427,361,429,395,434,419,445,435,464,445,494,450,186,530,214,530,322,598,329,603,335,609,340,615,342,621,343,627,342,635,339,641,334,646,327,648,319,649,313,649,307,647,302,644,296,640,289,634,16383,16383,492,463,340,463,340,450,359,449,372,446,381,442,385,436,387,428,386,423,385,417,383,412,381,405,377,399,276,244,173,398,169,405,163,419,161,425,161,431,162,437,166,442,173,446,182,448,194,449,211,450,211,463,16,463,16,450,34,447,51,438,71,419,95,387,129,340,220,205,220,86,219,55,213,34,201,23,181,16,150,13,150,0,364,0,364,13,334,16,313,22,301,32,294,50,292,77,292,212,395,372,416,403,434,424,451,438,470,446,492,450,141,373,141,380,142,408,147,428,159,440,177,446,205,450,205,463,11,463,11,450,37,446,54,440,64,429,69,412,70,387,70,84,69,55,65,35,55,23,38,17,11,13,11,0,207,0,207,13,179,16,160,22,149,33,143,50,141,77,141,113,152,112,161,111,190,111,221,112,248,114,272,119,293,126,313,134,335,150,354,170,368,193,377,218,380,245,371,289,348,324,310,350,259,367,198,373,16383,16383,141,323,142,332,144,339,148,343,155,345,164,346,215,342,255,330,282,310,298,280,303,241,298,205,283,176,259,155,225,142,181,138,173,138,165,139,158,139,150,140,141,141,51,59,50,40,46,27,39,18,26,13,9,10,9,0,110,0,110,384,113,410,121,431,133,446,150, -456,170,459,192,455,210,442,223,422,231,395,234,361,231,331,223,308,210,290,191,278,167,273,159,272,154,270,150,268,148,265,147,262,148,258,150,254,154,252,161,251,170,250,203,243,228,225,247,196,258,156,262,105,261,86,258,67,255,50,250,36,245,27,241,22,236,18,224,14,217,14,210,15,205,17,201,21,198,27,195,51,193,59,188,67,182,73,174,77,166,78,155,77,147,72,140,65,136,56,134,45,138,28,147,14,161,3,180,-3,202,-5,242,1,277,20,304,49,321,87,327,130,326,154,320,175,312,195,300,213,284,228,271,239,257,247,241,253,222,259,198,264,237,284,265,302,282,322,292,344,295,372,289,408,274,437,249,459,216,473,176,478,130,472,95,453,70,421,56,376,51,318,222,355,120,459,114,465,108,469,102,472,96,474,91,474,82,473,75,471,69,466,66,460,65,452,66,445,68,439,73,433,79,427,86,422,194,355,16383,16383,309,46,303,41,297,37,291,35,286,33,280,33,272,35,266,40,262,49,259,62,258,79,258,213,257,235,256,253,252,267,247,279,238,291,227,302,213,310,197,317,177,321,155,322,137,321,119,318,103,314,88,308,75,301,62,291,52,280,45,268,40,257,39,245,41,234,46,225,52,218,61,214,70,213,80,214,89,219,95,225,100,233,102,241,101,249,100,255,98,265,98,271,100,282,107,291,117,299,130,304,146,305,164,303,179,296,191,283,198,266,201,242,201,205,159,189,128,176,106,165,89,156,75,148,59,136,46,122,35,105,28,87,26,66,29,40,39,20,55,5,75,-3,99,-6,118,-5,138,0,158,8,179,23,201,44,202,44,205,24,212,10,220,0,232,-4,246,-6,260,-5,273,-2,285,3,297,13,309,27,16383,16383,201,89,200,78,198,69,194,60,187,53,177,45,169,40,161,37,153,35,144,34,136,34,120,36,107,42,97,53,90,68,88,88,88,100,91,111,96,122,102,132,111,141,123,151,138,160,156,169,177,178,201,188,84,355,111,355,219,423,226,428,232,434,236,440,239,446,240,452,239,460,236,466,231,471,224,473,216,474,210,474,204,472,199,469,193,465,186,459,16383,16383,309,46,303,41,297,37,291,35,286,33,280,33,272,35,266,40,262,49,259,62,258,79,258,213,257,235,256,253,252,267,247,279,238,291,227, -302,213,310,197,317,177,321,155,322,137,321,119,318,103,314,88,308,75,301,62,291,52,280,45,268,40,257,39,245,41,234,46,225,52,218,61,214,70,213,80,214,89,219,95,225,100,233,102,241,101,249,100,255,98,265,98,271,100,282,107,291,117,299,130,304,146,305,164,303,179,296,191,283,198,266,201,242,201,205,159,189,128,176,106,165,89,156,75,148,59,136,46,122,35,105,28,87,26,66,29,40,39,20,55,5,75,-3,99,-6,118,-5,138,0,158,8,179,23,201,44,202,44,205,24,212,10,220,0,232,-4,246,-6,260,-5,273,-2,285,3,297,13,309,27,16383,16383,201,89,200,78,198,69,194,60,187,53,177,45,169,40,161,37,153,35,144,34,136,34,120,36,107,42,97,53,90,68,88,88,88,100,91,111,96,122,102,132,111,141,123,151,138,160,156,169,177,178,201,188,266,355,179,472,136,472,49,355,73,355,158,427,243,355,16383,16383,309,46,303,41,297,37,291,35,286,33,280,33,272,35,266,40,262,49,259,62,258,79,258,213,257,235,256,253,252,267,247,279,238,291,227,302,213,310,197,317,177,321,155,322,137,321,119,318,103,314,88,308,75,301,62,291,52,280,45,268,40,257,39,245,41,234,46,225,52,218,61,214,70,213,80,214,89,219,95,225,100,233,102,241,101,249,100,255,98,265,98,271,100,282,107,291,117,299,130,304,146,305,164,303,179,296,191,283,198,266,201,242,201,205,159,189,128,176,106,165,89,156,75,148,59,136,46,122,35,105,28,87,26,66,29,40,39,20,55,5,75,-3,99,-6,118,-5,138,0,158,8,179,23,201,44,202,44,205,24,212,10,220,0,232,-4,246,-6,260,-5,273,-2,285,3,297,13,309,27,16383,16383,201,89,200,78,198,69,194,60,187,53,177,45,169,40,161,37,153,35,144,34,136,34,120,36,107,42,97,53,90,68,88,88,88,100,91,111,96,122,102,132,111,141,123,151,138,160,156,169,177,178,201,188,252,447,245,433,238,423,232,416,224,413,215,412,208,412,201,413,194,415,186,418,178,422,161,430,151,435,141,439,131,441,121,442,112,443,92,440,75,431,61,417,49,397,41,373,62,373,67,384,73,393,80,399,88,403,98,405,108,403,114,402,120,399,126,397,142,389,157,382,170,377,180, -374,189,373,198,373,220,375,237,383,251,398,263,419,273,447,16383,16383,309,46,303,41,297,37,291,35,286,33,280,33,272,35,266,40,262,49,259,62,258,79,258,213,257,235,256,253,252,267,247,279,238,291,227,302,213,310,197,317,177,321,155,322,137,321,119,318,103,314,88,308,75,301,62,291,52,280,45,268,40,257,39,245,41,234,46,225,52,218,61,214,70,213,80,214,89,219,95,225,100,233,102,241,101,249,100,255,98,265,98,271,100,282,107,291,117,299,130,304,146,305,164,303,179,296,191,283,198,266,201,242,201,205,159,189,128,176,106,165,89,156,75,148,59,136,46,122,35,105,28,87,26,66,29,40,39,20,55,5,75,-3,99,-6,118,-5,138,0,158,8,179,23,201,44,202,44,205,24,212,10,220,0,232,-4,246,-6,260,-5,273,-2,285,3,297,13,309,27,16383,16383,201,89,200,78,198,69,194,60,187,53,177,45,169,40,161,37,153,35,144,34,136,34,120,36,107,42,97,53,90,68,88,88,88,100,91,111,96,122,102,132,111,141,123,151,138,160,156,169,177,178,201,188,261,401,259,412,254,421,247,428,237,433,226,435,215,433,206,429,199,421,194,412,192,401,194,390,198,380,206,373,215,368,226,366,237,368,247,373,254,380,259,390,261,401,16383,16383,122,401,120,412,115,421,107,428,98,433,87,435,76,433,67,429,59,421,54,412,52,401,54,390,59,380,66,373,75,368,86,366,97,368,107,373,115,380,120,390,122,401,16383,16383,309,46,303,41,297,37,291,35,286,33,280,33,272,35,266,40,262,49,259,62,258,79,258,213,257,235,256,253,252,267,247,279,238,291,227,302,213,310,197,317,177,321,155,322,137,321,119,318,103,314,88,308,75,301,62,291,52,280,45,268,40,257,39,245,41,234,46,225,52,218,61,214,70,213,80,214,89,219,95,225,100,233,102,241,101,249,100,255,98,265,98,271,100,282,107,291,117,299,130,304,146,305,164,303,179,296,191,283,198,266,201,242,201,205,159,189,128,176,106,165,89,156,75,148,59,136,46,122,35,105,28,87,26,66,29,40,39,20,55,5,75,-3,99,-6,118,-5,138,0,158,8,179,23,201,44,202,44,205,24,212,10,220,0,232,-4,246,-6,260,-5,273,-2,285,3,297,13,309,27,16383, -16383,201,89,200,78,198,69,194,60,187,53,177,45,169,40,161,37,153,35,144,34,136,34,120,36,107,42,97,53,90,68,88,88,88,100,91,111,96,122,102,132,111,141,123,151,138,160,156,169,177,178,201,188,227,429,223,451,213,470,198,485,179,496,158,499,135,496,116,486,101,471,91,452,88,430,91,407,101,388,116,373,134,364,156,360,179,364,198,373,213,388,223,407,227,429,16383,16383,203,430,201,415,194,402,184,392,171,386,156,384,142,386,129,392,120,402,113,415,111,430,113,444,120,456,130,466,142,473,156,475,171,473,184,466,194,456,201,444,203,430,16383,16383,309,46,303,41,297,37,291,35,286,33,280,33,272,35,266,40,262,49,259,62,258,79,258,213,257,235,256,253,252,267,247,279,238,291,227,302,213,310,197,317,177,321,155,322,137,321,119,318,103,314,88,308,75,301,62,291,52,280,45,268,40,257,39,245,41,234,46,225,52,218,61,214,70,213,80,214,89,219,95,225,100,233,102,241,101,249,100,255,98,265,98,271,100,282,107,291,117,299,130,304,146,305,164,303,179,296,191,283,198,266,201,242,201,205,159,189,128,176,106,165,89,156,75,148,59,136,46,122,35,105,28,87,26,66,29,40,39,20,55,5,75,-3,99,-6,118,-5,138,0,158,8,179,23,201,44,202,44,205,24,212,10,220,0,232,-4,246,-6,260,-5,273,-2,285,3,297,13,309,27,16383,16383,201,89,200,78,198,69,194,60,187,53,177,45,169,40,161,37,153,35,144,34,136,34,120,36,107,42,97,53,90,68,88,88,88,100,91,111,96,122,102,132,111,141,123,151,138,160,156,169,177,178,201,188,434,108,415,82,396,62,376,49,356,42,333,40,316,41,301,46,287,54,275,63,266,75,259,91,254,109,251,130,249,157,248,194,431,194,423,242,409,278,387,303,358,317,320,322,301,321,285,317,269,311,253,302,236,289,220,302,205,311,190,317,173,321,153,322,118,318,87,308,63,291,48,270,42,246,44,235,48,225,54,218,62,214,73,213,83,214,92,218,98,225,102,234,104,245,104,252,103,258,102,263,102,274,104,284,111,292,121,298,134,302,149,304,166,302,178,295,186,282,191,265,192,241,192,197,102,172,67,157,45,139,33,118,28,95,27,70,30,45,41,24,59, -8,81,0,108,-4,128,-2,147,1,166,9,188,23,214,44,229,25,245,11,263,2,282,-2,305,-4,323,-3,340,0,356,5,372,13,387,23,399,34,410,47,420,62,431,81,442,105,16383,16383,248,215,252,247,260,271,272,288,288,297,309,300,329,297,345,288,355,271,362,247,365,215,16383,16383,192,141,194,111,197,96,200,80,205,64,205,62,200,53,188,44,170,35,151,29,134,27,116,30,104,39,94,52,89,69,88,88,90,110,100,128,119,144,149,160,192,177,279,109,260,84,241,65,222,53,202,46,180,44,144,50,114,68,91,97,76,135,71,180,76,220,88,254,109,280,135,296,166,302,180,300,190,297,197,291,203,281,208,268,212,252,216,241,222,232,229,226,237,222,245,220,256,222,265,226,272,232,277,241,279,250,273,272,258,292,234,308,205,318,171,322,151,320,132,316,113,308,94,298,77,286,55,265,39,240,27,213,20,182,17,148,23,101,38,61,63,28,95,6,134,-4,108,-69,113,-72,119,-70,123,-69,132,-69,146,-70,157,-73,164,-78,168,-85,170,-94,168,-105,163,-113,155,-119,144,-123,131,-125,123,-125,114,-124,106,-122,96,-120,85,-117,76,-138,88,-143,99,-146,110,-148,134,-150,164,-147,188,-139,207,-127,218,-111,222,-90,219,-74,211,-60,199,-51,182,-45,162,-43,151,-43,148,-44,144,-44,158,-6,190,0,218,13,243,34,266,64,288,103,217,355,116,459,109,465,103,469,97,472,91,474,85,474,77,473,70,471,65,466,61,460,60,452,61,445,64,439,68,433,74,427,81,422,189,355,16383,16383,286,115,266,87,247,67,226,52,204,44,178,41,159,43,142,47,126,55,112,66,100,80,87,99,79,119,73,140,70,165,68,194,284,194,281,215,278,232,273,248,267,261,259,273,245,290,228,304,209,314,187,320,162,322,163,322,113,314,73,290,43,254,24,207,17,152,23,98,40,54,68,21,105,0,151,-6,190,-1,224,12,254,36,278,69,297,110,16383,16383,70,216,77,245,88,267,103,284,122,294,144,297,168,294,186,285,198,269,206,246,212,216,81,355,109,355,217,423,225,428,231,434,235,440,237,446,238,452,237,460,234,466,229,471,222,473,213,474,208,474,202,472,197,469,191,465,184,459,16383,16383,286,115,266,87,247,67,226,52,204,44,178,41,159,43,142,47,126,55,112,66,100, -80,87,99,79,119,73,140,70,165,68,194,284,194,281,215,278,232,273,248,267,261,259,273,245,290,228,304,209,314,187,320,162,322,163,322,113,314,73,290,43,254,24,207,17,152,23,98,40,54,68,21,105,0,151,-6,190,-1,224,12,254,36,278,69,297,110,16383,16383,70,216,77,245,88,267,103,284,122,294,144,297,168,294,186,285,198,269,206,246,212,216,266,355,178,472,135,472,48,355,72,355,157,427,242,355,16383,16383,286,115,266,87,247,67,226,52,204,44,178,41,159,43,142,47,126,55,112,66,100,80,87,99,79,119,73,140,70,165,68,194,284,194,281,215,278,232,273,248,267,261,259,273,245,290,228,304,209,314,187,320,162,322,163,322,113,314,73,290,43,254,24,207,17,152,23,98,40,54,68,21,105,0,151,-6,190,-1,224,12,254,36,278,69,297,110,16383,16383,70,216,77,245,88,267,103,284,122,294,144,297,168,294,186,285,198,269,206,246,212,216,260,401,258,412,253,421,246,428,237,433,226,435,215,433,205,429,198,421,193,412,191,401,193,390,198,380,205,373,214,368,225,366,236,368,246,373,253,380,258,390,260,401,16383,16383,121,401,119,412,114,421,106,428,97,433,86,435,75,433,66,429,58,421,53,412,52,401,53,390,58,380,65,373,74,368,85,366,96,368,106,373,114,380,119,390,121,401,16383,16383,286,115,266,87,247,67,226,52,204,44,178,41,159,43,142,47,126,55,112,66,100,80,87,99,79,119,73,140,70,165,68,194,284,194,281,215,278,232,273,248,267,261,259,273,245,290,228,304,209,314,187,320,162,322,163,322,113,314,73,290,43,254,24,207,17,152,23,98,40,54,68,21,105,0,151,-6,190,-1,224,12,254,36,278,69,297,110,16383,16383,70,216,77,245,88,267,103,284,122,294,144,297,168,294,186,285,198,269,206,246,212,216,161,355,59,459,53,465,47,469,41,472,36,474,30,474,21,473,14,471,8,466,5,460,4,452,5,445,8,439,12,433,18,427,25,422,133,355,16383,16383,170,0,170,10,147,13,132,19,123,30,119,47,118,73,118,320,115,322,7,284,7,273,21,275,27,276,37,276,46,274,52,270,56,262,59,249,59,73,58,46,54,29,44,18,28,13,4,10,4,0,34,355,63,355,170,423,178,428,184,434,188, -440,191,446,191,452,190,460,187,466,182,471,175,473,166,474,161,474,155,472,150,469,144,465,137,459,138,459,16383,16383,177,0,177,10,154,13,139,19,130,30,126,47,125,73,125,320,122,322,14,284,14,273,28,275,34,276,44,276,53,274,59,270,63,262,66,249,66,73,65,46,61,29,51,18,35,13,11,10,11,0,205,355,118,472,75,472,-11,355,12,355,97,427,182,355,16383,16383,154,0,154,10,131,13,116,19,107,30,103,47,102,73,102,320,98,322,-8,284,-8,273,-1,274,11,276,20,276,29,274,36,270,40,262,43,249,44,232,44,73,43,46,38,29,29,18,13,13,-11,10,-11,0,202,401,200,412,195,421,187,428,177,433,166,435,156,433,146,429,139,421,134,412,132,401,134,390,138,380,146,373,155,368,166,366,177,368,187,373,195,380,200,390,202,401,16383,16383,63,401,61,412,56,421,48,428,38,433,27,435,17,433,7,429,0,421,-4,412,-6,401,-4,390,0,380,7,373,16,368,27,366,38,368,48,373,55,380,61,390,62,401,16383,16383,159,0,159,10,136,13,121,19,112,30,108,47,107,73,107,320,104,322,-3,284,-3,273,3,274,10,275,16,276,25,276,34,274,41,270,45,262,48,249,48,73,47,46,43,29,33,18,17,13,-6,10,-6,0,297,459,273,480,207,445,189,457,170,465,149,471,126,476,100,478,70,461,92,457,112,452,130,445,147,436,165,423,80,378,103,357,189,402,211,380,228,358,240,334,250,309,257,280,238,297,222,309,207,317,190,321,172,322,124,314,82,291,50,255,28,208,20,152,28,98,48,54,81,21,123,0,172,-6,203,-3,230,4,254,18,275,37,293,61,305,84,316,111,323,139,328,169,330,199,326,251,315,301,296,347,269,389,233,426,16383,16383,266,141,262,97,251,61,234,35,211,18,184,13,145,25,116,57,97,102,87,151,84,197,87,230,98,259,116,282,138,297,165,302,199,295,227,273,248,240,262,195,266,141,274,447,267,433,261,423,254,416,246,413,237,412,231,412,223,413,216,415,208,418,184,430,173,435,163,439,153,441,144,442,134,443,115,440,97,431,83,417,72,397,64,373,84,373,89,384,95,393,102,399,111,403,120,405,130,403,136,402,142,399,148,397,165,389,180,382,192,377,202,374,211,373,221,373,242,375,259, -383,273,398,285,419,295,447,16383,16383,340,0,340,10,322,13,310,18,302,27,298,40,297,59,297,214,293,252,283,282,266,304,243,317,214,322,195,320,175,314,155,303,135,287,113,266,113,320,107,322,88,315,52,303,33,297,11,291,11,279,14,280,18,280,22,281,31,281,41,280,48,275,53,267,56,254,56,66,55,44,51,29,43,19,31,13,12,10,13,10,13,0,160,0,160,10,142,13,129,18,120,26,116,36,115,51,115,244,132,260,147,271,161,279,174,282,187,284,205,281,220,273,230,259,236,239,238,212,238,73,237,49,233,32,225,21,213,14,195,10,194,0,232,355,131,459,124,465,118,469,112,472,107,474,101,474,92,473,85,471,80,466,77,460,76,452,77,445,79,439,84,433,90,427,97,422,205,355,16383,16383,329,162,321,216,300,260,268,293,227,315,178,322,125,314,82,293,49,259,28,214,20,159,28,105,49,59,82,24,123,1,172,-6,224,1,268,24,301,60,322,107,329,162,16383,16383,266,143,262,98,252,62,235,35,212,18,184,13,169,14,155,18,142,25,130,35,120,48,107,72,96,98,89,128,85,159,84,191,87,230,98,260,115,283,138,297,165,302,182,301,196,296,209,289,221,279,231,267,243,248,253,225,260,199,264,171,266,143,108,355,136,355,244,423,251,428,257,434,261,440,264,446,265,452,264,460,261,466,255,471,248,473,240,474,234,474,229,472,224,469,218,465,211,459,16383,16383,329,162,321,216,300,260,268,293,227,315,178,322,125,314,82,293,49,259,28,214,20,159,28,105,49,59,82,24,123,1,172,-6,224,1,268,24,301,60,322,107,329,162,16383,16383,266,143,262,98,252,62,235,35,212,18,184,13,169,14,155,18,142,25,130,35,120,48,107,72,96,98,89,128,85,159,84,191,87,230,98,260,115,283,138,297,165,302,182,301,196,296,209,289,221,279,231,267,243,248,253,225,260,199,264,171,266,143,280,355,193,472,150,472,63,355,87,355,172,427,257,355,16383,16383,329,162,321,216,300,260,268,293,227,315,178,322,125,314,82,293,49,259,28,214,20,159,28,105,49,59,82,24,123,1,172,-6,224,1,268,24,301,60,322,107,329,162,16383,16383,266,143,262,98,252,62,235,35,212,18,184,13,169,14,155,18,142,25,130,35,120,48,107, -72,96,98,89,128,85,159,84,191,87,230,98,260,115,283,138,297,165,302,182,301,196,296,209,289,221,279,231,267,243,248,253,225,260,199,264,171,266,143,266,447,260,433,253,423,246,416,238,413,230,412,223,412,216,413,208,415,200,418,166,435,156,439,146,441,136,442,127,443,107,440,90,431,75,417,64,397,56,373,77,373,82,384,88,393,95,399,103,403,112,405,117,404,129,402,135,399,141,397,157,389,172,382,184,377,194,374,204,373,213,373,235,375,252,383,266,398,277,419,287,447,16383,16383,329,162,321,216,300,260,268,293,227,315,178,322,125,314,82,293,49,259,28,214,20,159,28,105,49,59,82,24,123,1,172,-6,224,1,268,24,301,60,322,107,329,162,16383,16383,266,143,262,98,252,62,235,35,212,18,184,13,169,14,155,18,142,25,130,35,120,48,107,72,96,98,89,128,85,159,84,191,87,230,98,260,115,283,138,297,165,302,182,301,196,296,209,289,221,279,231,267,243,248,253,225,260,199,264,171,266,143,276,401,274,412,269,421,261,428,251,433,241,435,230,433,220,429,213,421,208,412,206,401,208,390,213,380,220,373,229,368,240,366,251,368,261,373,269,380,274,390,276,401,16383,16383,137,401,135,412,130,421,122,428,112,433,102,435,91,433,81,429,74,421,69,412,67,401,69,390,74,380,81,373,90,368,101,366,112,368,122,373,130,380,135,390,137,401,16383,16383,329,162,321,216,300,260,268,293,227,315,178,322,125,314,82,293,49,259,28,214,20,159,28,105,49,59,82,24,123,1,172,-6,224,1,268,24,301,60,322,107,329,162,16383,16383,266,143,262,98,252,62,235,35,212,18,184,13,169,14,155,18,142,25,130,35,120,48,107,72,96,98,89,128,85,159,84,191,87,230,98,260,115,283,138,297,165,302,182,301,196,296,209,289,221,279,231,267,243,248,253,225,260,199,264,171,266,143,237,321,235,333,229,344,221,353,210,359,198,361,186,359,175,353,166,345,161,334,159,322,161,309,166,299,174,291,185,285,198,284,210,286,221,291,229,299,235,309,237,321,16383,16383,373,154,373,200,21,200,21,154,16383,16383,237,30,235,43,229,54,221,62,210,68,198,70,186,68,175,63,166,54,161,44,159,31,161,19,166,9,174,0,185,-4,198,-6,210,-4,221, -0,229,8,235,19,237,30,306,386,279,386,239,309,225,314,212,318,200,320,188,321,174,322,124,314,81,292,49,257,28,212,20,159,21,140,24,122,28,104,42,70,49,59,56,50,64,41,74,31,88,20,37,-77,63,-77,108,8,122,2,146,-4,159,-6,173,-6,223,1,266,25,300,62,321,109,329,164,326,197,318,227,305,254,285,277,260,298,16383,16383,111,64,101,88,93,113,88,139,85,165,84,194,87,230,98,260,115,283,138,297,166,302,178,301,189,299,200,294,211,287,222,277,16383,16383,238,256,249,234,257,212,262,191,265,167,266,142,262,97,252,61,235,35,212,18,183,13,169,14,157,17,146,23,136,31,125,42,238,355,136,459,129,465,123,469,118,472,112,474,105,474,97,473,90,471,85,466,82,460,80,452,81,445,84,439,88,433,94,427,102,422,209,355,16383,16383,336,35,332,35,315,36,304,40,297,47,293,59,292,75,292,315,181,315,181,303,203,301,218,296,227,289,232,276,233,258,233,96,232,83,230,74,227,67,223,61,217,55,206,47,194,41,182,37,170,34,158,34,142,36,129,44,118,56,111,71,109,89,109,315,6,315,6,305,24,303,36,298,44,289,49,276,50,259,50,83,54,53,64,28,82,9,106,-2,135,-6,152,-4,172,1,193,12,214,29,235,53,237,53,237,-3,240,-5,260,2,279,8,297,14,316,20,336,25,109,355,138,355,245,423,253,428,259,434,263,440,265,446,266,452,265,460,262,466,257,471,250,473,241,474,236,474,230,472,225,469,219,465,212,459,16383,16383,336,35,332,35,315,36,304,40,297,47,293,59,292,75,292,315,181,315,181,303,203,301,218,296,227,289,232,276,233,258,233,96,232,83,230,74,227,67,223,61,217,55,206,47,194,41,182,37,170,34,158,34,142,36,129,44,118,56,111,71,109,89,109,315,6,315,6,305,24,303,36,298,44,289,49,276,50,259,50,83,54,53,64,28,82,9,106,-2,135,-6,152,-4,172,1,193,12,214,29,235,53,237,53,237,-3,240,-5,260,2,279,8,297,14,316,20,336,25,280,355,193,472,150,472,63,355,87,355,172,427,257,355,16383,16383,336,35,332,35,315,36,304,40,297,47,293,59,292,75,292,315,181,315,181,303,203,301,218,296,227,289,232,276,233,258,233,96,232,83,230, -74,227,67,223,61,217,55,206,47,194,41,182,37,170,34,158,34,142,36,129,44,118,56,111,71,109,89,109,315,6,315,6,305,24,303,36,298,44,289,49,276,50,259,50,83,54,53,64,28,82,9,106,-2,135,-6,152,-4,172,1,193,12,214,29,235,53,237,53,237,-3,240,-5,260,2,279,8,297,14,316,20,336,25,275,401,273,412,268,421,261,428,251,433,240,435,229,433,220,429,212,421,207,412,205,401,207,390,212,380,219,373,228,368,239,366,251,368,260,373,268,380,273,390,275,401,16383,16383,136,401,134,412,129,421,121,428,112,433,101,435,90,433,81,429,73,421,68,412,66,401,68,390,73,380,80,373,89,368,100,366,111,368,121,373,129,380,134,390,136,401,16383,16383,336,35,332,35,315,36,304,40,297,47,293,59,292,75,292,315,181,315,181,303,203,301,218,296,227,289,232,276,233,258,233,96,232,83,230,74,227,67,223,61,217,55,206,47,194,41,182,37,170,34,158,34,142,36,129,44,118,56,111,71,109,89,109,315,6,315,6,305,24,303,36,298,44,289,49,276,50,259,50,83,54,53,64,28,82,9,106,-2,135,-6,152,-4,172,1,193,12,214,29,235,53,237,53,237,-3,240,-5,260,2,279,8,297,14,316,20,336,25,100,355,128,355,236,423,244,428,254,440,256,446,257,452,256,460,253,466,248,471,241,473,232,474,226,474,221,472,216,469,210,465,203,459,16383,16383,333,315,239,315,239,305,251,304,260,302,267,299,271,294,272,287,272,286,271,283,271,281,269,275,201,82,123,257,117,269,115,275,114,281,113,286,115,293,119,297,126,301,138,303,153,305,153,315,10,315,10,305,20,303,29,300,36,295,42,289,47,280,139,84,147,66,155,49,162,34,167,21,169,12,169,13,167,2,163,-12,157,-30,149,-48,141,-62,134,-72,119,-87,112,-91,105,-93,103,-93,100,-92,92,-90,87,-88,88,-88,80,-85,73,-82,66,-80,58,-79,51,-79,41,-80,33,-85,27,-92,23,-101,21,-111,23,-124,30,-135,40,-144,53,-149,70,-151,100,-147,126,-133,149,-107,171,-69,192,-16,298,269,303,282,309,292,316,298,323,303,333,305,111,475,107,478,88,472,71,466,53,461,32,455,6,448,6,435,9,436,13,436,15,437,18,437,33,436,43,432,49,424,52,413,52,-89,51, --107,47,-121,38,-130,24,-135,3,-138,3,-151,172,-151,172,-138,145,-136,127,-131,117,-122,112,-106,111,-83,111,23,125,11,139,3,152,-2,166,-5,182,-6,229,2,270,27,301,66,322,115,329,173,324,224,309,265,285,296,252,315,212,322,189,320,168,314,148,303,129,287,111,266,16383,16383,111,232,116,245,128,258,145,269,164,277,183,280,213,275,237,259,255,233,265,196,269,149,265,106,254,69,237,40,213,22,184,16,163,19,144,26,127,37,115,50,111,63,277,401,275,412,270,421,263,428,253,433,242,435,231,433,222,429,215,421,210,412,208,401,210,390,214,380,221,373,231,368,241,366,253,368,262,373,270,380,275,390,277,401,16383,16383,138,401,136,412,131,421,124,428,114,433,103,435,92,433,83,429,75,421,71,412,69,401,70,390,75,380,82,373,92,368,102,366,114,368,123,373,131,380,136,390,138,401,16383,16383,333,315,239,315,239,305,251,304,260,302,267,299,271,294,272,287,272,286,271,283,271,281,269,275,201,82,123,257,117,269,115,275,114,281,113,286,115,293,119,297,126,301,138,303,153,305,153,315,10,315,10,305,20,303,29,300,36,295,42,289,47,280,139,84,147,66,155,49,162,34,167,21,169,12,169,13,167,2,163,-12,157,-30,149,-48,141,-62,134,-72,119,-87,112,-91,105,-93,103,-93,100,-92,92,-90,87,-88,88,-88,80,-85,73,-82,66,-80,58,-79,51,-79,41,-80,33,-85,27,-92,23,-101,21,-111,23,-124,30,-135,40,-144,53,-149,70,-151,100,-147,126,-133,149,-107,171,-69,192,-16,298,269,303,282,309,292,316,298,323,303,333,305,233,355,131,459,125,465,119,469,113,472,107,474,102,474,93,473,86,471,81,466,78,460,77,452,77,445,80,439,84,433,90,427,98,422,205,355,77,355,105,355,212,422,219,427,225,433,229,439,232,446,233,452,232,460,229,466,223,471,216,473,208,474,202,474,196,472,191,469,185,465,178,459,284,355,196,472,152,472,66,355,90,355,174,427,259,355,270,447,263,433,257,423,250,416,242,412,233,411,225,411,217,413,207,417,195,422,169,435,159,439,149,441,140,442,130,443,111,440,93,431,79,417,68,397,59,373,80,373,85,384,91,393,98,399,106,403,116,405,123,404,129,403,137,400,147,395,160,389,175,382,188,377,198,374,207,373,217, -373,238,375,255,383,269,398,281,419,291,447,284,383,284,420,66,420,66,383,350,539,350,574,0,574,0,539,252,465,239,439,226,419,212,406,194,399,173,397,149,400,130,408,114,422,103,441,95,465,75,465,79,427,90,397,109,374,137,360,172,355,204,359,230,372,250,394,264,425,272,465,209,401,208,412,203,421,196,429,186,433,174,435,163,433,153,428,146,421,141,412,140,401,142,390,147,380,154,373,163,368,174,366,185,368,195,373,202,380,208,389,209,401,280,401,278,412,273,421,265,428,255,433,245,435,234,433,224,429,217,421,212,412,210,401,212,390,217,380,224,373,233,368,244,366,255,368,265,373,273,380,278,390,280,401,16383,16383,140,401,138,412,133,421,125,428,116,433,105,435,94,433,84,429,77,421,72,412,70,401,72,390,77,380,84,373,94,368,105,366,116,368,126,373,133,380,138,390,140,401,153,407,153,345,177,345,178,369,184,369,205,373,224,384,239,401,249,424,253,450,251,472,244,493,231,510,211,522,180,526,162,524,153,521,145,518,138,513,132,508,127,502,124,496,122,490,121,484,122,478,125,473,129,469,134,466,141,465,152,469,158,481,163,494,170,505,184,509,195,506,204,498,210,486,214,471,215,455,212,440,205,426,194,416,179,409,162,407,245,427,242,449,232,469,217,484,198,494,177,498,154,494,135,484,119,469,109,450,105,428,109,406,119,387,133,372,152,362,174,359,197,362,216,372,232,387,242,405,245,427,16383,16383,221,428,219,413,212,401,202,391,189,384,174,382,160,384,148,391,138,401,132,413,130,428,132,443,139,455,148,465,161,472,174,474,189,472,202,465,212,455,219,443,221,428,165,355,192,355,300,422,308,428,313,433,317,440,320,446,320,454,319,461,316,467,311,471,305,473,297,474,291,474,286,473,281,470,274,466,266,459,16383,16383,55,355,84,355,191,422,199,428,205,433,209,440,211,446,212,454,211,461,207,467,202,471,195,473,187,474,182,474,177,473,172,470,165,466,158,459,284,472,259,472,175,400,91,472,66,472,152,355,198,355,199,350,199,490,161,490,161,350,243,350,243,490,205,490,205,350,16383,16383,145,350,145,490,108,490,108,350,320,355,219,459,211,466,205,470,199,473,194,474,188,474,180,473,174,471,169,467,166,461,165,454,166, -446,168,440,172,433,177,428,185,422,293,355,16383,16383,212,355,109,459,102,466,95,470,90,473,84,474,79,474,71,473,65,471,60,467,57,461,55,454,56,446,58,440,62,433,68,428,76,422,184,355,209,502,208,513,203,523,196,530,186,535,174,537,163,535,153,530,146,522,141,513,140,502,142,491,147,482,154,474,163,470,174,468,185,470,195,474,202,481,208,490,209,502,16383,16383,252,465,239,439,226,419,212,406,194,399,173,397,149,400,130,408,114,422,103,441,95,465,75,465,79,427,90,397,109,374,137,360,172,355,204,359,230,372,250,394,264,425,272,465,272,355,264,395,250,426,230,447,204,461,172,465,137,460,109,446,90,423,79,392,75,355,95,355,103,379,114,398,130,412,149,420,173,423,194,420,212,413,226,400,239,381,252,355,205,522,189,513,169,497,148,474,133,448,127,419,131,389,142,370,156,358,171,353,184,352,194,353,205,357,215,365,222,376,224,392,221,407,214,417,204,423,192,426,180,427,176,427,172,426,169,425,167,425,164,424,158,426,156,428,154,431,154,434,155,444,161,458,171,473,188,490,212,508,145,352,162,360,182,377,203,399,218,425,224,455,220,484,209,503,194,515,179,520,167,522,156,520,145,516,136,508,129,497,127,481,129,467,137,457,147,450,159,447,170,446,175,446,178,447,182,448,190,448,193,447,195,445,197,439,195,429,190,416,179,400,163,382,139,365,212,365,188,382,171,400,161,416,155,429,154,439,154,442,156,445,158,447,161,448,169,448,172,447,176,446,180,446,192,447,204,450,214,457,221,467,224,481,222,497,215,508,205,516,194,521,184,522,171,520,156,515,142,503,131,484,127,455,133,425,148,399,169,376,189,360,205,352,295,352,312,360,332,377,352,399,367,425,373,455,369,484,358,503,344,515,329,520,317,522,306,520,295,516,286,508,279,497,277,481,279,467,287,457,297,450,308,447,320,446,324,446,328,447,331,448,340,448,342,447,345,445,347,439,345,429,340,416,329,400,313,382,289,365,233,-156,131,-52,125,-46,119,-41,113,-38,107,-36,102,-36,93,-37,86,-39,81,-44,78,-50,77,-58,77,-65,80,-71,84,-78,90,-83,98,-89,205,-156,77,-156,105,-156,212,-89,219,-83,225,-78,229,-71,232,-65,233,-58,232,-50,229,-44,223,-39,216,-37,208, --36,202,-36,196,-38,191,-41,185,-46,178,-52,189,-197,189,-36,161,-36,161,-103,58,-103,58,-130,161,-130,161,-197,189,-130,189,-103,86,-103,86,-36,58,-36,58,-197,86,-197,86,-130,280,372,280,515,70,515,70,476,241,476,241,372,311,241,317,242,333,246,341,249,348,252,357,259,364,267,368,275,371,284,372,293,370,306,364,317,357,325,347,330,337,332,338,332,327,330,318,326,311,319,307,311,305,303,308,291,314,282,321,276,327,271,330,267,327,264,323,261,318,259,311,257,173,-185,173,-159,152,-159,139,-157,127,-151,118,-142,112,-130,110,-117,112,-103,118,-92,127,-83,139,-77,152,-75,173,-75,173,-49,152,-49,131,-52,112,-62,97,-77,88,-95,84,-117,88,-138,98,-157,112,-172,131,-181,152,-185,255,-167,255,-139,189,-139,189,-36,161,-36,161,-139,95,-139,95,-167,255,-64,255,-36,95,-36,95,-64,161,-64,161,-167,189,-167,189,-64,242,-117,242,-86,188,-86,188,-36,162,-36,162,-86,108,-86,108,-117,162,-117,162,-174,188,-174,188,-117,242,-117,242,-86,108,-86,108,-117,337,52,298,52,298,-123,297,-142,293,-159,286,-173,275,-183,259,-186,259,-187,250,-185,242,-182,234,-177,227,-171,221,-165,216,-158,211,-152,205,-147,199,-144,191,-143,185,-144,179,-146,175,-150,173,-155,172,-162,176,-174,189,-185,208,-193,233,-198,261,-200,285,-195,306,-181,322,-160,333,-134,337,-103,337,52,298,52,298,-103,302,-134,313,-160,329,-181,349,-195,373,-200,402,-198,426,-193,446,-185,459,-174,463,-161,463,-162,462,-155,460,-150,455,-146,450,-144,444,-143,436,-144,430,-147,424,-152,419,-158,414,-165,408,-171,401,-177,393,-182,385,-185,376,-187,360,-183,349,-173,342,-159,338,-141,337,-123,209,-117,208,-106,203,-96,196,-88,186,-84,174,-82,163,-84,153,-89,146,-96,141,-106,140,-117,142,-128,147,-137,154,-144,163,-149,174,-151,185,-149,195,-145,202,-138,208,-128,209,-117,280,-117,278,-106,273,-96,265,-89,255,-84,245,-83,234,-84,224,-89,217,-96,212,-106,210,-117,212,-128,217,-138,224,-145,233,-150,244,-151,255,-150,265,-145,273,-138,278,-128,280,-117,16383,16383,140,-117,138,-106,133,-96,125,-89,116,-84,105,-83,94,-84,84,-89,77,-96,72,-106,70,-117,72,-128,77,-138,84,-145,94,-150,105,-151,116,-150,126,-145,133,-138,138,-128,140,-117,245,-117,242,-95,232,-76,217,-61,198,-51,177,-47,154,-51,135,-61,119, --76,109,-95,105,-117,109,-139,119,-158,133,-173,152,-183,174,-186,174,-187,197,-183,216,-173,232,-158,242,-139,245,-117,16383,16383,221,-117,219,-132,212,-144,202,-154,189,-161,174,-163,160,-161,148,-154,138,-144,132,-132,130,-117,132,-103,139,-90,148,-80,161,-73,174,-71,189,-73,202,-80,212,-90,219,-102,221,-117,145,-246,162,-237,182,-221,203,-199,218,-172,224,-144,220,-114,209,-95,194,-83,179,-78,167,-76,156,-78,145,-82,136,-90,129,-101,127,-117,129,-131,137,-141,147,-147,159,-150,170,-151,178,-151,182,-150,184,-149,190,-149,193,-151,195,-152,197,-158,195,-168,190,-182,179,-198,163,-215,139,-233,188,0,163,0,134,-69,139,-72,142,-71,150,-69,159,-69,173,-70,183,-73,191,-78,195,-85,196,-94,194,-105,189,-113,181,-119,171,-123,158,-125,149,-125,141,-124,123,-120,112,-117,102,-138,114,-143,125,-146,137,-148,148,-149,161,-150,191,-147,215,-139,233,-127,245,-111,248,-90,246,-74,238,-60,226,-51,209,-45,188,-43,178,-43,174,-44,170,-44,226,-50,214,-60,204,-67,194,-72,185,-75,177,-76,168,-75,160,-72,155,-66,151,-59,150,-48,151,-38,154,-29,160,-19,169,-9,180,0,148,0,134,-10,124,-22,116,-35,112,-48,111,-63,113,-81,120,-95,131,-106,145,-112,163,-115,180,-113,196,-107,211,-96,225,-81,240,-61,240,-62,189,-163,189,-70,161,-70,161,-163,285,-164,285,-68,66,-68,66,-164,105,-164,105,-106,246,-106,246,-164,284,-76,255,-76,255,-101,254,-111,250,-119,244,-125,234,-129,221,-130,211,-129,202,-125,195,-119,191,-111,189,-101,189,-76,161,-76,161,-101,160,-112,157,-120,151,-126,143,-129,131,-130,120,-129,111,-126,104,-120,99,-112,98,-101,98,-76,70,-76,70,-101,73,-120,81,-136,94,-148,111,-155,132,-158,145,-156,155,-153,164,-148,171,-141,175,-134,180,-141,188,-148,198,-153,210,-156,223,-158,243,-155,260,-148,273,-136,281,-120,284,-101,284,-50,259,-50,175,-122,91,-50,66,-50,152,-167,198,-167,284,-167,197,-50,153,-50,66,-167,91,-167,175,-95,260,-167,253,-47,241,-73,228,-92,213,-105,196,-112,176,-115,151,-112,132,-103,116,-89,105,-71,98,-47,77,-47,81,-84,93,-115,112,-138,139,-152,174,-157,206,-152,232,-139,252,-117,266,-87,273,-47,273,-151,266,-111,252,-80,232,-58,206,-45,174,-40,139,-45,112,-60,93,-82,81,-113,77,-151,98,-151,105,-126,116,-107,132,-94,151,-85,176,-83,196, --85,213,-92,228,-105,241,-124,253,-151,270,-78,263,-92,257,-102,250,-109,242,-113,233,-114,225,-113,217,-111,207,-108,179,-94,159,-86,149,-84,140,-82,130,-82,111,-85,93,-94,79,-108,68,-127,59,-152,80,-152,85,-140,91,-131,98,-125,106,-121,116,-120,123,-121,129,-122,137,-125,147,-129,160,-136,175,-143,188,-148,198,-150,207,-152,217,-152,238,-150,255,-141,269,-127,281,-106,291,-78,284,-136,284,-97,66,-97,66,-136,350,-133,350,-97,0,-97,0,-133,350,-133,350,-97,0,-97,0,-133,16383,16383,350,-209,350,-174,0,-174,0,-209,266,224,259,211,252,200,246,194,238,190,229,188,221,189,213,191,203,194,175,208,155,216,135,220,126,220,106,217,89,209,74,194,63,175,55,150,76,150,81,162,87,171,94,177,102,181,111,182,118,182,125,180,133,177,143,173,156,166,172,159,184,155,194,152,203,150,213,150,234,153,251,161,265,175,277,196,286,224,281,161,281,192,67,192,67,161,350,161,350,192,0,192,0,161,307,406,270,406,70,-51,108,-51,358,463,320,463,70,-108,108,-108,84,-49,84,-75,105,-75,118,-77,130,-83,140,-92,146,-103,148,-117,146,-130,140,-142,130,-151,118,-157,105,-159,84,-159,84,-185,105,-185,127,-181,145,-172,160,-157,170,-138,173,-117,170,-95,160,-77,145,-62,127,-52,105,-49,285,-132,285,-36,246,-36,246,-94,105,-94,105,-36,66,-36,66,-132,233,-158,233,-36,117,-36,117,-158,16383,16383,205,-130,145,-130,145,-64,205,-64,280,-63,270,-56,261,-51,253,-47,245,-45,235,-44,223,-46,211,-49,199,-56,187,-67,175,-82,164,-67,153,-56,141,-49,129,-46,116,-44,108,-45,100,-47,91,-50,82,-56,70,-63,70,-98,82,-91,92,-87,101,-85,107,-84,111,-83,128,-86,141,-93,152,-103,160,-116,169,-131,183,-131,191,-115,200,-102,209,-92,220,-86,232,-83,238,-83,246,-84,267,-91,280,-98,241,481,223,501,175,454,128,501,108,481,155,434,111,388,129,369,175,414,222,367,240,388,195,434,212,580,187,572,167,561,153,546,144,529,141,509,143,491,149,471,162,445,167,432,171,423,173,415,173,407,172,398,168,390,162,383,152,376,138,370,138,349,166,359,187,370,201,385,209,402,212,423,211,433,210,442,207,452,202,464,195,480,189,493,184,503,182,511,180,517,180,524,181,534,185,542,191,549,200,555,212,560,350,615,350,649,0,649,0, -615,16383,16383,350,539,350,574,0,574,0,539,198,377,198,477,0,477,0,377,38,377,38,439,159,439,159,377,277,544,270,530,263,520,256,514,248,510,239,509,233,509,226,510,210,516,202,520,185,528,165,536,155,538,146,540,137,541,117,538,100,529,85,514,74,494,66,470,86,470,91,481,97,490,104,497,113,500,122,502,127,501,133,500,138,499,144,497,151,495,166,487,182,480,194,475,204,472,213,470,223,470,244,472,262,480,276,495,287,516,297,544,16383,16383,277,447,270,433,263,423,256,416,248,413,239,412,233,412,226,413,218,415,210,418,202,422,185,430,175,435,165,439,155,441,137,443,117,440,100,431,85,417,74,397,66,373,86,373,91,384,97,393,104,399,113,403,122,405,127,404,133,403,138,402,144,399,151,397,166,389,182,382,194,377,204,374,213,373,223,373,244,375,262,383,276,398,287,419,297,447,275,-109,274,-103,272,-97,268,-93,263,-89,258,-88,256,-88,254,-89,252,-89,250,-90,247,-91,239,-98,218,-119,204,-131,185,-144,187,-124,190,-105,195,-88,198,-74,200,-63,199,-58,196,-52,192,-48,187,-45,182,-44,176,-45,171,-48,167,-52,164,-58,163,-63,165,-74,168,-89,172,-105,176,-124,177,-144,162,-134,148,-122,135,-110,124,-99,114,-91,112,-90,109,-89,107,-89,105,-88,104,-88,98,-89,93,-93,89,-97,87,-103,86,-109,86,-113,90,-119,92,-121,95,-123,106,-128,121,-133,138,-138,156,-144,172,-151,156,-159,139,-165,122,-170,108,-174,98,-178,94,-181,91,-185,89,-189,88,-193,88,-202,90,-206,94,-209,99,-211,105,-212,110,-212,116,-210,118,-208,126,-202,137,-192,149,-180,162,-168,177,-158,176,-177,172,-196,168,-212,165,-226,163,-237,164,-242,167,-247,171,-252,176,-255,182,-256,187,-255,192,-252,196,-247,199,-242,200,-237,198,-226,195,-212,190,-196,187,-177,185,-158,205,-171,221,-186,233,-199,244,-209,255,-212,261,-211,267,-209,270,-205,273,-200,273,-191,272,-187,270,-184,267,-181,263,-178,254,-174,241,-171,225,-166,208,-160,189,-151,210,-141,228,-135,243,-131,255,-128,263,-124,268,-122,271,-119,275,-113,275,-109,522,-52,500,-82,455,-101,401,-113,348,-119,309,-120,269,-119,216,-113,162,-101,118,-82,95,-52,75,-52,93,-101,137,-133,196,-152,257,-160,309,-162,360,-160,422,-152,480,-133,525,-101,542,-52,571,433,562,417,546,408,527,403,506,400,481, -400,478,401,474,401,439,402,401,407,363,413,325,420,291,428,269,433,247,437,224,440,202,442,180,443,149,441,119,435,92,422,71,402,59,373,80,373,89,387,104,397,124,402,144,404,164,405,177,405,199,404,221,402,265,394,286,389,322,381,359,373,396,367,434,363,471,362,502,363,532,370,559,382,580,403,591,433,542,355,525,404,480,436,422,454,360,463,309,465,257,463,196,454,137,436,93,404,75,355,95,355,118,385,162,404,216,416,269,421,309,423,348,421,401,416,455,404,500,385,522,355,584,-111,566,-101,550,-89,534,-75,520,-60,506,-44,492,-58,511,-81,513,-83,514,-85,515,-86,515,-88,516,-90,515,-92,512,-95,508,-97,59,-97,59,-136,510,-136,514,-138,515,-140,515,-144,514,-145,514,-147,513,-149,511,-151,492,-175,505,-188,519,-173,534,-158,550,-144,566,-131,584,-122,134,282,132,294,126,305,118,313,107,319,95,321,83,319,72,314,63,306,58,295,56,282,58,270,64,259,72,251,83,246,95,244,107,246,118,251,126,259,132,270,134,282,16383,16383,75,-97,102,-82,124,-63,140,-40,150,-16,153,9,150,30,143,47,131,60,115,68,98,71,84,69,73,64,64,56,58,45,56,32,58,20,63,10,71,2,82,-1,97,-3,101,-3,109,-1,119,-1,122,-3,124,-5,125,-7,126,-10,123,-24,116,-39,105,-54,89,-69,68,-84,79,355,103,355,149,412,161,426,165,432,167,438,168,443,167,450,163,456,158,460,153,463,139,463,132,461,127,458,123,453,120,448,221,390,219,400,214,410,207,417,197,422,186,424,175,422,166,417,158,410,153,400,152,390,153,379,158,369,166,362,175,357,186,355,197,357,207,362,214,369,219,379,221,390,16383,16383,79,355,103,355,149,412,161,426,165,432,167,438,168,443,167,450,163,456,158,460,153,463,139,463,132,461,127,458,123,453,120,448,16383,16383,82,390,80,400,75,410,67,417,58,422,47,424,36,422,27,417,19,410,14,400,13,390,14,379,19,369,27,362,36,357,47,355,58,357,67,362,75,369,80,379,82,390,79,370,103,370,149,427,161,441,165,447,167,453,168,458,167,465,163,471,158,475,153,477,147,478,139,477,132,475,127,472,123,468,120,462,16383,16383,495,0,495,13,476,17,462,24,450,36,440,54,429,77,257,472,243,472,98,130,77,81,61,48,47,28,31, -18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364,44,365,37,364,31,362,25,358,21,353,18,348,16,316,13,316,0,16383,16383,313,180,152,180,232,373,134,282,132,294,127,305,119,313,108,319,96,321,83,319,73,314,64,306,59,295,57,282,59,270,65,259,73,251,84,246,96,244,108,246,119,251,127,259,132,270,134,282,516,118,496,118,477,80,453,53,420,37,374,28,309,26,282,26,262,29,249,35,241,44,239,59,239,229,345,229,375,227,396,222,409,210,418,191,423,161,440,161,440,325,423,325,418,297,409,277,396,265,375,259,345,258,239,258,239,412,240,423,242,430,246,434,253,436,263,437,349,435,405,429,438,416,454,395,463,363,480,363,477,463,106,463,106,450,133,447,150,441,161,430,166,411,167,385,167,80,166,52,161,34,151,23,133,17,106,13,106,0,484,0,16383,16383,5,370,30,370,76,427,82,434,87,441,91,447,94,453,95,458,93,465,90,471,85,475,79,477,73,478,65,477,59,475,54,472,50,468,47,462,585,0,585,13,559,17,541,23,530,35,524,52,523,77,523,384,524,411,530,429,541,440,559,447,585,450,585,463,389,463,389,450,416,447,434,441,445,430,450,411,452,384,452,252,239,252,239,384,241,411,246,429,258,441,276,447,302,450,302,463,105,463,105,450,133,447,151,441,161,429,167,411,168,384,168,85,167,55,162,35,151,23,133,16,105,13,105,0,301,0,300,13,274,16,256,23,246,35,240,53,239,79,239,220,452,220,452,87,450,57,446,37,435,24,417,17,390,13,390,0,16383,16383,5,370,30,370,76,427,82,434,87,441,91,447,94,453,95,458,93,465,90,471,85,475,79,477,73,478,65,477,59,475,54,472,50,468,47,462,5,370,30,370,76,427,82,434,87,441,91,447,94,453,95,458,93,465,90,471,85,475,79,477,73,478,65,477,59,475,54,472,50,468,47,462,16383,16383,314,0,314,13,285,16,265,22,253,33,247,52,245,78,245,386,247,413,253,431,265,442,284,448,314,450,314,463,106,463,106,450,136,447,156,442,167,431,173,413,174,386,174,78,173,51,167,32,155,21,136,16,106,13,106,0,481,232,471,310,440, -377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481,232,16383,16383,402,236,399,188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,16383,16383,5,370,30,370,76,427,82,434,87,441,91,447,94,453,95,458,93,465,90,471,85,475,79,477,73,478,65,477,59,475,54,472,50,468,47,462,573,461,563,465,545,469,537,469,528,470,485,462,443,441,405,406,376,361,357,305,355,305,341,364,317,411,285,445,244,465,195,472,175,470,154,465,135,457,116,447,101,435,106,424,115,427,126,431,138,434,149,436,158,437,198,429,233,404,262,360,285,295,301,206,301,86,299,55,294,34,282,23,262,16,230,13,230,0,445,0,445,13,415,16,394,22,381,32,375,50,373,77,373,213,382,286,407,351,446,403,494,438,550,451,555,451,559,450,564,449,568,449,573,448,16383,16383,5,370,30,370,76,427,82,434,87,441,91,447,94,453,95,458,93,465,90,471,85,475,79,477,73,478,65,477,59,475,54,472,50,468,47,462,501,0,501,118,483,118,480,99,475,85,467,75,455,68,440,66,332,66,333,92,385,112,427,140,458,176,477,222,484,278,474,338,445,392,399,435,337,463,260,473,183,462,120,432,75,388,46,335,37,278,43,222,61,177,91,140,133,112,185,92,187,66,81,66,65,68,53,73,44,83,39,98,37,120,20,120,20,0,221,0,215,113,181,130,154,159,134,196,121,238,117,280,123,329,140,375,169,413,209,438,260,448,311,440,351,417,380,382,398,335,404,280,399,235,386,193,366,156,339,128,305,112,305,113,300,0,16383,16383,5,370,30,370,76,427,82,434,87,441,91,447,94,453,95,458,93,465,90,471,85,475,79,477,73,478,65,477,59,475,54,472,50,468,47,462,221,390,219,400,214,410,207,417,197,422,186,424,175,422,166,417,158,410,153,400,152,390,153,379,158,369,166,362,175,357,186,355,197,357,207,362,214, -369,219,379,221,390,16383,16383,79,355,103,355,149,412,161,426,165,432,167,438,168,443,167,450,163,456,158,460,153,463,139,463,132,461,127,458,123,453,120,448,16383,16383,82,390,80,400,75,410,67,417,58,422,47,424,36,422,27,417,19,410,14,400,13,390,14,379,19,369,27,362,36,357,47,355,58,357,67,362,75,369,80,379,82,390,16383,16383,200,75,192,60,185,50,178,43,171,40,163,39,158,40,154,43,151,47,149,55,149,320,146,322,125,314,103,306,37,285,38,285,38,273,45,274,52,274,58,275,67,275,76,274,82,270,87,264,90,254,91,241,91,55,92,37,96,20,103,6,115,-3,131,-6,152,-1,170,10,186,28,200,49,211,70,495,0,495,13,476,17,462,24,450,36,440,54,429,77,257,472,243,472,98,130,77,81,61,48,47,28,31,18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364,44,365,37,364,31,362,25,358,21,353,18,348,16,316,13,316,0,16383,16383,313,180,152,180,232,373,295,245,328,254,355,268,375,287,387,313,391,347,384,387,362,420,325,443,273,458,208,463,12,463,12,450,41,447,60,442,72,431,77,413,79,385,79,79,77,52,71,33,59,22,40,16,12,13,12,0,248,0,304,5,350,21,385,47,407,82,415,124,409,162,393,193,368,216,335,233,295,244,16383,16383,151,256,151,424,153,430,156,434,161,437,167,438,226,434,269,423,298,405,314,378,320,343,315,312,300,287,275,270,240,260,195,256,16383,16383,151,228,196,228,240,226,278,217,308,199,327,169,334,125,327,83,308,54,277,37,239,28,194,26,177,27,165,30,157,36,152,45,151,57,404,346,401,463,9,463,9,450,36,447,53,440,64,429,68,412,70,386,70,87,68,56,63,35,52,23,35,16,8,13,8,0,205,0,205,13,177,16,159,22,147,33,142,51,141,79,141,420,144,428,148,433,156,436,166,437,288,437,325,434,352,425,370,408,381,382,387,346,473,0,257,472,243,472,34,0,16383,16383,367,64,95,64,232,373,418,118,398,118,379,80,355,53,322,37,276,28,212,26,184,26,164,29,151,35,143,44,141,59,141,229,246,229,277,227,298,222,311,210,320,191,326, -161,341,161,341,325,326,325,320,297,311,277,298,265,277,259,246,258,141,258,141,423,144,430,148,434,155,436,165,437,251,435,307,429,340,416,356,395,365,363,382,363,380,463,9,463,9,450,35,447,53,441,63,430,68,411,70,385,70,80,68,52,64,34,53,23,36,17,9,13,9,0,386,0,419,123,402,123,395,101,389,83,382,68,372,56,360,46,349,39,335,34,319,30,301,27,102,27,405,453,405,463,37,463,23,344,41,344,45,364,49,379,54,391,60,402,70,413,81,421,95,428,113,433,136,436,163,437,313,437,7,10,7,0,401,0,492,0,492,13,466,17,448,23,437,35,431,52,430,77,430,384,431,411,437,429,448,440,466,447,492,450,492,463,296,463,296,450,323,447,341,441,352,430,357,411,359,384,359,252,146,252,146,384,148,411,153,429,165,441,183,447,209,450,209,463,13,463,13,450,40,447,58,441,69,429,74,411,75,384,75,85,74,55,69,35,58,23,40,16,12,13,13,13,13,0,208,0,207,13,181,16,163,23,153,35,147,53,146,79,146,220,359,220,359,87,357,57,353,37,342,24,324,17,297,13,297,0,351,165,348,180,346,199,344,219,343,238,343,264,344,275,348,297,351,309,333,309,329,295,324,284,316,276,306,270,293,268,219,268,205,269,194,274,186,282,180,293,174,309,157,309,160,293,162,276,164,240,165,226,165,214,164,201,158,165,175,165,181,180,187,193,195,202,205,207,219,209,293,209,306,207,316,201,323,192,329,180,333,165,16383,16383,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481,232,16383,16383,402,236,399,188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,220,0,220,13,191,16,171,22,159,33,153,52,152,78,152,386,153,413,159,431,171,442,191,448,220,450,220,463,13,463,13,450,42,447,62,442,74,431,79,413,80,386,80,78,79, -51,73,32,62,21,42,16,12,13,13,13,13,0,506,0,506,13,488,15,471,22,451,35,427,57,397,90,233,269,363,394,389,417,409,433,428,442,448,447,473,450,473,463,291,463,291,450,309,449,320,448,329,445,334,441,337,435,338,427,335,417,328,405,317,391,301,376,283,359,158,244,158,384,159,411,163,429,174,440,192,447,221,450,221,463,23,463,23,450,51,447,70,440,80,429,85,411,87,384,87,88,85,57,80,36,69,23,51,16,23,13,23,0,220,0,220,13,194,16,176,22,165,33,159,50,158,77,158,207,177,222,246,150,277,117,304,89,324,64,338,45,342,30,341,25,338,21,332,17,324,15,313,14,294,13,294,0,481,0,481,13,462,17,448,24,436,36,426,54,415,77,250,472,236,472,98,130,78,81,62,48,47,28,31,18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,224,373,226,373,338,85,342,72,346,61,349,51,350,43,351,37,348,25,341,18,331,15,318,14,302,13,302,0,605,0,605,13,579,17,561,24,550,35,545,53,543,78,543,385,545,412,550,430,561,442,578,448,604,450,604,463,465,463,310,112,148,463,10,463,10,450,39,447,58,441,70,430,75,411,77,384,77,105,75,66,69,40,57,25,38,17,9,13,9,0,172,0,172,13,144,17,126,25,114,41,109,67,107,105,107,384,284,0,293,0,472,401,472,86,471,57,466,37,455,24,436,17,409,13,409,0,495,463,329,463,329,450,346,448,359,446,369,443,377,439,384,432,390,424,393,413,396,400,397,383,398,363,398,125,127,463,9,463,9,450,27,449,41,445,52,438,64,428,77,413,77,105,75,67,69,42,57,27,38,18,9,13,9,0,172,0,172,13,144,19,126,28,114,44,109,68,107,105,107,377,416,-7,428,-7,428,355,429,383,431,404,436,419,441,430,448,438,454,442,461,445,470,447,480,449,495,450,413,345,413,463,37,463,37,344,55,344,60,369,67,387,78,398,92,404,111,406,339,406,358,404,373,398,383,386,390,369,395,345,16383,16383,352,152,352,316,336,316,334,295,329,280,320,270,307,264,290,263,159,263,143,264,131,270,121,280,116,295,114,316,98,316,98,152,114,152,117,170,122,185,130,197,141, -204,158,206,288,206,305,204,318,198,328,187,334,172,336,152,16383,16383,430,0,430,120,413,120,410,97,402,80,389,69,371,62,348,59,98,59,78,62,61,68,49,80,40,97,38,120,20,120,20,0,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481,232,16383,16383,402,236,399,188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,492,0,492,13,466,17,448,23,437,35,431,52,430,77,430,384,431,411,437,429,448,440,466,447,492,450,492,463,13,463,13,450,40,447,58,441,69,429,74,411,75,384,75,85,74,55,69,35,58,23,40,16,12,13,13,13,13,0,208,0,207,13,181,16,163,23,153,35,147,53,146,79,146,414,147,424,150,430,155,434,162,436,172,437,333,437,344,436,351,433,356,429,358,422,359,412,359,87,357,57,353,37,342,24,324,17,297,13,297,0,11,463,11,450,37,447,54,441,64,430,69,412,70,386,70,85,69,55,65,35,55,23,38,16,11,13,11,0,207,0,207,13,179,16,160,22,148,33,143,51,141,78,141,204,152,203,161,202,190,202,230,203,263,206,291,214,316,226,340,245,354,259,365,276,373,294,378,315,380,336,378,356,374,375,367,392,357,407,345,420,323,434,298,446,267,456,232,461,192,463,16383,16383,141,413,142,422,144,429,148,434,155,437,166,438,217,434,255,423,282,403,298,373,303,333,298,298,283,269,259,248,226,234,184,230,168,230,160,231,151,231,141,232,420,143,404,143,396,115,386,93,370,78,349,69,320,66,104,66,270,257,121,437,266,437,300,435,327,427,348,412,363,387,372,351,389,351,389,463,21,463,21,453,208,227,21,10,21,0,401,0,415,345,410,463,17,463,12,345,30,345,39,383,52,409,71,425,98,432,136,434,178,434,178,86,177,55,172,35,160,23,141,16,112,13,112,0,316,0,316,13,288,16,268,22,256,33,251, -51,249,77,249,434,291,434,329,432,356,425,375,409,388,383,398,345,492,461,483,465,465,469,456,469,448,470,404,462,362,441,325,406,295,361,277,305,275,305,260,364,237,411,204,445,163,465,114,472,94,470,74,465,54,457,36,447,20,435,26,424,35,427,46,431,57,434,68,436,77,437,118,429,153,404,182,360,204,295,220,206,220,86,219,55,214,34,202,23,181,16,150,13,150,0,364,0,364,13,334,16,313,22,301,32,294,50,292,77,292,213,301,286,327,351,365,403,414,438,470,451,474,451,479,450,483,449,488,449,492,448,302,406,304,422,310,434,323,443,343,448,374,450,374,463,160,463,160,450,191,448,211,444,224,435,230,423,231,406,231,392,171,387,115,369,68,338,36,292,24,231,32,179,55,135,94,101,148,80,219,72,231,72,231,59,228,41,219,28,205,19,185,15,160,13,160,0,374,0,374,13,348,16,328,20,313,28,305,41,302,60,302,72,320,72,369,78,420,96,465,127,497,172,509,231,497,292,465,338,417,369,361,387,302,392,16383,16383,301,366,349,358,387,335,413,303,428,264,434,223,426,179,406,145,376,119,340,103,301,98,16383,16383,232,98,186,104,149,123,123,150,106,184,101,223,107,264,125,303,152,336,189,358,232,366,493,0,493,13,473,16,457,22,443,31,430,45,415,65,280,257,380,380,404,408,424,428,443,440,463,447,488,450,488,463,321,463,321,450,341,449,354,446,363,442,367,436,369,427,368,421,365,414,359,406,351,395,341,380,263,283,232,327,212,357,195,381,183,400,176,416,173,429,175,437,179,443,186,446,195,448,205,449,226,450,226,463,16,463,16,450,40,446,61,437,83,418,109,387,144,338,218,230,109,93,81,59,60,37,43,23,26,17,7,13,7,0,170,0,170,13,148,16,133,19,123,23,118,29,116,36,118,43,122,53,129,65,139,80,153,98,237,202,303,104,316,84,326,67,333,54,338,43,339,35,338,28,333,23,326,19,316,16,304,15,286,13,286,0,507,483,464,477,433,460,413,433,402,398,398,356,397,316,390,278,374,245,347,223,305,215,297,215,297,394,300,419,310,435,325,445,344,449,369,450,369,463,155,463,155,450,179,449,198,444,213,434,223,418,226,394,226,215,218,215,176,223,148,245,133,278,126,316,124, -356,121,398,110,433,89,460,58,477,16,483,16,470,30,462,39,448,45,431,48,413,48,384,47,372,46,359,46,346,45,334,55,279,82,238,122,210,171,194,226,189,226,87,224,56,218,35,206,23,185,16,155,13,155,0,369,0,369,13,341,15,321,20,307,31,299,49,297,77,297,189,351,194,400,210,440,238,467,279,477,334,476,346,476,359,475,372,474,384,474,397,475,413,478,431,484,448,493,462,507,470,501,0,501,118,483,118,480,99,475,85,467,75,455,68,440,66,332,66,333,92,385,112,427,140,458,176,477,222,484,278,474,338,445,392,399,435,337,463,260,473,183,462,120,432,75,388,46,335,37,278,43,222,61,177,91,140,133,112,185,92,187,66,81,66,65,68,53,73,44,83,39,98,37,120,20,120,20,0,221,0,215,113,181,130,154,159,134,196,121,238,117,280,123,329,140,375,169,413,209,438,260,448,311,440,351,417,380,382,398,335,404,280,399,235,386,193,366,156,339,128,305,112,305,113,300,0,221,576,219,587,214,597,207,604,197,609,186,611,175,609,166,604,158,597,153,587,152,577,153,565,158,556,165,549,174,544,185,542,197,544,207,549,214,556,219,565,221,576,16383,16383,82,576,80,587,75,597,67,604,58,609,47,611,36,609,27,604,19,597,14,587,13,577,14,565,19,556,26,549,35,544,46,542,57,544,67,549,75,556,80,565,82,576,16383,16383,220,0,220,13,191,16,171,22,159,33,153,52,152,78,152,386,153,413,159,431,171,442,191,448,220,450,220,463,13,463,13,450,42,447,62,442,74,431,79,413,80,386,80,78,79,51,73,32,62,21,42,16,12,13,13,13,13,0,360,576,358,587,353,597,346,604,337,609,326,611,315,609,305,604,298,597,293,587,291,577,293,565,298,556,305,549,314,544,325,542,336,544,346,549,353,556,358,565,360,576,16383,16383,221,576,219,587,214,597,207,604,197,609,186,611,175,609,166,604,158,597,153,587,152,577,153,565,158,556,165,549,174,544,185,542,197,544,207,549,214,556,219,565,221,576,16383,16383,492,461,483,465,465,469,456,469,448,470,404,462,362,441,325,406,295,361,277,305,275,305,260,364,237,411,204,445,163,465,114,472,94,470,74,465,54,457,36,447,20,435,26,424,35,427,46,431,57,434,68, -436,77,437,118,429,153,404,182,360,204,295,220,206,220,86,219,55,214,34,202,23,181,16,150,13,150,0,364,0,364,13,334,16,313,22,301,32,294,50,292,77,292,213,301,286,327,351,365,403,414,438,470,451,474,451,479,450,483,449,488,449,492,448,152,355,176,355,222,412,228,419,233,426,237,432,240,438,241,443,239,450,236,456,231,460,225,463,212,463,206,461,201,458,196,453,193,448,16383,16383,360,91,357,70,352,54,348,44,343,38,337,37,324,43,313,61,302,84,294,109,288,131,365,315,297,315,266,220,255,250,239,277,218,300,191,316,158,322,111,313,72,289,44,253,26,208,20,156,27,103,45,58,73,23,109,1,152,-6,181,-2,206,7,226,24,244,45,259,70,266,45,275,23,286,7,299,-2,315,-6,334,-1,350,12,361,33,368,60,370,91,16383,16383,232,145,226,117,217,83,202,49,183,23,158,13,126,26,105,60,92,106,85,153,84,191,88,234,98,265,114,286,133,298,154,302,181,291,201,262,216,223,226,182,232,145,107,355,131,355,177,412,189,426,193,432,195,438,196,443,195,450,191,456,186,460,181,463,167,463,161,461,156,458,148,448,16383,16383,275,102,254,76,232,55,209,40,183,31,154,28,132,31,113,38,96,51,85,69,80,91,85,114,98,131,116,143,136,149,155,152,163,151,169,150,174,149,180,148,186,148,198,149,208,152,214,156,218,160,220,166,219,170,216,174,210,177,203,180,184,180,170,176,162,175,151,174,129,177,113,186,101,199,94,215,91,234,94,255,103,273,117,288,135,298,157,302,178,301,195,297,208,292,215,284,218,273,218,270,216,262,215,257,215,250,216,240,221,232,228,226,236,222,245,220,255,222,264,225,272,231,277,239,279,250,272,278,254,299,228,312,199,320,170,322,121,317,84,303,56,283,39,258,34,230,36,213,43,197,54,183,69,172,88,165,65,158,46,145,31,128,21,107,17,85,19,65,29,41,51,18,90,0,151,-6,182,-2,211,8,239,28,264,56,285,95,118,355,141,355,188,412,194,419,199,426,203,432,205,438,206,443,205,450,202,456,197,460,191,463,178,463,171,461,166,458,162,453,159,448,16383,16383,316,-151,312,-142,309,-132,307,-120,306,-107,305,-91,305,223,302,255,292,282,275,303,252,317,223,322,203,320,184, -314,164,303,143,287,122,266,121,266,118,286,114,302,106,312,95,317,79,319,62,314,46,302,31,285,18,264,7,241,17,238,22,246,27,255,34,264,42,270,51,272,54,271,58,267,61,258,63,242,64,219,64,0,123,0,123,244,140,260,155,271,169,278,182,282,195,284,214,281,228,273,238,259,244,240,246,216,246,-90,247,-111,248,-126,251,-136,254,-144,257,-151,56,355,80,355,126,412,132,419,137,426,141,432,144,438,145,443,143,450,140,456,135,460,130,463,116,463,110,461,105,458,101,453,98,448,16383,16383,177,75,168,60,161,50,154,43,147,40,139,39,134,40,130,43,127,47,125,51,125,320,123,322,79,306,58,299,14,285,14,273,22,274,28,274,34,275,44,275,52,274,58,270,63,264,65,254,66,241,66,55,68,37,72,20,79,6,91,-3,108,-6,129,-1,147,10,163,28,176,49,187,70,283,390,281,400,276,410,268,417,259,422,248,424,237,422,228,417,220,410,215,400,213,390,215,379,220,369,228,362,237,357,248,355,259,357,268,362,276,369,281,379,283,390,16383,16383,141,355,165,355,211,412,217,419,222,426,226,432,229,438,230,443,228,450,225,456,220,460,214,463,201,463,194,461,189,458,185,453,182,448,16383,16383,144,390,142,400,137,410,129,417,119,422,109,424,98,422,89,417,81,410,76,400,74,390,76,379,81,369,89,362,98,357,109,355,119,357,129,362,137,369,142,379,144,390,16383,16383,178,322,178,308,194,305,209,300,223,292,236,281,248,267,261,246,271,222,278,197,282,171,283,146,280,105,271,69,254,39,231,20,198,13,169,20,149,40,136,66,129,95,127,122,127,270,126,287,120,301,111,311,99,317,84,319,66,314,50,302,36,285,23,264,11,241,21,238,26,246,32,255,39,264,46,270,55,272,61,269,65,262,67,251,68,238,69,223,69,138,72,93,84,53,106,21,142,1,195,-6,243,1,285,25,317,60,339,106,346,158,338,217,316,263,283,296,243,315,198,322,360,91,357,70,352,54,348,44,343,38,337,37,324,43,313,61,302,84,294,109,288,131,365,315,297,315,266,220,255,250,239,277,218,300,191,316,158,322,111,313,72,289,44,253,26,208,20,156,27,103,45,58,73,23,109,1,152,-6,181,-2,206,7,226,24,244,45,259,70,266,45,275, -23,286,7,299,-2,315,-6,334,-1,350,12,361,33,368,60,370,91,16383,16383,232,145,226,117,217,83,202,49,183,23,158,13,126,26,105,60,92,106,85,153,84,191,88,234,98,265,114,286,133,298,154,302,181,291,201,262,216,223,226,182,232,145,241,280,254,286,265,293,275,302,282,311,288,321,296,341,298,351,299,360,299,370,293,405,276,435,250,458,220,473,187,478,143,472,106,450,76,411,57,349,50,261,50,-94,49,-107,48,-119,45,-131,42,-141,38,-151,98,-151,100,-144,103,-134,106,-122,108,-109,109,-94,109,22,123,10,137,2,151,-3,166,-5,184,-6,230,2,269,27,300,64,320,109,327,159,323,192,313,221,296,247,272,267,242,279,16383,16383,109,340,109,350,111,386,119,416,133,439,151,454,174,459,202,451,222,433,234,406,240,376,242,345,241,330,238,314,232,301,224,292,213,289,206,290,198,291,190,293,183,294,177,295,166,294,157,291,152,288,149,284,148,280,149,274,153,269,158,265,166,263,175,262,182,262,188,263,193,265,199,266,207,266,221,262,237,250,251,226,262,191,266,141,262,101,251,66,233,39,210,22,181,16,160,18,140,26,124,37,113,50,109,63,311,315,241,315,168,68,161,117,151,183,135,248,109,299,68,320,45,313,28,297,16,272,9,242,7,209,17,209,22,232,30,249,39,262,49,269,58,271,92,251,117,200,134,134,144,71,149,25,134,-11,130,-23,126,-36,121,-51,118,-66,115,-80,114,-93,113,-104,115,-119,119,-132,125,-142,135,-149,148,-151,166,-148,178,-137,186,-122,190,-103,191,-82,190,-63,186,-27,183,-12,180,0,155,298,108,285,70,261,43,230,26,192,20,152,27,104,47,61,79,26,121,2,172,-6,225,1,269,24,302,60,322,107,329,162,325,197,315,229,298,258,275,282,247,303,203,327,159,347,122,365,95,384,85,406,90,423,101,435,117,443,133,447,148,448,191,443,216,430,232,414,246,401,267,395,277,397,284,403,289,410,291,418,292,426,284,445,263,460,235,470,203,476,173,478,143,476,113,468,86,454,66,433,59,405,63,376,75,352,95,331,122,314,155,298,16383,16383,266,145,262,100,252,63,235,35,211,18,182,13,169,14,156,19,142,26,130,36,120,48,106,72,96,98,89,124,85,148,84,169,87,201,99,231,118,256,144,273,178,280,209, -265,233,240,251,209,262,176,266,145,275,102,254,76,232,55,209,40,183,31,154,28,132,31,113,38,96,51,85,69,80,91,85,114,98,131,116,143,136,149,155,152,163,151,169,150,174,149,180,148,186,148,198,149,208,152,214,156,218,160,220,166,219,170,216,174,210,177,203,180,184,180,170,176,162,175,151,174,129,177,113,186,101,199,94,215,91,234,94,255,103,273,117,288,135,298,157,302,178,301,195,297,208,292,215,284,218,273,218,270,216,262,215,257,215,250,216,240,221,232,228,226,236,222,245,220,255,222,264,225,272,231,277,239,279,250,272,278,254,299,228,312,199,320,170,322,121,317,84,303,56,283,39,258,34,230,36,213,43,197,54,183,69,172,88,165,65,158,46,145,31,128,21,107,17,85,19,65,29,41,51,18,90,0,151,-6,182,-2,211,8,239,28,264,56,285,95,107,478,82,469,63,458,49,445,41,431,38,415,42,396,53,381,67,371,84,365,100,363,101,360,72,316,51,274,36,232,27,189,24,140,30,81,46,40,69,12,99,-2,133,-6,147,-5,163,-4,179,-2,192,0,200,0,221,-2,238,-8,252,-18,260,-31,263,-47,260,-66,251,-82,238,-94,223,-101,206,-104,196,-102,187,-97,179,-91,172,-85,164,-83,153,-85,145,-89,139,-95,136,-103,134,-112,137,-127,144,-138,155,-145,169,-150,185,-151,211,-146,238,-131,262,-107,279,-77,285,-41,281,-4,269,22,248,42,219,53,180,57,158,57,152,56,145,56,110,62,85,77,68,101,60,130,57,164,62,212,74,257,91,298,111,333,132,360,167,367,199,380,225,397,243,416,250,435,249,443,246,450,240,455,232,458,223,459,199,454,175,441,151,423,132,402,117,382,103,384,91,387,80,393,73,403,70,417,72,427,77,437,86,448,98,459,113,468,316,-151,312,-142,309,-132,307,-120,306,-107,305,-91,305,223,302,255,292,282,275,303,252,317,223,322,203,320,184,314,164,303,143,287,122,266,121,266,118,286,114,302,106,312,95,317,79,319,62,314,46,302,31,285,18,264,7,241,17,238,22,246,27,255,34,264,42,270,51,272,54,271,58,267,61,258,63,242,64,219,64,0,123,0,123,244,140,260,155,271,169,278,182,282,195,284,214,281,228,273,238,259,244,240,246,216,246,-90,247,-111,248,-126,251,-136,254,-144,257,-151,327, -233,326,278,323,319,316,355,307,387,295,414,278,438,259,456,236,468,209,476,177,478,121,467,77,434,45,383,25,317,19,238,19,201,22,169,26,140,32,114,40,90,56,57,77,30,103,10,134,-2,170,-6,226,5,269,37,301,88,321,154,327,233,16383,16383,82,248,82,270,86,346,98,400,116,434,139,453,166,459,210,445,239,409,255,359,263,302,265,248,16383,16383,265,221,262,152,252,94,235,50,211,22,179,13,137,25,110,59,93,107,85,165,82,226,265,226,177,75,168,60,161,50,154,43,147,40,139,39,134,40,130,43,127,47,125,51,125,320,123,322,79,306,58,299,14,285,14,273,22,274,28,274,34,275,44,275,52,274,58,270,63,264,65,254,66,241,66,55,68,37,72,20,79,6,91,-3,108,-6,129,-1,147,10,163,28,176,49,187,70,352,0,352,10,335,13,320,19,306,27,293,38,279,54,158,195,184,221,206,240,225,253,244,260,263,262,272,261,299,255,308,254,317,255,327,258,335,265,341,275,343,288,341,299,336,308,328,315,316,320,302,322,283,320,258,310,224,287,178,246,116,180,116,320,113,322,98,317,83,313,67,308,48,303,26,297,5,291,5,280,10,280,15,281,27,281,39,280,48,276,53,268,56,256,57,239,57,0,116,0,116,159,208,48,211,42,217,34,218,31,219,27,218,22,214,17,209,13,202,11,192,10,186,10,186,0,334,96,329,75,320,59,310,49,301,43,292,41,281,44,270,53,261,65,253,81,247,99,169,373,158,409,146,438,132,460,116,473,95,478,72,472,55,455,44,431,39,403,37,375,48,375,53,398,60,414,68,423,79,428,90,429,103,425,116,414,129,396,140,374,150,347,159,315,9,0,78,0,179,248,230,63,237,40,246,21,257,6,271,-3,286,-7,306,-2,323,12,334,34,342,62,345,96,351,74,342,59,335,49,328,43,321,40,314,39,310,40,306,44,303,51,301,62,300,79,300,315,241,315,241,83,239,74,236,67,232,61,226,55,214,47,202,41,190,37,179,34,169,34,151,36,135,44,121,57,112,75,109,97,109,315,50,315,50,-91,48,-119,45,-131,42,-141,38,-151,96,-151,99,-143,102,-132,105,-120,106,-106,107,-90,107,13,109,13,114,5,122,0,131,-3,141,-5,152,-6,166,-5,183,0,201,10,221,26,240, -50,241,50,243,32,247,16,255,4,268,-3,284,-6,304,-1,322,10,337,28,350,49,361,70,297,322,288,263,265,198,228,136,181,88,126,63,125,63,125,320,123,322,79,306,58,299,14,285,14,273,21,274,28,274,34,275,44,275,52,274,58,269,63,263,65,253,66,241,66,-9,83,-9,139,10,188,39,228,76,260,118,284,163,297,198,304,232,308,265,310,295,310,322,124,478,99,470,80,459,67,447,60,432,57,416,59,401,65,389,74,381,85,375,97,373,88,363,81,352,76,339,73,327,72,314,73,301,77,289,83,277,91,266,102,258,76,236,55,210,38,181,28,148,24,114,28,74,40,41,62,15,94,0,138,-6,150,-5,164,-4,179,-2,192,0,200,0,221,-2,238,-8,252,-18,260,-31,263,-47,260,-67,251,-82,238,-94,223,-101,206,-104,196,-102,187,-97,179,-91,172,-85,164,-83,153,-85,145,-89,139,-95,136,-103,134,-112,137,-127,144,-138,155,-145,169,-150,185,-151,212,-146,239,-131,262,-107,279,-75,285,-37,281,-5,269,21,248,41,219,53,180,57,155,57,146,56,138,56,110,59,88,67,71,83,60,106,56,137,60,165,70,191,86,212,107,230,132,244,143,241,154,240,164,238,199,238,220,242,239,249,254,260,259,276,257,286,251,293,241,299,229,303,214,304,196,303,178,298,159,292,141,283,124,271,116,278,109,286,104,295,101,305,100,315,102,328,107,341,117,351,131,358,148,361,176,363,202,370,224,380,239,393,245,407,243,415,240,422,233,427,224,430,212,430,194,429,175,424,155,416,135,406,116,394,106,396,98,401,93,408,89,416,88,427,89,434,93,443,100,451,112,459,130,467,331,159,325,211,306,256,275,291,233,314,181,322,128,312,84,284,52,243,31,194,24,141,32,94,54,53,87,21,129,0,177,-6,225,2,267,28,301,66,323,111,331,159,16383,16383,269,134,266,104,257,72,241,44,218,23,188,16,150,26,121,53,102,91,90,132,87,171,89,203,97,237,113,268,135,290,167,299,207,288,235,258,255,218,265,174,269,134,327,96,320,76,312,63,303,55,293,52,284,51,272,53,264,58,257,66,252,75,249,85,247,97,246,110,246,124,245,138,245,152,247,202,249,223,250,242,252,256,335,256,335,315,135,315,96,311,65,299,41,280,22,252,6,216,17,216,32,234,49, -246,66,253,86,256,109,256,101,166,90,108,75,75,59,58,42,51,32,47,29,43,27,40,26,35,28,21,33,8,42,0,55,-7,73,-9,108,12,128,68,137,139,140,208,141,256,205,256,203,225,200,190,197,153,195,115,195,78,197,52,206,29,219,10,237,-2,259,-6,286,0,308,16,324,40,334,68,338,96,50,-91,48,-119,45,-131,42,-141,38,-151,98,-151,101,-143,104,-133,106,-120,108,-106,109,-90,109,21,123,9,137,1,151,-3,165,-5,182,-6,229,2,269,27,300,66,320,115,327,173,319,221,299,263,268,294,228,315,181,322,141,316,105,294,76,255,57,193,50,106,16383,16383,109,191,111,229,119,259,132,283,150,297,173,302,202,296,228,276,248,245,261,202,266,148,262,105,251,68,233,40,210,22,181,16,161,18,141,26,125,36,113,49,109,62,302,246,298,268,286,289,266,306,237,318,198,322,149,312,102,283,62,239,35,182,24,116,30,64,46,28,70,6,99,-3,133,-6,147,-5,163,-4,179,-2,192,0,200,0,221,-2,238,-8,252,-18,260,-31,263,-47,260,-66,251,-82,238,-94,223,-101,206,-104,196,-102,187,-97,179,-91,172,-85,164,-83,153,-85,145,-89,139,-95,136,-103,134,-112,137,-127,144,-138,155,-145,169,-150,185,-151,211,-146,238,-131,262,-107,279,-77,285,-41,281,-4,269,22,248,42,219,53,180,57,161,57,155,56,145,56,109,63,84,76,68,95,59,119,57,148,64,189,81,221,106,243,135,256,166,260,198,255,221,243,239,229,253,217,269,212,282,214,291,220,297,228,301,237,302,246,363,256,363,315,167,315,122,309,82,290,50,257,28,211,20,151,28,103,49,59,81,25,121,1,167,-6,218,1,262,22,296,53,319,90,327,131,321,169,305,194,284,212,261,231,239,256,16383,16383,264,120,261,88,251,59,235,35,213,19,183,13,154,21,127,43,104,76,89,117,84,164,91,204,110,230,136,246,165,254,191,256,214,241,234,217,250,187,260,154,264,120,309,256,309,315,113,315,77,307,47,285,25,256,10,224,2,193,13,193,22,214,35,232,51,245,70,253,92,256,150,256,143,230,135,199,128,166,124,132,122,99,124,68,131,39,144,15,165,0,194,-6,219,0,241,15,257,38,267,68,270,100,259,100,254,83,246,69,236,59,225,53,212,51,197,55,186,66,179,83,175, -103,174,127,176,158,179,189,183,217,187,241,191,256,178,322,178,308,194,305,209,300,223,292,236,281,248,267,261,246,271,222,278,197,282,171,283,146,280,105,271,69,254,39,231,20,198,13,169,20,149,40,136,66,129,95,127,122,127,270,126,287,120,301,111,311,99,317,84,319,66,314,50,302,36,285,23,264,11,241,21,238,26,246,32,255,39,264,46,270,55,272,61,269,65,262,67,251,68,238,69,223,69,138,72,93,84,53,106,21,142,1,195,-6,243,1,285,25,317,60,339,106,346,158,338,217,316,263,283,296,243,315,198,322,188,13,174,14,159,18,145,25,132,35,120,48,106,73,96,101,89,132,85,163,84,191,88,232,102,264,124,288,153,303,188,309,188,320,185,320,177,322,170,322,118,313,76,289,46,254,27,210,20,160,27,109,46,64,77,28,119,4,172,-5,188,-6,188,-151,247,-151,247,-6,308,2,355,25,388,61,408,105,415,155,408,211,389,257,361,292,327,314,290,322,273,320,258,316,245,309,233,301,223,291,207,261,197,227,191,188,189,147,188,107,16383,16383,247,13,247,217,249,251,254,278,265,296,282,302,306,292,325,266,340,229,349,187,352,145,349,104,340,68,324,39,300,20,268,13,340,315,272,315,172,130,158,195,144,248,129,288,111,313,88,322,68,317,54,304,44,283,38,255,37,219,48,219,52,240,58,255,65,265,72,271,78,273,94,269,107,256,120,235,131,205,141,166,155,109,8,-147,77,-147,176,37,191,-47,198,-81,207,-110,220,-132,236,-147,255,-153,277,-145,292,-126,302,-100,307,-73,309,-48,298,-48,295,-70,289,-85,281,-96,272,-102,262,-104,263,-104,248,-100,235,-88,224,-68,215,-38,205,2,193,57,479,320,472,321,465,321,458,322,442,322,406,314,382,292,366,262,358,226,356,190,355,144,349,96,335,54,312,24,276,13,276,315,217,315,217,13,181,24,157,54,144,97,138,145,137,192,134,229,126,264,110,294,85,314,51,322,43,322,35,321,27,321,20,320,14,320,14,309,42,295,59,266,69,229,73,191,73,160,78,101,92,54,118,20,159,0,217,-6,217,-151,276,-151,276,-6,331,0,372,22,399,57,415,103,420,160,420,192,424,229,434,266,451,295,479,309,252,312,288,305,316,284,337,250,349,204,353,145,352,107,348,71,338,41,321, -20,295,13,280,16,266,28,253,46,244,71,237,102,238,102,242,119,248,147,250,177,248,203,243,222,236,235,228,242,219,245,209,242,200,235,193,222,188,202,187,176,187,159,191,131,195,118,199,102,193,71,184,46,172,27,158,16,140,13,115,21,99,43,89,75,85,113,84,152,88,208,102,253,124,285,151,305,184,312,184,322,132,315,87,295,52,261,29,211,20,146,22,118,25,92,32,69,41,49,54,32,68,18,83,7,98,0,114,-4,130,-6,153,-3,173,4,190,17,206,36,219,60,230,36,245,17,262,4,282,-3,305,-6,322,-4,339,0,354,7,369,18,383,32,395,49,404,69,411,92,415,118,416,148,408,213,386,262,351,296,305,316,252,322,221,401,219,412,214,421,207,428,197,433,186,435,175,433,166,429,158,421,153,412,152,401,153,390,158,380,165,373,174,368,185,366,197,368,207,373,214,380,219,390,221,401,16383,16383,82,401,80,412,75,421,67,428,58,433,47,435,36,433,27,429,19,421,14,412,13,401,14,390,19,380,26,373,35,368,46,366,57,368,67,373,75,380,80,390,82,401,16383,16383,193,75,185,60,178,50,171,43,165,40,156,39,151,40,147,43,144,47,142,55,142,320,139,322,117,314,96,306,30,285,30,273,38,274,45,274,51,275,60,275,69,274,75,270,80,264,83,254,84,241,84,55,85,37,89,20,96,6,108,-3,124,-6,145,-1,163,10,179,28,193,49,204,70,283,401,281,412,276,421,268,428,259,433,248,435,237,433,227,429,220,421,215,412,213,401,215,390,220,380,227,373,236,368,247,366,258,368,268,373,276,380,281,390,283,401,16383,16383,144,401,142,412,137,421,129,428,119,433,109,435,98,433,88,429,81,421,76,412,74,401,76,390,81,380,88,373,97,368,108,366,119,368,129,373,137,380,142,390,144,401,16383,16383,178,322,178,308,194,305,209,300,223,292,236,281,248,267,261,246,271,222,278,197,282,171,283,146,280,105,271,69,254,39,231,20,198,13,169,20,149,40,136,66,129,95,127,122,127,270,126,287,120,301,111,311,99,317,84,319,66,314,50,302,36,285,23,264,11,241,21,238,26,246,32,255,39,264,46,270,55,272,61,269,65,262,67,251,68,238,69,223,69,138,72,93,84,53,106,21,142,1,195,-6,243,1,285, -25,317,60,339,106,346,158,338,217,316,263,283,296,243,315,198,322,134,355,158,355,204,412,210,419,215,426,219,432,222,438,223,443,221,450,218,456,213,460,207,463,194,463,187,461,182,458,178,453,175,448,16383,16383,331,159,325,211,306,256,275,291,233,314,181,322,128,312,84,284,52,243,31,194,24,141,32,94,54,53,87,21,129,0,177,-6,225,2,267,28,301,66,323,111,331,159,16383,16383,269,134,266,104,257,72,241,44,218,23,188,16,150,26,121,53,102,91,90,132,87,171,89,203,97,237,113,268,135,290,167,299,207,288,235,258,255,218,265,174,269,134,134,355,158,355,205,412,211,419,216,426,220,432,223,438,223,443,222,450,219,456,214,460,208,463,194,463,188,461,183,458,179,453,176,448,16383,16383,178,322,178,308,194,305,209,300,223,292,236,281,248,267,261,246,271,222,278,197,282,171,283,146,280,105,271,69,254,39,231,20,198,13,169,20,149,40,136,66,129,95,127,122,127,270,126,287,120,301,111,311,99,317,84,319,66,314,50,302,36,285,23,264,11,241,21,238,26,246,32,255,39,264,46,270,55,272,61,269,65,262,67,251,68,238,69,223,69,138,72,93,84,53,106,21,142,1,195,-6,243,1,285,25,317,60,339,106,346,158,338,217,316,263,283,296,243,315,198,322,173,355,197,355,243,412,249,419,254,426,258,432,261,438,262,443,260,450,257,456,252,460,246,463,233,463,226,461,221,458,217,453,214,448,16383,16383,252,312,288,305,316,284,337,250,349,204,353,145,352,107,348,71,338,41,321,20,295,13,280,16,266,28,253,46,244,71,237,102,238,102,242,119,248,147,250,177,248,203,243,222,236,235,228,242,219,245,209,242,200,235,193,222,188,202,187,176,187,159,191,131,195,118,199,102,193,71,184,46,172,27,158,16,140,13,115,21,99,43,89,75,85,113,84,152,88,208,102,253,124,285,151,305,184,312,184,322,132,315,87,295,52,261,29,211,20,146,22,118,25,92,32,69,41,49,54,32,68,18,83,7,98,0,114,-4,130,-6,153,-3,173,4,190,17,206,36,219,60,230,36,245,17,262,4,282,-3,305,-6,322,-4,339,0,354,7,369,18,383,32,395,49,404,69,411,92,415,118,416,148,408,213,386,262,351,296,305,316,252,322,288, -427,283,451,272,468,256,478,235,484,212,485,198,483,183,478,167,471,153,463,141,455,98,410,68,357,49,298,40,237,38,174,41,127,52,78,74,35,108,5,155,-6,198,1,232,24,258,58,273,98,279,140,275,175,263,210,243,240,216,262,180,270,146,264,116,249,91,227,69,201,51,172,54,209,63,245,76,280,92,314,111,346,120,345,129,345,138,344,157,344,191,346,226,354,257,370,279,393,287,427,16383,16383,116,355,132,383,153,415,178,443,206,464,238,472,245,471,251,467,257,462,260,455,262,448,257,432,246,413,231,394,215,378,201,368,189,363,165,357,152,355,140,355,16383,16383,250,191,243,153,223,108,194,63,161,30,127,16,109,20,96,29,87,43,82,59,80,76,88,112,107,156,135,199,168,232,201,245,217,242,231,234,241,222,248,207,250,191,380,203,369,204,333,207,323,209,320,246,316,284,308,322,297,359,282,394,267,420,250,443,228,461,202,474,169,478,140,474,112,463,88,442,71,411,64,370,74,316,103,271,146,235,199,208,259,192,260,186,260,162,258,119,252,78,240,45,220,21,191,13,161,20,141,39,128,65,121,93,120,118,120,154,118,183,114,203,106,216,94,222,77,224,60,221,44,212,28,196,13,174,0,147,10,141,20,160,28,172,35,180,41,183,47,184,51,183,55,180,58,173,60,162,61,145,61,130,65,86,77,48,100,19,136,0,187,-6,241,5,280,36,304,81,317,133,322,188,346,188,358,189,370,191,380,192,16383,16383,259,226,198,255,157,291,133,328,121,363,118,391,121,413,128,430,139,442,152,450,167,452,188,448,209,434,227,404,242,354,253,280,253,277,254,270,256,258,257,243,259,226,277,291,261,357,237,408,204,444,163,465,114,472,94,470,74,465,54,457,36,447,20,435,26,424,35,427,46,431,57,434,68,436,77,437,118,429,153,404,182,360,204,295,220,206,220,86,219,55,214,34,202,23,181,16,150,13,150,0,364,0,364,13,334,16,313,22,301,32,294,50,292,77,292,176,296,234,308,307,331,379,366,433,415,455,419,454,423,454,428,452,431,450,432,446,429,441,422,434,414,425,408,414,405,399,407,386,412,376,421,367,432,362,445,360,460,363,473,371,481,383,487,397,488,413,485,432,475,449,461,462,443,470,424,473,375,462,337, -431,309,388,290,339,279,291,247,478,188,478,188,322,177,322,120,313,77,289,45,253,27,208,20,159,27,111,46,65,77,28,119,2,172,-6,188,-6,188,-151,247,-151,247,-6,313,3,360,29,392,68,409,114,415,162,411,200,400,235,381,266,355,292,323,311,295,319,280,321,264,322,247,322,16383,16383,246,13,246,302,285,294,315,270,336,235,348,191,352,143,349,102,340,67,323,38,300,19,268,13,16383,16383,189,13,174,14,160,18,145,25,132,35,121,48,107,71,97,98,89,127,85,159,84,192,87,229,98,260,115,283,138,297,168,302,189,302,508,256,508,315,108,315,74,307,46,286,26,257,11,224,4,192,15,192,25,212,37,230,51,244,67,253,86,256,117,256,106,237,97,215,90,191,86,167,84,145,90,89,106,47,129,17,157,0,188,-6,215,-3,237,4,255,17,270,36,282,60,294,35,309,16,327,3,346,-4,366,-6,401,0,432,17,458,47,474,89,480,143,479,166,476,190,470,214,461,237,448,256,16383,16383,391,256,400,239,407,217,413,193,416,168,417,145,416,107,411,71,401,41,385,20,361,13,345,16,330,28,317,46,307,72,301,103,305,114,308,127,311,139,313,150,313,161,312,177,309,193,304,208,295,219,283,223,270,219,261,209,255,195,252,178,251,162,251,150,253,138,256,126,260,114,263,103,256,71,246,46,234,27,218,16,200,13,176,21,161,42,152,73,148,106,147,139,148,166,152,191,157,215,165,237,175,256,217,-65,216,-96,211,-116,200,-128,181,-134,152,-137,152,-151,355,-151,355,-137,327,-135,307,-129,296,-118,290,-100,288,-73,288,-6,352,11,406,46,446,95,472,158,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,32,159,58,96,99,46,152,11,217,-6,16383,16383,402,236,399,188,392,144,381,107,364,75,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,73,126,105,114,142,106,185,104,232,106,272,112,311,122,346,135,376,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,360,391,378,360,391,324,399,282,402,236,145,-151,204,-151,204,-3,246,10,281,36,307,70,323,113,329,162,321,216,300,260,268,293,227,315,178,322,125,314,82,293,49, -259,28,214,20,159,26,110,43,68,70,34,104,10,145,-3,16383,16383,266,143,262,98,252,62,235,35,212,18,184,13,169,14,155,18,142,25,130,35,120,48,107,72,96,98,89,128,85,159,84,191,87,230,98,260,115,283,138,297,165,302,182,301,196,296,209,289,221,279,231,267,243,248,253,225,260,199,264,171,266,143,159,-101,181,-121,205,-135,229,-144,254,-150,277,-151,326,-146,369,-128,403,-100,427,-61,435,-12,431,21,419,50,400,74,374,93,342,108,272,124,200,134,135,150,89,184,71,248,83,308,114,359,160,398,217,424,280,433,318,427,339,413,352,396,364,382,384,377,400,379,411,385,419,393,423,403,424,414,418,439,400,456,374,466,343,472,308,473,229,461,151,425,84,370,37,298,20,214,30,148,58,103,99,74,150,59,205,51,250,46,297,38,339,23,369,0,380,-34,379,-51,374,-66,367,-80,358,-91,347,-101,334,-109,320,-115,305,-118,289,-120,273,-121,252,-119,230,-115,210,-107,191,-97,174,-83,295,343,276,308,249,281,218,262,188,249,165,241,120,225,81,203,51,175,31,139,24,95,30,55,46,26,70,7,99,-3,133,-6,147,-5,163,-4,179,-2,192,0,200,0,221,-2,238,-8,252,-18,260,-31,263,-47,260,-66,251,-82,238,-94,223,-101,206,-104,196,-102,187,-97,179,-91,172,-85,164,-83,153,-85,145,-89,139,-95,136,-103,134,-112,137,-127,144,-138,155,-145,169,-150,185,-151,211,-146,238,-131,262,-107,279,-77,285,-41,281,-4,269,22,248,42,219,53,180,57,168,56,153,53,137,50,122,47,111,46,92,49,77,58,66,71,59,87,57,105,58,118,62,131,69,143,79,153,92,163,106,168,138,176,172,180,221,189,259,209,285,240,300,284,305,343,382,363,379,463,9,463,9,450,36,447,53,440,64,429,68,412,70,386,70,86,68,55,63,35,52,23,35,16,8,13,8,0,205,0,205,13,177,16,159,22,148,33,142,51,141,78,141,229,314,229,314,258,141,258,141,421,143,428,148,433,155,436,165,437,257,437,300,435,328,429,346,416,358,395,365,363,305,273,305,315,56,315,56,-132,112,-132,112,63,270,63,270,91,112,91,112,273,474,380,466,389,93,255,198,396,218,425,232,448,241,467,245,483,246,497,244,514,236,531,222,545,203,554,177,558,157,556,139,550,120,540,101,526,80, -508,89,497,104,507,116,514,128,518,140,520,152,521,162,519,170,513,175,505,177,496,178,487,177,479,175,470,171,459,168,451,165,445,9,168,18,159,391,293,287,152,266,123,252,100,244,81,239,65,238,51,241,34,249,17,262,3,282,-6,308,-9,327,-7,346,-1,364,8,384,22,404,41,395,51,381,41,368,34,356,30,345,28,333,27,322,29,314,35,310,43,307,52,306,62,307,69,313,89,317,98,320,104,319,261,133,261,261,463,191,463,45,202,230,202,102,0,172,0,28,355,50,373,73,389,97,402,121,412,145,420,145,225,176,225,176,427,182,428,189,429,195,429,202,430,208,430,253,425,298,410,339,387,376,356,407,318,335,284,279,224,241,149,218,71,210,0,281,0,285,67,299,140,324,209,364,264,421,292,436,260,448,226,457,190,463,152,465,112,456,49,432,-10,396,-63,350,-104,297,-127,297,-151,372,-128,438,-81,490,-17,524,60,537,145,521,259,477,351,413,418,334,459,248,473,195,470,145,459,97,439,52,410,8,370,-3,380,41,358,84,330,124,297,162,260,196,219,77,151,89,131,209,200,219,186,223,179,228,172,232,165,240,149,244,142,248,134,252,127,131,58,142,38,261,107,277,67,290,29,298,-8,303,-45,305,-82,304,-94,304,-107,302,-133,300,-146,323,-151,330,-123,335,-95,338,-68,340,-41,341,-15,338,30,332,74,321,116,305,157,286,196,253,241,207,287,149,331,80,369,4,401,360,315,288,315,155,146,154,146,156,159,162,193,163,210,164,224,161,256,151,283,135,303,115,317,89,322,74,320,61,315,49,306,41,294,38,277,40,270,44,263,49,258,56,254,64,252,76,254,84,258,93,267,99,269,114,266,125,257,133,244,138,227,140,208,139,190,135,150,131,132,127,119,30,0,102,0,238,169,239,169,235,155,232,140,230,123,228,107,227,91,230,64,238,38,252,15,272,0,299,-6,316,-5,330,0,342,7,350,20,352,37,351,45,347,52,342,57,334,60,326,62,314,60,307,56,302,52,298,48,292,46,279,48,268,56,259,70,254,90,252,119,252,137,254,155,257,171,260,185,264,198,298,-150,300,-144,301,-137,303,-131,304,-125,304,-121,283,-76,232,-56,167,-42,105,-11,62,55,63,56,77,34,96,16,120,3,149,-3,183,-6,232,2,273,26,303,61,322,105,329, -154,322,210,303,257,273,292,232,314,181,322,117,309,71,276,41,229,25,176,20,124,21,97,22,69,25,41,31,14,40,-9,91,-71,154,-99,216,-111,264,-123,287,-150,16383,16383,266,152,264,115,256,77,242,45,219,21,186,13,147,23,119,52,99,93,87,141,84,191,88,232,99,263,117,285,140,298,168,302,197,294,224,272,245,239,260,198,266,152,481,232,471,310,440,377,392,428,329,462,252,473,176,462,113,430,65,379,34,313,23,234,34,152,65,85,113,34,177,1,252,-9,328,1,391,33,439,84,470,151,481,232,16383,16383,104,252,107,287,114,321,124,352,136,379,152,401,169,418,188,431,208,440,230,446,252,448,271,446,290,442,307,436,323,426,338,415,359,393,375,365,388,331,397,293,401,252,16383,16383,402,220,398,176,391,137,379,102,363,73,344,49,328,37,312,27,293,21,274,17,253,16,234,17,216,20,198,26,182,35,166,47,144,72,127,102,115,137,107,176,104,220,274,79,256,57,237,41,217,30,195,24,172,22,140,29,114,49,96,79,84,115,80,156,217,156,217,178,80,178,85,212,97,245,115,274,139,294,167,302,199,297,222,285,237,268,248,248,256,227,267,227,258,322,246,322,244,314,242,311,239,309,234,308,223,309,213,313,201,317,186,320,166,322,115,313,74,287,43,249,24,203,17,152,23,104,41,61,70,26,109,2,157,-6,190,-2,220,7,246,24,268,46,285,73,33,236,51,257,70,274,90,285,112,291,135,293,167,286,193,266,211,236,223,200,227,159,91,159,91,137,227,137,222,103,210,70,192,41,168,21,140,13,108,18,86,30,70,47,59,67,51,88,40,88,50,-6,61,-6,62,-2,63,1,65,4,68,6,73,7,84,6,94,2,106,-1,121,-5,141,-6,192,2,233,28,264,66,283,112,290,163,284,211,266,254,237,289,198,313,151,322,117,318,87,308,61,291,40,269,23,241,442,111,411,80,380,55,347,37,310,25,265,21,243,23,217,27,192,35,168,44,149,56,149,408,170,420,193,429,217,436,242,441,266,442,310,438,347,427,380,408,410,383,441,352,463,373,429,409,393,437,354,457,311,469,262,473,263,473,184,462,120,428,72,377,42,310,31,232,42,155,73,89,121,36,185,2,262,-9,310,-5,354,6,394,26,430,54,464,90,16383,16383,118, -83,114,86,111,89,109,93,106,97,104,102,89,126,78,151,69,177,64,204,63,232,65,267,73,300,84,331,100,362,118,391,556,119,551,160,534,195,510,220,478,237,441,242,400,236,367,220,341,194,325,159,320,118,325,76,342,41,367,14,399,-3,435,-9,476,-3,509,14,535,41,551,77,556,119,16383,16383,508,105,505,71,497,43,484,23,466,10,445,5,433,7,423,10,413,15,404,23,396,32,386,51,378,71,372,93,369,117,368,142,371,172,379,195,392,212,409,223,430,227,443,225,454,222,464,216,473,209,481,200,490,185,498,168,503,148,507,127,508,105,16383,16383,452,473,420,473,103,-9,138,-9,16383,16383,234,310,219,290,205,276,191,266,175,261,158,259,130,264,107,279,90,301,79,330,75,365,78,396,88,421,104,441,124,453,148,457,158,456,166,454,171,449,176,442,180,432,184,420,187,412,191,405,196,400,202,396,209,395,217,396,223,400,229,405,232,411,234,418,229,435,217,450,200,462,177,471,151,473,136,472,121,468,106,463,92,455,78,445,62,429,50,411,41,389,35,366,34,340,38,301,52,268,74,243,102,227,136,221,149,222,162,225,174,229,186,235,198,244,207,252,215,261,223,273,231,287,241,305,273,256,239,257,212,259,190,262,171,267,155,274,141,284,129,297,121,311,116,326,115,343,119,376,132,405,155,427,187,442,229,447,271,441,307,424,336,396,356,359,367,314,384,314,377,473,363,473,360,465,355,459,350,454,343,451,336,450,328,451,318,453,306,456,295,460,286,463,256,469,242,472,228,473,213,473,150,467,103,450,70,423,50,389,44,351,45,334,49,319,55,306,63,293,73,282,86,270,102,261,118,253,136,248,153,245,153,244,115,238,79,225,48,205,27,175,20,134,23,105,32,78,47,55,66,35,90,18,111,8,134,0,158,-5,184,-8,211,-9,225,-9,242,-7,260,-4,281,0,302,6,329,18,353,32,374,50,388,69,393,91,392,101,388,109,383,114,376,117,367,118,353,115,343,108,334,96,325,80,313,61,303,49,290,38,273,29,253,23,229,21,185,26,149,39,122,60,106,90,100,127,102,147,107,165,114,180,125,193,138,204,158,214,180,221,206,225,237,227,273,228,438,487,420,471,400,460,380,453,361,450,341,449,323,451,304,455,286,462,268,473,250, -487,215,459,177,426,143,389,118,349,109,308,120,251,147,202,180,161,207,126,219,95,218,83,215,73,210,65,204,58,198,52,188,56,167,68,141,83,118,97,103,106,30,3,47,-6,54,2,62,12,70,21,76,28,79,30,91,25,108,16,129,5,147,-5,161,-15,210,27,246,62,269,91,281,116,285,141,285,151,278,172,271,184,260,198,230,238,255,254,276,264,296,271,313,275,330,276,374,267,410,244,437,210,454,167,459,120,456,84,444,44,421,1,385,-41,333,-81,314,-63,296,-50,278,-42,260,-37,242,-36,205,-41,174,-55,149,-76,128,-102,112,-131,113,-131,127,-137,140,-124,155,-113,171,-105,189,-100,206,-98,228,-100,248,-105,266,-114,283,-126,299,-142,308,-142,335,-113,368,-86,405,-58,443,-29,479,2,499,25,516,49,530,77,538,110,541,151,534,205,513,254,479,294,432,325,373,346,349,333,324,319,295,303,260,283,216,257,202,275,191,294,183,314,178,334,177,354,178,369,181,383,187,396,195,408,205,418,225,403,244,393,261,387,279,384,298,383,337,388,372,402,402,423,429,449,452,477,454,0,454,463,338,463,338,247,165,247,165,463,49,463,49,0,165,0,165,216,338,216,338,0,16383,16383,423,30,368,30,368,433,423,433,16383,16383,134,30,80,30,80,433,134,433,373,82,355,62,340,48,328,40,319,36,311,35,305,37,303,40,302,43,302,54,303,61,309,85,345,211,348,222,352,242,353,251,353,260,351,282,343,299,331,312,314,319,291,322,265,317,236,302,206,274,173,231,138,172,221,477,216,478,200,472,183,466,162,461,138,454,106,448,106,437,118,436,129,435,138,433,144,428,146,421,146,414,145,410,145,406,144,401,33,0,91,0,109,57,123,101,137,136,152,164,169,191,192,223,213,248,234,268,252,280,266,284,277,283,285,279,289,272,292,264,293,253,293,245,291,235,290,226,288,217,286,210,259,109,249,73,245,56,242,42,241,32,243,18,248,7,256,0,266,-4,279,-6,295,-4,314,4,335,19,357,42,381,74,373,82,354,62,339,48,328,40,319,36,311,35,305,37,303,40,302,43,302,54,303,61,309,85,345,211,348,222,352,242,353,251,353,260,351,282,343,299,331,312,314,319,291,322,265,317,236,302,206,274,173,231,138,172,186,353,287,389,295,420,195,383,204,415,208, -428,211,441,215,453,218,465,222,477,216,478,200,472,183,466,163,461,138,454,106,448,106,437,118,436,129,435,138,433,144,428,146,421,146,410,145,406,144,401,130,359,63,334,56,305,122,328,33,0,91,0,109,57,123,101,137,136,152,164,169,191,192,223,213,248,234,268,252,280,266,284,277,283,285,279,289,272,292,264,293,253,293,245,291,235,290,226,288,217,286,210,259,109,254,93,250,75,245,58,243,43,241,32,243,18,248,7,256,0,266,-4,279,-6,296,-3,314,4,335,19,358,42,383,75,481,472,477,464,469,453,457,443,442,434,423,431,380,437,345,451,311,467,270,481,216,487,165,479,123,458,91,428,71,390,64,348,69,314,84,286,108,265,140,251,180,246,191,247,201,248,211,251,222,255,234,260,228,276,220,272,211,270,201,267,192,266,183,266,162,268,143,277,127,291,115,311,111,337,116,367,130,389,149,405,171,414,193,416,235,411,270,397,303,380,339,367,382,361,424,368,454,386,475,412,489,440,498,467,16383,16383,492,292,481,304,470,315,455,324,437,329,412,331,413,331,385,327,359,315,338,297,323,273,318,243,325,203,341,170,360,139,376,106,383,69,379,48,369,30,354,16,333,6,307,3,286,5,268,12,253,23,241,39,231,61,221,88,208,115,191,138,166,153,131,159,101,153,75,136,54,114,39,91,31,72,48,68,55,80,63,89,74,97,85,102,97,104,105,102,114,98,122,91,129,81,136,69,143,54,151,40,160,27,171,15,185,4,201,-5,219,-13,241,-18,268,-21,302,-22,354,-16,400,2,436,30,460,66,469,106,461,144,442,178,420,209,402,236,394,261,396,276,402,287,412,295,423,300,434,302,442,301,451,299,459,295,469,289,480,280,440,0,440,463,409,463,409,109,408,109,166,432,144,463,49,463,49,0,80,0,80,353,81,353,346,0,16383,16383,409,30,360,30,80,405,80,433,127,433,409,58,677,215,672,249,659,279,639,304,612,321,579,327,545,321,518,304,498,279,485,248,481,213,485,179,498,149,518,125,545,109,579,103,612,109,639,125,660,149,672,180,677,215,16383,16383,622,213,620,178,615,152,606,133,593,122,578,118,563,122,551,133,542,151,538,178,536,213,538,249,543,276,551,296,563,307,577,311,593,307,606,296,615,276,620,249,622,212,16383, -16383,673,0,673,61,484,61,484,0,16383,16383,389,149,189,463,63,463,63,450,74,449,83,449,99,445,105,443,113,439,120,431,129,421,139,408,150,391,150,203,149,157,146,109,138,66,123,36,100,24,90,30,82,44,74,60,63,74,44,80,34,78,23,74,14,67,7,56,5,41,8,20,18,5,34,-3,53,-8,77,-9,127,3,158,38,174,85,180,136,180,345,407,-7,420,-7,420,260,421,307,424,355,432,397,446,427,470,439,480,433,487,420,496,403,507,389,526,384,536,385,547,389,556,397,562,407,565,422,561,443,552,458,536,467,517,472,494,473,443,460,412,426,396,379,390,328,389,280,172,364,172,353,186,352,196,348,201,343,204,333,205,319,205,156,204,140,202,129,197,122,187,119,172,117,172,106,285,106,285,117,269,118,259,122,253,128,250,138,249,152,249,220,254,220,258,219,293,219,311,221,326,226,340,233,353,243,361,251,367,261,371,271,373,282,374,293,374,305,371,315,368,324,363,333,355,340,344,348,330,354,313,360,294,363,273,364,16383,16383,249,335,250,340,251,344,253,347,257,348,263,348,289,347,308,341,319,330,326,314,327,292,325,273,318,257,307,245,290,237,267,234,263,234,260,235,254,235,249,236,16383,16383,505,230,493,307,460,374,409,427,344,461,270,473,192,461,125,427,73,375,39,309,27,232,39,155,72,88,124,36,190,2,266,-9,343,2,409,36,460,88,494,154,505,230,16383,16383,467,231,457,165,428,107,384,61,329,31,266,20,203,30,148,61,104,107,75,165,65,232,75,298,104,356,148,402,203,433,265,444,329,433,384,403,428,357,457,299,467,231,307,323,303,345,293,361,278,373,259,380,237,383,238,383,173,372,118,343,75,300,47,249,37,195,39,168,48,142,64,118,86,97,117,80,109,67,102,53,95,40,90,28,84,15,78,-1,73,-19,68,-38,65,-58,64,-78,66,-101,73,-121,86,-136,106,-147,133,-151,174,-143,210,-123,238,-91,257,-53,263,-8,259,19,249,41,232,57,212,68,188,77,231,136,283,195,338,246,393,282,441,295,464,291,480,280,489,264,494,246,495,228,489,174,473,117,448,65,415,27,376,13,363,13,353,16,345,21,340,29,338,38,341,46,353,60,359,69,362,81,360,92,355,101,349,107,340,111,331,112,317,109,306,102,297,91,292, -78,291,63,294,44,303,25,318,8,341,-2,371,-6,394,-4,416,1,437,10,457,22,477,38,504,68,527,103,544,141,555,179,559,216,554,252,541,280,519,299,490,311,455,315,429,314,402,311,373,305,343,295,312,280,313,280,291,266,271,252,250,235,230,218,193,181,176,162,160,143,145,123,131,102,121,110,112,121,105,136,101,157,99,182,108,243,132,291,166,325,205,346,244,353,257,352,271,349,283,343,292,335,297,323,16383,16383,214,-7,211,-37,201,-69,186,-99,167,-121,145,-129,134,-128,127,-123,122,-115,120,-106,120,-94,125,-59,138,-21,153,14,167,41,174,53,188,45,199,34,207,20,212,6,214,-7,49,463,49,0,165,0,165,177,273,177,326,183,372,199,408,228,431,268,440,321,431,374,407,414,371,442,325,458,273,463,16383,16383,344,423,367,411,385,393,398,371,406,346,409,320,406,295,398,270,384,248,366,229,344,217,16383,16383,313,213,305,211,295,209,285,208,165,208,165,433,279,433,297,431,306,429,313,427,16383,16383,134,30,80,30,80,433,134,433,492,-8,481,-9,471,-11,438,-14,425,-12,412,-8,401,-1,390,7,380,17,421,46,455,83,480,127,495,177,501,232,490,310,460,377,412,428,348,462,270,473,189,462,123,430,73,379,42,312,31,232,43,155,74,89,124,36,189,2,266,-9,283,-9,300,-7,316,-4,331,-1,346,3,359,-11,375,-24,392,-34,413,-42,438,-44,450,-44,461,-43,473,-42,484,-40,496,-38,16383,16383,414,384,435,357,451,329,461,298,468,265,470,232,467,200,461,168,450,137,435,109,414,84,16383,16383,383,55,363,43,357,41,343,54,328,66,311,76,291,83,269,85,247,83,228,77,210,67,194,55,180,39,166,45,160,49,155,52,149,55,149,409,168,420,192,430,218,437,244,441,266,442,290,441,315,438,340,431,363,422,383,409,16383,16383,118,84,98,109,83,137,71,168,65,200,63,232,64,265,71,298,81,329,97,357,118,384,16383,16383,322,29,310,26,288,22,277,21,257,21,247,22,225,26,213,29,222,37,232,44,242,50,254,53,266,55,280,53,292,50,303,44,313,37,322,29,569,80,554,65,545,57,537,51,531,48,505,66,494,110,486,166,469,223,432,266,432,268,464,284,488,305,505,330,515,358,519,388,513,420,497,449,469,472,431,487,381,493,288,425,270,444,249, -461,224,475,196,484,165,487,124,482,89,469,61,446,42,416,35,378,43,345,63,321,87,299,107,276,115,245,111,228,102,214,89,202,75,194,62,188,63,188,69,173,104,185,136,203,162,226,179,252,185,280,177,318,157,343,133,362,113,385,105,418,107,432,113,445,122,455,135,462,152,465,186,451,208,416,220,370,226,323,227,284,226,231,224,172,219,118,209,78,191,63,180,66,140,86,120,97,107,105,41,3,57,-5,64,4,71,12,78,19,84,24,88,28,98,24,116,15,136,4,155,-6,170,-15,209,27,242,74,271,123,293,175,308,226,360,238,376,227,387,209,393,185,395,159,396,131,398,98,405,62,418,29,438,2,466,-15,475,-15,497,-1,520,15,544,33,565,51,580,66,16383,16383,311,250,312,265,313,281,313,339,311,355,308,371,304,387,299,401,315,415,329,426,342,433,356,438,372,439,396,435,414,423,427,407,434,389,437,372,434,344,424,317,405,291,376,269,334,255,498,0,348,199,380,214,406,234,424,260,436,291,440,327,431,379,407,418,370,444,325,459,273,463,49,463,49,0,165,0,165,190,217,190,353,0,16383,16383,344,423,367,410,385,394,398,375,406,352,409,325,406,299,397,276,384,255,366,237,344,225,16383,16383,313,224,297,222,290,221,282,221,274,220,165,220,165,433,278,433,299,430,306,428,313,427,16383,16383,438,30,370,30,254,190,261,190,264,189,289,189,316,192,16383,16383,134,30,80,30,80,433,134,433,534,0,534,16,510,19,490,26,472,36,456,50,439,66,534,159,515,178,420,86,376,140,355,167,335,195,313,222,349,233,384,250,413,274,433,304,441,342,428,393,395,429,350,452,298,464,248,467,48,467,48,450,79,448,103,442,119,429,128,409,131,377,131,91,128,58,119,37,103,25,79,19,48,17,48,0,276,0,276,17,245,19,222,25,205,37,196,58,193,91,193,213,198,213,203,212,232,212,236,213,241,213,377,44,280,-50,298,-69,395,23,413,0,16383,16383,193,397,196,417,205,431,218,439,235,443,255,445,297,441,329,430,352,410,365,379,370,336,362,290,341,260,310,243,272,235,228,233,207,233,200,234,193,234,670,463,598,463,486,247,378,463,293,463,293,449,305,447,317,443,327,435,335,426,341,414,341,240,340,223,337,211,331,202,320,198,305,195,305, -180,397,180,397,195,382,198,371,202,365,211,361,223,360,240,360,396,466,179,473,179,581,398,581,221,580,212,579,207,578,203,576,201,573,200,570,198,565,197,558,196,547,195,547,180,666,180,666,195,648,197,638,200,633,206,631,216,630,233,630,411,632,425,636,436,643,443,654,447,670,449,16383,16383,263,402,263,463,21,463,21,402,35,402,41,420,48,433,57,442,69,448,83,449,117,449,117,217,115,206,110,200,99,197,82,195,82,180,202,180,202,195,184,197,174,200,169,206,167,217,166,234,166,449,202,449,215,448,226,442,235,433,242,420,248,402,474,433,474,463,70,463,70,433,328,433,35,30,35,0,468,0,468,30,177,30,16383,16383,432,433,140,30,72,30,366,433,153,185,264,305,264,315,127,315,127,316,264,453,264,463,32,463,30,380,43,380,47,407,54,424,65,435,81,441,104,442,186,442,186,441,47,305,47,294,185,294,185,293,73,173,73,163,111,163,150,157,178,140,196,113,206,76,209,31,204,-19,190,-62,171,-96,147,-118,123,-126,117,-126,109,-124,102,-121,94,-116,87,-108,79,-100,73,-93,66,-89,60,-86,53,-86,44,-87,36,-91,30,-97,26,-104,24,-113,28,-126,37,-136,52,-144,70,-150,91,-151,153,-141,203,-114,241,-71,265,-16,273,47,269,87,255,121,232,149,198,171,153,184,501,0,501,111,488,111,486,92,483,77,477,67,467,61,453,59,333,59,334,84,386,104,428,132,458,169,477,215,484,271,474,332,445,387,399,432,337,462,260,473,183,462,120,431,75,385,46,330,37,271,43,215,61,169,90,133,132,105,184,84,185,59,81,59,65,60,52,65,42,75,36,90,34,112,20,112,20,0,221,0,215,105,181,122,154,152,134,189,121,231,117,273,123,323,140,370,169,410,209,437,260,448,311,439,351,415,380,377,398,329,404,273,399,228,386,185,366,149,339,121,305,105,300,0,501,353,501,463,300,463,305,359,339,343,366,315,386,278,399,236,404,191,398,135,380,86,351,49,311,24,260,16,209,26,169,53,140,93,123,141,117,191,121,233,134,274,154,312,181,341,215,359,221,463,20,463,20,352,34,352,36,373,42,388,52,398,65,403,81,405,185,405,184,379,132,359,90,331,61,294,43,248,37,192,46,133,75,78,120,32,183,1,260,-9,337,1,399,31,445, -76,474,131,484,192,477,248,458,294,428,331,386,359,334,379,333,405,453,405,467,403,477,396,483,386,486,372,488,353,339,188,380,206,413,231,436,262,451,298,455,336,446,389,419,432,378,462,328,480,272,487,213,480,165,459,127,427,98,384,79,333,97,327,118,374,144,409,175,434,211,448,251,453,286,449,320,437,347,414,366,380,373,333,368,292,353,258,331,233,303,217,271,212,252,214,233,220,214,230,197,246,181,266,163,253,171,238,183,223,198,210,218,198,243,191,243,190,216,181,194,169,177,154,162,137,149,118,166,109,184,130,201,146,221,158,245,165,276,167,312,161,342,141,366,111,381,70,386,20,384,-19,376,-56,361,-87,336,-108,298,-115,270,-112,249,-101,233,-85,222,-64,212,-40,213,-40,204,-19,193,1,178,18,157,29,127,34,96,27,72,11,54,-9,42,-32,35,-51,51,-56,58,-44,67,-35,77,-27,89,-22,100,-20,113,-24,121,-35,126,-51,132,-70,145,-90,168,-112,194,-127,220,-136,249,-141,280,-142,346,-133,400,-108,440,-70,465,-22,473,30,467,79,449,119,421,151,384,173,339,186,193,0,193,239,189,270,177,294,159,311,133,321,102,324,76,320,55,308,39,291,28,269,23,244,44,244,46,256,49,269,55,280,64,288,77,291,90,288,98,279,103,267,106,253,106,0,98,130,77,81,61,48,47,28,31,18,10,13,10,0,150,0,150,13,132,14,118,17,108,23,103,31,101,42,101,48,103,60,105,66,107,71,139,152,323,152,352,85,360,63,363,53,364,44,365,37,363,29,361,25,358,22,355,20,350,17,345,15,338,14,329,13,316,13,316,0,495,0,495,13,476,17,462,24,450,36,440,54,429,77,258,470,278,476,295,486,309,501,318,519,321,540,318,561,308,581,293,596,274,606,252,609,230,606,211,596,196,581,186,562,182,541,185,520,193,501,206,486,223,476,242,471,16383,16383,298,541,295,526,289,513,279,503,266,497,251,495,236,497,224,503,214,513,208,526,205,541,208,555,214,567,224,577,237,584,251,586,266,584,278,577,289,567,295,555,298,541,16383,16383,313,180,152,180,232,373,461,474,450,465,440,457,430,452,420,449,410,448,399,450,387,455,375,462,361,473,346,487,314,460,280,431,248,399,225,365,216,331,224,291,244,257,268,225,288,192,297,152,294,137,288, -126,278,117,266,113,252,111,247,111,242,112,230,116,224,119,216,104,225,100,235,97,245,95,254,93,263,93,296,98,326,112,351,133,367,159,373,188,363,230,339,268,309,302,285,335,274,367,275,377,278,386,284,397,291,407,302,419,314,406,327,397,342,391,358,388,377,387,402,392,425,407,444,426,460,446,473,463,16383,16383,437,121,409,94,381,73,351,58,320,48,287,45,221,59,172,96,139,150,121,213,115,280,119,327,131,373,152,413,182,441,220,452,231,451,240,450,249,448,258,445,266,441,277,454,268,462,258,469,245,474,229,478,210,480,142,464,92,423,58,367,39,306,33,249,42,174,68,102,113,41,177,0,259,-16,312,-9,357,10,396,39,427,74,451,113,566,231,547,318,506,385,446,434,374,464,297,473,207,461,132,426,74,373,37,307,24,231,38,154,76,87,134,35,209,0,297,-11,353,-7,402,4,444,25,483,53,520,90,470,90,441,61,410,38,375,22,338,13,297,10,256,13,220,22,187,36,159,55,136,77,130,84,127,89,125,93,124,99,124,231,16383,16383,466,271,466,264,464,260,461,257,456,255,133,255,129,256,126,259,125,263,124,269,124,361,125,368,127,374,131,378,136,384,160,405,189,423,223,437,259,447,297,450,334,447,370,439,403,426,431,409,452,389,457,383,461,377,464,372,466,365,466,355,323,0,323,463,263,463,263,245,55,245,55,193,263,193,263,52,9,52,16,0,345,185,379,327,391,313,403,301,407,295,411,285,412,281,413,276,413,270,430,270,434,278,438,288,441,299,443,309,444,319,443,332,439,346,433,361,422,377,407,394,372,427,355,444,349,452,345,459,344,467,344,471,345,473,345,474,328,474,323,466,319,456,316,447,314,437,313,427,315,410,320,394,328,378,340,362,356,347,320,205,111,403,98,415,86,427,76,439,69,450,66,462,67,464,67,469,68,472,70,474,52,474,46,466,40,455,35,444,32,431,30,417,32,403,36,390,41,377,49,365,58,355,116,298,94,282,73,262,57,239,46,213,42,181,49,138,67,109,87,90,104,72,112,52,106,38,93,28,75,22,57,18,42,17,42,0,95,0,128,3,154,11,173,23,184,40,188,59,186,75,180,88,171,100,160,111,148,124,135,140,126,155,119,170,115,186,113,204,114,219,117,235,121, -250,127,265,134,280,347,84,372,59,388,42,402,25,411,8,412,5,412,2,413,-1,413,-8,430,-8,436,6,440,19,442,32,443,44,444,55,442,70,437,84,430,97,421,109,411,120,388,84,380,79,370,75,358,73,348,71,340,71,350,112,361,157,370,203,376,247,379,288,374,342,358,383,332,411,295,427,248,432,225,431,203,427,161,419,138,418,124,420,112,426,103,435,97,446,95,460,95,468,97,474,80,474,70,465,63,454,58,441,54,427,53,410,56,392,67,374,84,360,111,350,146,347,168,348,188,350,207,352,225,355,243,355,272,352,297,338,315,310,327,267,331,203,330,176,328,146,325,117,321,91,316,71,152,71,126,69,102,62,79,48,58,27,40,-3,54,-12,66,-6,79,-2,94,0,321,0,347,3,368,13,385,29,396,50,401,76,117,474,108,466,101,456,95,445,92,431,91,412,91,413,94,394,104,376,123,361,149,350,184,346,197,342,208,332,216,317,222,297,223,276,223,241,221,222,219,201,216,177,201,142,183,112,163,90,141,76,118,70,97,67,78,58,59,43,43,23,28,-3,42,-12,54,-6,67,-2,81,0,109,0,122,1,134,2,145,6,156,11,165,19,180,37,193,58,204,81,213,105,220,128,222,128,235,86,252,57,270,35,284,15,289,-8,306,-8,312,0,317,11,321,23,323,37,324,55,316,85,297,114,275,143,256,174,248,205,250,235,254,264,259,293,264,321,266,349,264,372,258,391,246,407,227,417,201,420,174,422,154,428,141,437,134,448,132,461,132,466,133,469,133,471,134,474,63,474,54,465,46,454,41,441,38,427,37,410,38,398,41,387,47,377,55,368,66,360,76,355,88,351,102,349,117,347,134,347,159,348,185,350,210,352,234,355,268,355,279,354,289,353,297,351,305,348,290,328,273,302,257,272,245,238,241,198,242,176,244,149,250,87,252,59,251,48,249,36,247,23,243,8,239,-4,254,-12,278,0,297,16,313,37,322,60,326,84,323,120,318,152,311,184,305,219,302,263,304,281,308,299,314,316,322,330,330,340,336,346,344,360,346,367,347,375,344,392,335,408,318,420,293,429,259,432,233,431,175,423,147,419,121,418,107,420,95,426,86,435,79,446,77,460,77,463,78,465,78,468,80,474,452,64,422,76,410,59,399,44,387,33,371, -25,348,23,344,32,341,44,340,56,339,69,339,284,427,284,427,315,17,315,17,284,83,284,83,0,186,0,186,284,235,284,235,95,239,61,251,32,271,10,298,-3,332,-8,359,-6,383,-2,404,6,422,21,439,44,16383,16383,310,26,292,34,279,48,271,65,267,84,266,104,266,284,308,284,308,49,309,38,311,27,16383,16383,155,30,113,30,113,284,155,284,342,321,340,317,335,312,312,281,268,217,247,184,227,152,206,185,183,218,158,250,133,281,105,311,104,313,101,315,99,318,95,322,0,277,36,232,74,189,110,146,144,100,172,48,160,27,150,4,142,-19,137,-44,135,-68,139,-93,148,-115,164,-134,185,-147,209,-151,241,-145,265,-128,282,-104,292,-74,295,-43,293,-10,286,23,275,56,261,88,246,118,266,153,287,187,309,221,332,253,355,286,368,304,16383,16383,239,-114,241,-102,241,-84,230,-11,200,60,158,128,110,192,62,249,63,249,59,253,57,256,54,259,52,262,49,266,85,286,87,284,88,282,93,277,139,225,185,163,225,94,254,24,265,-43,264,-59,262,-74,257,-88,250,-101,241,-115,16383,16383,191,8,198,-6,203,-25,207,-45,210,-65,211,-82,211,-90,209,-106,208,-113,205,-121,191,-117,180,-107,172,-93,167,-78,166,-63,167,-47,170,-33,175,-18,182,-5,190,8,397,433,397,463,49,463,49,0,165,0,165,433,16383,16383,134,30,80,30,80,433,134,433,454,0,454,463,49,463,49,0,165,0,165,433,338,433,338,0,16383,16383,423,30,368,30,368,433,423,433,16383,16383,134,30,80,30,80,433,134,433,617,-180,617,-140,232,-140,431,177,236,494,537,494,537,534,43,534,43,494,241,177,43,-140,43,-180,16383,16383,385,177,185,-140,91,-140,286,177,91,494,191,494,48,213,184,213,169,266,109,266,109,377,112,389,124,401,145,411,177,418,221,420,286,409,338,380,375,337,398,285,405,228,398,173,376,123,340,82,290,54,226,44,189,47,154,56,122,74,93,101,70,140,56,140,56,68,84,37,116,15,151,0,189,-7,226,-9,305,2,371,35,423,87,456,153,468,230,457,310,425,377,374,428,307,462,224,473,170,471,129,463,97,451,71,437,48,422,340,0,340,463,22,463,9,412,279,412,279,0,340,0,340,463,279,463,279,52,9,52,22,0,427,0,252,262,252,463,190,463,190,262,15,0,81,0,220, -210,360,0,49,463,49,0,244,0,320,11,384,43,432,92,463,156,474,232,464,310,433,374,385,422,321,453,244,463,16383,16383,387,379,408,355,424,329,435,301,441,271,443,239,441,209,435,175,424,141,408,111,387,88,16383,16383,356,70,338,56,314,45,288,37,262,32,239,30,165,30,165,433,240,433,263,431,287,427,313,420,336,411,356,400,16383,16383,134,30,80,30,80,433,134,433,363,0,363,478,259,478,259,280,243,298,225,310,206,317,185,321,165,322,117,313,79,288,53,251,37,207,31,159,37,112,53,67,79,29,116,3,164,-6,186,-5,206,0,226,6,243,18,259,34,259,0,16383,16383,333,30,291,30,291,448,333,448,16383,16383,259,109,255,83,243,60,225,41,203,28,177,23,169,24,160,25,151,27,142,30,135,34,135,280,142,285,150,289,157,290,165,291,173,291,199,287,222,275,242,257,255,234,259,209,16383,16383,105,49,88,67,76,88,68,111,64,136,63,159,64,183,68,207,75,231,87,252,105,268,334,139,334,191,327,234,305,270,274,298,235,316,192,322,138,314,93,292,60,258,39,213,31,159,38,104,59,58,92,23,137,1,192,-6,225,-3,256,4,283,18,307,39,327,66,302,83,284,60,265,43,243,32,218,25,189,23,179,24,167,25,145,31,135,36,135,139,16383,16383,304,170,262,170,262,270,276,259,287,245,296,228,302,211,304,193,16383,16383,231,170,135,170,135,277,145,281,156,285,167,288,179,291,198,291,207,289,215,286,224,283,231,278,16383,16383,105,50,88,68,76,88,68,111,64,135,63,159,64,182,69,206,77,228,89,248,105,266,142,376,142,478,38,478,38,376,16383,16383,111,407,70,407,70,448,111,448,16383,16383,142,0,142,315,38,315,38,0,16383,16383,111,30,70,30,70,284,111,284,175,376,175,478,75,478,75,376,16383,16383,145,407,105,407,105,448,145,448,16383,16383,175,315,75,315,75,-113,68,-116,62,-118,55,-119,32,-119,24,-118,15,-116,7,-113,0,-110,-9,-140,1,-144,13,-147,24,-149,48,-151,90,-145,125,-129,152,-104,169,-70,175,-28,16383,16383,145,-40,143,-56,138,-71,130,-85,119,-97,105,-106,105,284,145,284,204,387,204,484,158,484,158,387,31,387,31,214,77,214,77,340,158,340,158,0,391,0,391,46,204,46,204,138,276,138,324,143,364,157,395,181,414, -216,421,263,414,307,395,341,364,366,323,382,274,387,16383,16383,204,185,204,340,274,340,306,337,334,329,356,315,370,293,375,262,375,263,370,232,355,210,333,196,306,188,273,185,30,387,43,401,55,411,66,418,79,422,95,423,119,421,141,413,162,400,181,382,201,359,180,330,162,303,130,251,112,222,113,222,102,207,92,195,80,187,65,182,47,180,47,166,198,166,198,180,180,183,167,188,158,194,154,202,152,213,155,233,162,254,175,279,193,307,217,340,239,314,258,288,276,260,292,230,309,195,267,174,236,153,215,131,204,106,201,77,205,47,219,23,239,5,266,-5,297,-8,331,-3,360,10,383,32,398,61,403,96,402,114,400,132,396,152,389,174,379,200,405,216,444,242,474,271,497,302,510,335,515,368,510,406,494,435,470,457,437,469,395,473,363,471,333,464,304,452,275,434,245,409,219,433,195,452,172,464,149,471,125,473,98,470,73,460,52,444,34,422,20,394,16383,16383,451,342,448,315,439,291,423,269,400,247,368,224,346,267,326,303,306,335,285,363,262,391,286,409,307,421,327,430,346,434,364,436,392,432,416,420,435,401,447,375,451,342,16383,16383,348,71,345,52,338,36,326,24,311,16,293,13,275,16,260,25,248,38,241,55,238,75,241,98,250,119,265,138,288,156,320,173,331,149,340,129,345,110,347,91,348,71,447,169,464,179,476,190,483,202,487,214,488,226,485,245,474,261,458,273,437,282,413,284,389,282,369,274,350,262,334,243,319,218,336,205,347,221,358,232,370,240,382,244,396,245,409,244,420,240,428,233,433,223,435,212,433,198,426,185,413,174,395,163,369,153,369,133,377,134,383,135,388,135,410,133,427,125,440,114,448,97,451,77,449,61,442,48,432,37,419,31,403,28,396,28,390,30,383,32,376,36,367,42,360,47,353,51,348,53,344,55,331,55,324,52,318,48,315,42,313,34,316,21,325,10,338,2,356,-3,377,-4,420,0,457,12,484,33,502,59,508,91,505,111,498,129,486,146,469,159,447,167,16383,16383,416,473,384,473,66,-9,101,-9,16383,16383,152,189,152,205,136,207,124,210,116,215,112,223,111,233,111,470,102,473,27,434,27,418,36,422,43,425,49,427,58,427,60,425,61,421,62,415,63,407,63,229,62,220,58,214,51,210,41,207,25, -205,25,189,451,169,468,179,480,190,488,202,492,214,493,226,489,245,479,261,462,273,442,282,417,284,393,282,373,274,354,262,338,243,323,218,340,205,351,221,362,232,374,240,386,244,401,245,414,244,425,240,433,233,438,223,440,212,438,198,430,185,418,174,399,163,373,153,373,133,382,134,387,135,393,135,414,133,431,125,444,114,452,97,455,77,453,61,446,48,436,37,423,31,407,28,400,28,394,30,387,32,380,36,372,42,364,47,358,51,352,53,348,55,335,55,328,52,322,48,319,42,317,34,320,21,329,10,342,2,360,-3,380,-4,424,0,460,12,488,33,506,59,512,91,509,111,502,129,490,146,473,159,451,167,16383,16383,446,473,414,473,97,-9,131,-9,16383,16383,216,248,204,253,197,245,190,240,183,237,174,235,163,234,84,234,143,291,167,316,184,338,195,358,201,377,203,397,199,422,188,443,170,459,145,470,115,473,83,470,58,461,38,444,23,421,10,390,27,380,38,398,50,412,64,423,79,429,95,431,112,429,126,423,137,413,143,398,145,379,142,362,134,344,121,324,104,303,84,281,13,205,13,189,189,189,501,283,488,291,484,287,480,284,477,281,472,280,375,280,316,172,316,161,317,159,320,158,323,158,346,157,367,155,386,151,402,145,415,138,427,129,436,120,442,109,446,98,448,85,445,65,437,50,426,38,411,31,394,28,388,28,383,30,377,32,370,35,363,40,354,46,347,50,341,53,335,54,328,54,320,53,314,50,310,45,307,39,306,31,308,21,315,11,326,2,343,-2,366,-4,410,0,445,14,471,36,487,66,493,102,492,123,487,140,480,154,471,166,459,178,447,187,433,194,416,201,392,206,362,212,373,230,468,230,471,231,474,233,476,235,477,238,16383,16383,416,473,384,473,67,-9,102,-9,16383,16383,152,189,152,205,136,207,125,210,117,215,113,223,112,233,112,470,102,473,27,434,27,418,37,422,44,425,49,427,59,427,61,425,62,421,63,415,63,229,62,220,59,214,52,210,41,207,26,205,26,189,504,283,491,291,484,284,480,281,475,280,379,280,320,172,320,161,321,159,323,158,327,158,350,157,371,155,389,151,405,145,419,138,430,129,439,119,446,109,449,98,451,85,448,65,441,50,429,38,415,31,398,28,392,28,380,32,374,35,367,40,358,46,344, -53,338,54,332,54,324,53,318,50,313,45,310,39,309,31,311,21,318,11,329,2,346,-2,370,-4,413,0,449,14,474,36,491,66,496,102,495,123,491,140,484,154,474,166,462,178,450,187,437,194,419,201,396,206,366,212,376,230,472,230,475,231,478,233,480,235,481,238,16383,16383,446,473,414,473,97,-9,131,-9,16383,16383,216,248,204,253,197,245,190,240,183,237,174,235,163,234,84,234,143,291,167,316,184,338,195,358,201,377,203,397,199,422,188,443,170,459,145,470,115,473,83,470,58,461,38,444,23,421,10,390,27,380,37,398,48,412,61,423,74,429,89,431,105,428,119,421,129,409,136,395,138,378,136,364,129,346,119,326,103,304,84,281,13,205,13,189,189,189,504,283,491,291,484,284,480,281,475,280,379,280,320,172,320,161,321,159,323,158,327,158,350,157,371,155,389,151,405,145,419,138,430,129,439,119,446,109,449,98,451,85,448,65,441,50,429,38,415,31,398,28,392,28,380,32,374,35,367,40,358,46,344,53,338,54,332,54,324,53,318,50,313,45,310,39,309,31,311,21,318,11,329,2,346,-2,370,-4,413,0,449,14,474,36,491,66,496,102,495,123,491,140,484,154,474,166,462,178,450,187,437,194,419,201,396,206,366,212,376,230,472,230,475,231,478,233,480,235,481,238,16383,16383,446,473,414,473,97,-9,131,-9,16383,16383,143,358,160,368,172,379,180,391,184,403,185,415,181,434,171,450,154,462,133,470,109,473,85,471,65,464,47,451,30,432,15,407,32,394,43,410,54,421,66,429,78,433,92,434,106,433,117,429,125,422,130,412,131,401,129,387,122,374,109,363,91,352,65,342,65,322,73,323,79,324,84,324,106,322,123,314,136,303,144,287,147,266,145,250,138,237,128,226,115,220,99,217,92,218,86,219,79,221,72,225,64,231,56,236,50,240,40,244,35,245,27,244,20,241,14,237,11,231,9,223,12,210,21,199,35,191,52,185,73,184,116,188,153,201,180,222,198,248,204,280,202,300,195,318,183,335,166,348,143,356,504,283,491,291,484,284,480,281,475,280,379,280,320,172,320,161,321,159,323,158,327,158,350,157,371,155,389,151,405,145,419,138,430,129,439,119,446,109,449,98,451,85,448,65,441,50,429,38,415,31,398,28,392,28,380, -32,374,35,367,40,358,46,344,53,338,54,332,54,324,53,318,50,313,45,310,39,309,31,311,21,318,11,329,2,346,-2,370,-4,413,0,449,14,474,36,491,66,496,102,495,123,491,140,484,154,474,166,462,178,450,187,437,194,419,201,396,206,366,212,376,230,472,230,475,231,478,233,480,235,481,238,16383,16383,446,473,414,473,97,-9,131,-9,16383,16383,223,252,223,293,185,293,185,473,152,473,10,287,10,252,136,252,136,190,185,190,185,252,16383,16383,136,293,41,293,136,418,491,291,431,283,376,260,333,223,304,173,293,112,293,113,297,75,310,41,332,14,361,-3,399,-9,432,-4,460,8,482,30,496,58,502,91,498,123,486,150,467,170,441,183,409,187,409,188,398,187,386,184,376,181,366,177,357,173,369,209,393,236,424,255,459,267,494,274,16383,16383,446,77,444,59,439,44,430,33,417,25,402,22,383,27,369,42,359,62,353,87,351,114,353,129,359,142,368,152,380,159,393,161,412,156,427,142,437,122,444,99,446,77,16383,16383,416,473,384,473,67,-9,102,-9,16383,16383,152,189,152,205,136,207,125,210,117,215,113,223,112,233,112,470,102,473,27,434,27,418,37,422,44,425,49,427,59,427,61,425,62,421,63,415,63,229,62,220,59,214,52,210,41,207,26,205,26,189,495,291,434,282,380,259,336,221,307,172,297,111,301,73,314,40,335,14,365,-3,402,-9,435,-4,464,8,486,29,500,57,505,90,501,122,490,149,471,169,445,182,413,187,402,186,390,183,379,180,369,175,360,171,373,208,396,235,427,254,462,266,497,273,16383,16383,449,76,447,59,442,44,433,32,421,24,406,21,387,26,372,39,362,59,356,83,354,110,356,125,362,139,371,150,383,157,396,160,415,155,430,141,441,121,447,99,449,76,16383,16383,446,473,414,473,97,-9,131,-9,16383,16383,215,465,202,473,195,466,191,463,186,462,90,462,30,353,30,348,31,345,31,343,32,341,34,340,37,340,61,339,82,337,100,333,116,327,130,320,141,311,150,301,157,291,160,280,162,267,159,247,152,232,140,220,126,213,109,210,103,210,91,214,85,217,77,222,68,228,61,232,55,235,49,236,43,236,35,235,29,232,24,227,21,221,20,213,22,203,29,193,40,184,57,179,80,177,124,181,159,196,185,218,202,248,207,284,206, -305,201,322,195,336,185,348,173,360,161,369,147,376,130,383,107,388,77,394,87,412,182,412,186,413,188,415,191,417,192,420,505,69,503,88,496,105,484,121,464,138,437,155,438,155,459,167,475,179,486,192,493,207,495,225,491,244,480,260,462,273,440,281,413,284,383,281,357,272,337,258,324,238,320,215,321,199,326,185,335,172,350,157,373,140,349,123,333,107,323,92,318,76,316,59,321,36,333,18,353,5,378,-2,409,-4,441,-1,468,7,488,23,501,43,505,69,16383,16383,451,211,449,200,444,191,436,182,425,175,412,167,413,167,394,177,380,186,372,195,367,205,366,216,367,227,372,236,381,242,392,246,405,247,419,245,431,241,441,233,448,223,451,211,16383,16383,419,113,432,104,443,94,451,84,456,74,458,64,456,53,450,44,441,37,429,33,415,32,399,34,385,39,375,47,368,59,366,75,367,86,370,97,376,107,385,117,397,127,16383,16383,416,473,384,473,67,-9,102,-9,16383,16383,152,189,152,205,136,207,125,210,117,215,113,223,112,233,112,470,102,473,27,434,27,418,37,422,44,425,49,427,59,427,61,425,62,421,63,415,63,229,62,220,59,214,52,210,41,207,26,205,26,189,509,69,507,88,500,105,487,121,468,138,441,155,462,167,479,179,490,192,496,207,498,225,494,244,483,260,466,273,443,281,416,284,386,281,360,272,340,258,328,238,323,215,325,199,329,185,339,172,354,157,376,140,353,123,336,107,326,92,321,76,320,59,324,36,337,18,356,5,382,-2,413,-4,445,-1,471,7,491,23,504,43,509,69,16383,16383,455,211,453,200,448,191,440,182,429,175,416,167,397,177,384,186,375,195,370,205,369,216,371,227,376,236,384,242,395,246,409,247,422,245,435,241,445,233,452,223,455,211,16383,16383,422,113,436,104,446,94,454,84,459,74,461,64,459,53,453,44,444,37,432,33,419,32,402,34,388,39,378,47,371,59,369,75,370,86,373,97,379,107,388,117,401,127,16383,16383,446,473,414,473,97,-9,131,-9,16383,16383,143,358,160,368,172,379,180,391,184,403,185,415,181,434,171,450,154,462,133,470,109,473,85,471,65,464,47,451,30,432,15,407,32,394,43,410,54,421,66,429,78,433,92,434,106,433,117,429,125,422,130,412,131,401,129,387,122,374,109,363,91,352,65, -342,65,322,73,323,79,324,84,324,106,322,123,314,136,303,144,287,147,266,145,250,138,237,128,226,115,220,99,217,92,218,86,219,79,221,72,225,64,231,56,236,50,240,40,244,35,245,27,244,20,241,14,237,11,231,9,223,12,210,21,199,35,191,52,185,73,184,116,188,153,201,180,222,198,248,204,280,202,300,195,318,183,335,166,348,143,356,509,69,507,88,500,105,487,121,468,138,441,155,462,167,479,179,490,192,496,207,498,225,494,244,483,260,466,273,443,281,416,284,386,281,360,272,340,258,328,238,323,215,325,199,329,185,339,172,354,157,376,140,353,123,336,107,326,92,321,76,320,59,324,36,337,18,356,5,382,-2,413,-4,445,-1,471,7,491,23,504,43,509,69,16383,16383,455,211,453,200,448,191,440,182,429,175,416,167,397,177,384,186,375,195,370,205,369,216,371,227,376,236,384,242,395,246,409,247,422,245,435,241,445,233,452,223,455,211,16383,16383,422,113,436,104,446,94,454,84,459,74,461,64,459,53,453,44,444,37,432,33,419,32,402,34,388,39,378,47,371,59,369,75,370,86,373,97,379,107,388,117,401,127,16383,16383,446,473,414,473,97,-9,131,-9,16383,16383,215,465,202,473,195,466,191,463,186,462,90,462,30,353,30,348,31,345,31,343,32,341,34,340,37,340,61,339,82,337,100,333,116,327,130,320,141,311,150,301,157,291,160,280,162,267,159,247,152,232,140,220,126,213,109,210,103,210,91,214,85,217,77,222,68,228,61,232,55,235,49,236,43,236,35,235,29,232,24,227,21,221,20,213,22,203,29,193,40,184,57,179,80,177,124,181,159,196,185,218,202,248,207,284,206,305,201,322,195,336,185,348,173,360,161,369,147,376,130,383,107,388,77,394,87,412,182,412,186,413,188,415,191,417,192,420,509,69,507,88,500,105,487,121,468,138,441,155,462,167,479,179,490,192,496,207,498,225,494,244,483,260,466,273,443,281,416,284,386,281,360,272,340,258,328,238,323,215,325,199,329,185,339,172,354,157,376,140,353,123,336,107,326,92,321,76,320,59,324,36,337,18,356,5,382,-2,413,-4,445,-1,471,7,491,23,504,43,509,69,16383,16383,455,211,453,200,448,191,440,182,429,175,416,167,397,177,384,186,375,195,370,205,369,216,371, -227,376,236,384,242,395,246,409,247,422,245,435,241,445,233,452,223,455,211,16383,16383,422,113,436,104,446,94,454,84,459,74,461,64,459,53,453,44,444,37,432,33,419,32,402,34,388,39,378,47,371,59,369,75,370,86,373,97,379,107,388,117,401,127,16383,16383,420,473,388,473,70,-9,105,-9,16383,16383,225,449,225,462,51,462,20,398,37,391,46,402,54,409,62,414,72,416,174,416,84,178,124,178,600,154,600,200,181,200,175,201,170,203,166,206,164,210,163,214,165,222,169,230,173,234,197,260,209,274,220,287,230,301,216,314,188,283,157,252,124,225,89,200,50,180,50,173,89,154,124,130,157,102,187,72,216,41,230,54,220,68,196,96,184,109,168,125,166,128,164,132,163,135,163,138,164,143,167,147,171,150,176,153,180,154,316,297,284,325,254,356,226,389,202,425,182,463,175,463,155,425,131,389,103,356,73,326,42,298,55,284,69,294,97,316,110,328,123,341,127,344,130,347,133,349,136,350,140,351,144,350,152,342,155,337,155,-108,202,-108,202,339,204,344,208,347,211,349,216,350,219,350,231,344,235,340,248,328,262,316,275,304,289,293,302,283,599,180,561,200,525,224,492,252,462,282,434,313,420,300,429,286,440,272,452,258,464,245,477,233,480,229,483,226,485,222,487,216,485,211,482,207,478,203,473,201,468,200,49,200,49,154,468,154,475,153,480,151,483,148,485,144,486,140,484,132,482,128,476,120,463,107,439,81,419,53,433,40,461,71,492,101,525,129,561,154,599,173,302,70,289,61,275,50,247,26,235,13,231,10,228,7,225,5,221,4,218,3,214,4,209,8,206,12,203,17,202,22,202,463,156,463,156,23,155,16,153,11,150,7,146,5,142,4,139,4,131,8,123,14,109,27,96,39,83,50,69,61,55,71,42,57,74,28,104,-1,132,-34,156,-70,176,-108,183,-108,202,-70,227,-34,254,-1,284,28,316,57,622,180,583,200,548,224,515,252,484,282,455,313,441,300,451,286,475,258,487,245,506,226,507,222,509,216,507,211,504,207,500,203,495,201,491,200,158,200,151,201,146,203,143,206,141,210,140,214,140,218,144,226,150,234,163,247,175,260,186,274,197,287,207,301,193,314,164,283,134,252,101,225,65,200,27,180,27,173,65,154,101,130,134, -102,164,72,192,41,206,54,197,68,186,82,174,96,162,109,149,121,145,125,143,128,141,132,139,135,139,138,140,143,144,147,148,150,153,153,158,154,490,154,497,153,502,151,505,148,507,144,508,140,506,132,502,124,498,120,462,81,451,67,441,53,455,40,484,71,514,101,548,129,583,154,622,173,316,345,284,373,254,404,227,437,203,472,183,511,176,511,156,472,132,437,104,404,74,373,43,345,56,331,70,341,84,352,98,364,111,376,127,392,131,395,134,397,137,398,141,398,145,397,149,394,153,389,155,385,156,380,156,-23,155,-30,153,-35,150,-39,146,-41,142,-42,139,-42,131,-38,123,-32,109,-19,96,-7,83,3,69,14,55,24,42,10,74,-17,104,-48,132,-81,156,-117,176,-156,183,-156,202,-117,226,-81,254,-48,284,-17,315,10,302,23,288,14,260,-8,247,-20,235,-33,231,-36,228,-39,225,-41,221,-42,218,-43,214,-41,209,-38,206,-34,203,-29,202,-24,202,380,203,386,205,391,208,395,212,397,216,398,224,396,228,394,232,391,236,387,236,388,249,375,262,363,275,352,289,341,302,330,599,-76,165,380,161,384,158,388,156,392,154,395,154,400,156,404,157,405,158,407,164,411,169,413,173,414,197,414,233,416,250,418,266,420,266,441,255,440,231,438,175,438,145,441,114,446,84,453,54,463,49,459,60,429,67,399,72,368,74,337,75,306,75,294,74,282,74,270,73,258,72,247,91,246,95,263,97,281,98,299,98,334,99,340,99,344,100,348,102,351,107,356,109,357,116,357,119,356,123,355,126,354,128,352,566,-108,595,463,565,453,534,446,504,441,473,438,417,438,381,441,381,420,415,416,451,414,475,414,479,413,484,411,490,407,491,405,493,404,494,402,494,400,495,398,493,392,491,388,483,380,49,-76,83,-108,520,352,522,354,528,356,532,357,539,357,543,355,544,354,548,348,549,344,549,317,551,281,553,263,556,246,576,247,575,258,575,270,574,282,574,294,573,306,574,337,577,368,581,399,589,429,599,459,599,-104,589,-74,581,-44,577,-13,574,17,573,48,574,60,574,72,575,84,575,96,576,107,556,108,553,91,551,73,549,37,549,10,548,6,544,0,543,0,539,-2,532,-2,528,-1,522,1,520,2,83,463,49,430,483,-24,487,-29,491,-33,493,-37,495,-43,494,-45,494,-47,493,-49,491, --50,487,-54,484,-56,479,-57,475,-58,470,-58,451,-59,415,-61,381,-65,381,-85,405,-83,473,-83,504,-86,534,-91,565,-98,595,-108,599,430,566,463,128,2,126,1,123,0,119,-1,116,-2,109,-2,107,-1,106,0,105,0,102,3,100,6,99,10,99,14,98,20,98,55,97,73,95,91,91,108,72,107,73,96,74,84,74,72,75,60,75,48,74,17,72,-13,67,-44,60,-74,49,-104,54,-108,84,-98,114,-91,145,-86,175,-83,243,-83,255,-84,266,-85,266,-65,250,-63,233,-61,215,-59,197,-59,178,-58,173,-58,169,-57,164,-56,161,-54,156,-49,154,-45,154,-40,156,-37,158,-33,161,-29,165,-24,606,154,606,200,420,200,488,315,448,315,380,200,173,200,167,201,162,203,158,206,156,210,155,214,157,222,161,230,165,234,177,247,190,260,223,302,209,315,180,283,149,253,117,225,81,200,42,180,42,173,81,154,116,130,149,102,180,72,208,41,222,54,212,68,201,82,189,96,177,109,158,128,156,132,155,135,155,138,156,143,159,147,163,150,168,153,173,154,353,154,286,41,327,41,394,154,606,180,568,200,532,225,499,253,468,283,440,315,426,302,436,288,458,260,470,247,483,234,489,226,491,221,493,218,493,214,492,210,490,206,487,203,481,201,474,200,290,200,357,315,316,315,249,200,42,200,42,154,222,154,155,41,196,41,263,154,475,154,480,153,485,150,489,147,492,143,494,138,492,132,490,128,487,125,484,121,471,109,459,96,447,82,436,68,427,54,441,41,469,72,499,102,532,130,568,154,606,173,599,166,571,189,543,206,515,217,486,223,455,225,417,220,383,208,350,194,314,182,274,177,238,181,207,191,181,204,165,219,159,234,161,239,167,242,175,245,184,247,192,248,210,251,226,255,243,259,275,269,271,288,244,282,216,277,189,273,161,271,133,270,118,271,101,273,85,275,68,278,53,281,49,275,69,237,84,197,95,155,102,113,107,71,126,74,125,94,124,112,122,130,121,147,120,165,121,171,123,179,126,181,133,181,134,180,135,180,147,173,168,161,196,147,233,136,276,131,323,136,362,148,395,162,427,173,461,178,480,177,502,172,525,164,549,151,573,131,595,281,580,278,564,275,530,271,515,270,487,271,459,273,432,277,405,282,377,288,373,269,390,264,406,259,422,255,439,251,456,248,464, -247,473,245,481,242,487,239,489,234,483,219,466,204,441,191,409,181,373,177,333,182,298,194,265,208,231,220,194,225,162,223,133,217,105,206,78,189,49,166,76,131,99,151,123,164,146,172,168,177,188,178,221,173,253,162,287,148,325,136,373,131,415,136,452,147,480,161,501,173,513,180,514,180,515,181,523,181,525,179,527,175,528,171,528,165,527,147,526,130,524,112,523,94,522,74,541,71,546,113,554,155,564,197,579,237,599,275,599,154,599,200,326,200,319,201,314,203,310,206,308,210,307,214,307,218,311,226,317,234,330,247,342,260,353,274,364,287,374,301,360,314,338,289,314,264,288,241,261,220,232,200,180,200,174,201,169,203,165,206,163,210,163,218,164,222,166,226,172,234,184,247,197,260,208,274,219,287,230,301,216,314,187,283,156,252,124,225,88,200,49,180,49,173,88,154,123,130,156,102,187,72,215,41,229,54,219,68,208,82,196,96,184,109,165,128,163,132,162,135,162,138,163,143,166,147,170,150,175,153,180,154,233,154,261,135,288,113,314,90,338,66,360,41,373,54,364,68,353,82,341,96,329,109,316,121,313,125,310,128,308,132,306,138,308,143,311,147,315,150,320,153,325,154,316,152,290,175,266,199,242,224,221,251,202,280,202,339,204,344,208,347,211,349,216,350,219,350,231,344,235,340,248,328,262,316,275,304,289,293,302,283,316,297,284,325,254,356,226,389,202,425,182,463,175,463,155,425,131,389,103,356,73,326,42,298,55,284,69,294,97,316,110,328,123,341,127,344,130,347,133,349,136,350,140,351,144,350,152,342,155,337,155,280,136,251,115,224,92,199,67,175,42,152,55,138,69,148,83,160,97,171,110,184,123,196,127,200,133,204,136,205,140,205,144,204,148,201,152,197,155,192,155,-107,202,-107,202,193,204,199,208,202,211,205,219,205,223,204,227,202,231,199,235,195,248,183,262,171,275,159,289,148,302,138,599,180,561,200,525,225,492,252,461,283,433,314,419,301,429,287,440,274,451,260,463,247,476,234,482,226,484,221,485,218,486,214,485,210,483,206,480,203,475,201,468,200,416,200,387,220,360,241,335,264,310,289,287,314,288,314,273,301,284,287,295,274,307,260,331,234,335,230,337,226,339,221,340,218,341,214,340,210,338, -206,334,203,329,201,323,200,49,200,49,154,323,154,328,153,333,150,337,147,340,143,341,138,341,135,340,132,338,128,336,125,307,96,295,82,284,68,274,54,288,41,311,66,335,90,360,113,387,135,415,154,468,154,473,153,478,150,482,147,485,143,487,138,485,132,483,128,480,125,477,121,464,109,452,96,440,82,429,68,420,54,434,41,462,72,492,102,525,130,561,154,599,173,302,73,289,63,275,52,262,40,248,28,235,16,231,12,227,9,223,7,219,6,216,5,211,6,208,8,204,12,202,17,202,76,221,104,243,131,266,157,290,181,316,204,302,218,289,208,275,197,262,185,248,173,235,160,227,154,223,152,219,151,211,151,208,154,204,157,202,162,202,463,155,463,155,160,152,155,148,152,144,150,136,150,133,151,130,153,127,156,123,159,110,172,97,184,83,196,69,207,55,217,42,203,67,181,92,157,115,131,136,105,155,77,155,16,152,11,148,7,144,5,136,5,133,6,130,8,123,15,97,39,83,51,69,62,55,72,42,58,73,30,103,0,131,-33,155,-68,175,-107,182,-107,202,-68,226,-32,254,0,284,30,316,59,585,314,563,289,539,264,513,241,486,220,457,200,180,200,174,201,169,203,165,206,163,210,163,218,164,222,166,226,172,234,184,247,197,260,208,274,219,287,230,301,216,314,187,283,156,252,124,225,88,200,49,180,49,173,88,154,123,130,156,102,187,72,215,41,229,54,219,68,208,82,196,96,184,109,165,128,163,132,162,135,162,138,163,143,166,147,170,150,175,153,180,154,458,154,486,135,513,113,538,90,562,66,584,41,598,54,588,68,577,82,541,121,531,136,527,147,523,160,522,177,523,190,526,203,531,215,536,225,542,234,554,248,566,261,577,274,589,287,599,301,599,180,561,200,525,225,492,252,461,283,433,314,419,301,429,287,440,274,451,260,463,247,476,234,482,226,484,221,485,218,486,214,485,210,483,206,480,203,475,201,468,200,191,200,162,220,135,241,110,264,86,289,63,314,49,301,59,287,95,248,106,234,112,225,117,215,122,203,125,190,127,177,125,160,122,147,117,136,112,127,107,121,71,82,60,68,50,54,64,41,86,66,110,90,135,113,162,135,191,154,468,154,473,153,478,150,482,147,485,143,487,138,485,132,483,128,480,125,477, -121,464,109,452,96,440,82,429,68,420,54,434,41,462,72,492,102,525,130,561,154,599,173,600,40,600,315,565,315,565,200,180,200,174,201,169,203,165,206,163,210,163,218,164,222,166,226,172,234,184,247,197,260,230,302,216,315,187,283,156,253,124,225,88,200,49,180,49,173,88,154,123,129,156,101,187,71,215,40,229,53,219,67,208,82,196,95,184,109,165,128,163,132,162,135,162,143,164,147,168,150,173,153,180,154,565,154,565,40,316,-107,316,-72,202,-72,202,339,204,344,208,347,211,349,216,350,219,350,231,344,235,340,248,328,262,316,275,304,289,293,302,283,316,297,284,325,254,356,226,389,202,425,182,463,175,463,155,425,131,389,103,356,73,326,42,298,55,284,69,294,97,316,110,328,123,341,127,344,130,347,133,349,136,350,140,351,144,350,152,342,155,337,155,-72,42,-72,42,-107,600,180,561,200,526,225,493,253,463,283,434,315,420,302,430,288,441,273,465,245,484,226,486,222,488,216,487,211,481,203,475,201,469,200,84,200,84,315,49,315,49,40,84,40,84,154,468,154,475,153,480,151,484,148,486,144,487,140,485,132,483,128,477,120,464,107,440,81,429,67,420,53,434,40,462,71,493,101,526,129,561,154,600,173,316,428,316,463,42,463,42,428,155,428,155,17,153,12,149,8,146,6,141,5,138,6,134,7,130,9,126,12,122,16,109,28,95,40,82,52,68,63,55,73,41,59,73,30,103,0,131,-32,155,-68,175,-107,182,-107,202,-68,226,-33,254,0,284,30,315,58,302,72,288,62,274,51,260,39,234,15,227,8,224,6,221,5,217,5,213,6,209,9,205,14,203,19,202,23,202,428,316,-107,316,-72,182,-72,202,-33,226,2,254,34,284,65,315,93,302,107,288,97,274,86,260,74,234,50,227,43,224,41,221,40,217,40,213,41,209,43,205,47,203,52,202,58,202,339,204,344,208,347,211,349,216,350,219,350,231,344,235,340,248,328,262,316,275,304,289,293,302,283,316,297,284,325,254,356,226,389,202,425,182,463,175,463,155,425,131,389,103,356,73,326,42,298,55,284,69,294,97,316,110,328,123,341,127,344,130,347,133,349,136,350,140,351,148,349,152,345,155,340,155,52,153,47,149,43,146,41,138,41,134,42,130,44,126,47,122, -51,109,63,95,75,82,87,68,98,55,108,41,94,73,65,103,35,131,2,155,-33,175,-72,42,-72,42,-107,420,387,420,341,486,341,509,337,527,328,541,313,550,293,553,270,549,245,537,225,519,211,498,203,473,200,178,200,173,201,168,204,165,207,163,212,162,216,162,219,163,222,165,226,184,245,196,258,208,272,219,286,229,300,215,313,187,282,156,252,123,224,88,200,49,180,49,173,88,154,124,129,156,101,187,71,216,40,230,53,208,81,197,94,184,107,172,120,168,124,164,132,163,136,163,144,164,147,167,151,171,153,178,154,476,154,510,158,543,172,572,195,592,228,599,270,593,311,575,343,550,367,520,382,488,387,599,180,561,200,525,224,492,252,462,282,434,313,420,300,429,286,440,272,452,258,464,245,477,233,480,229,483,226,485,222,487,216,486,212,484,207,481,204,476,201,470,200,175,200,151,203,129,211,111,225,100,245,95,270,98,293,107,313,121,328,140,337,163,341,229,341,229,387,160,387,128,382,98,367,73,343,56,311,49,270,57,228,77,195,105,172,138,158,172,154,470,154,476,153,481,151,484,147,485,144,486,140,484,132,482,128,476,120,463,107,439,81,419,53,433,40,461,71,492,101,525,129,561,154,599,173,370,200,178,200,174,201,170,204,166,208,163,212,162,216,162,219,163,222,165,226,184,245,196,258,208,272,219,286,229,300,215,313,187,282,156,252,123,224,88,200,49,180,49,173,88,154,124,129,156,101,187,71,216,40,230,53,208,81,197,94,184,107,172,120,168,124,164,132,163,136,163,144,165,147,168,150,172,152,178,154,370,154,370,0,416,0,416,154,476,154,510,158,543,172,572,195,592,228,599,270,593,311,575,343,550,367,520,382,488,387,453,381,420,366,394,340,377,305,370,260,16383,16383,416,200,416,262,420,290,430,312,445,328,464,337,486,341,509,337,527,328,541,313,550,293,553,270,549,245,537,225,519,211,498,203,473,200,599,180,561,200,525,224,492,252,462,282,434,313,420,300,429,286,440,272,452,258,464,245,477,233,480,229,483,226,485,222,487,216,486,212,483,208,479,204,474,201,470,200,278,200,278,260,272,305,254,340,228,366,196,381,160,387,128,382,98,367,73,343,56,311,49,270,57,228,77,195,105,172,138,158,172,154,232, -154,232,0,278,0,278,154,470,154,476,152,481,150,484,147,485,144,486,140,484,132,482,128,476,120,463,107,439,81,419,53,433,40,461,71,492,101,525,129,561,154,599,173,16383,16383,232,200,175,200,151,203,129,211,111,225,100,245,95,270,98,293,107,313,121,328,140,337,163,341,184,337,203,328,218,312,228,290,232,262,805,180,767,200,731,225,698,252,668,283,639,314,625,301,635,287,646,274,658,260,670,247,683,234,689,226,691,221,692,218,692,210,689,206,686,203,681,201,674,200,632,200,604,192,583,174,566,152,551,133,534,126,513,141,496,179,478,223,454,260,420,276,386,260,362,223,344,179,327,141,307,126,290,134,274,152,257,174,236,192,208,200,166,200,159,201,154,203,150,206,148,210,148,218,149,222,152,226,154,230,158,234,182,260,194,274,205,287,215,301,201,314,172,283,142,252,109,225,73,200,34,180,34,173,73,154,109,130,141,102,172,72,200,41,214,54,204,68,193,82,181,96,169,109,150,128,148,132,147,135,147,138,148,142,151,146,155,150,160,153,164,154,208,154,229,146,247,128,265,106,284,87,307,80,338,95,362,132,381,177,399,214,420,230,441,214,459,177,478,132,502,95,534,80,556,87,575,106,593,128,611,146,632,154,677,154,680,153,685,150,689,146,692,142,693,138,693,135,691,132,689,128,687,125,671,109,659,96,647,82,636,68,626,54,640,41,668,72,698,102,731,130,767,154,805,173,622,180,583,200,548,225,515,253,484,283,455,315,441,302,451,288,463,273,487,245,506,226,507,222,509,216,507,211,504,207,500,203,495,201,491,200,353,200,402,315,364,315,316,200,158,200,151,201,146,203,143,206,141,210,140,214,140,218,144,226,150,234,163,247,175,260,197,288,207,302,193,315,164,283,134,253,101,225,65,200,27,180,27,173,65,154,101,130,134,102,164,72,192,41,206,54,197,68,186,82,174,96,162,109,149,121,145,125,143,128,141,132,139,135,139,138,140,143,144,147,148,150,153,153,158,154,296,154,248,41,286,41,334,154,490,154,497,153,502,151,505,148,507,144,508,140,506,132,502,124,498,120,462,81,451,68,441,54,455,41,484,72,514,102,548,130,583,154,622,173,316,224,145,224,315,436,273,463,42,178,225,178,115,16,109,10,106, -8,100,6,95,7,91,11,87,16,85,21,84,27,76,63,72,80,67,97,62,113,42,109,49,82,54,54,59,25,61,-3,62,-32,63,-32,60,-74,58,-88,55,-102,61,-107,99,-86,139,-70,181,-60,223,-52,265,-47,263,-29,237,-29,221,-30,189,-34,173,-37,161,-37,156,-35,153,-32,150,-27,149,-22,149,-19,150,-16,150,-14,151,-12,152,-11,297,-108,297,355,159,355,153,356,148,358,144,362,142,365,141,370,142,373,143,378,145,384,148,389,152,393,163,405,173,416,183,426,192,437,202,450,188,463,159,432,128,404,95,378,60,355,21,336,21,329,60,310,95,287,128,261,159,233,187,202,201,216,192,229,182,242,173,253,151,277,147,280,144,284,142,287,141,290,141,298,143,302,147,306,152,308,159,309,251,309,251,-108,303,336,264,355,229,378,196,404,165,432,137,463,123,450,132,437,141,426,150,416,173,393,176,389,179,384,181,378,182,373,183,370,182,365,180,362,177,358,172,356,165,355,27,355,27,-108,73,-108,73,309,165,309,172,308,177,306,181,302,183,298,184,294,183,290,182,287,180,284,177,280,173,277,151,253,142,242,132,229,123,216,138,202,166,233,196,261,229,287,264,310,303,329,293,0,293,463,247,463,247,46,155,46,149,47,144,50,140,53,138,57,138,65,139,68,141,72,143,75,147,79,158,91,169,102,179,114,188,127,198,140,184,153,155,123,125,94,92,68,56,45,17,27,17,20,56,0,92,-21,125,-47,156,-76,184,-107,198,-94,189,-81,180,-69,159,-48,148,-36,144,-31,142,-27,140,-22,139,-17,138,-13,139,-9,141,-5,145,-2,150,0,156,0,303,27,264,46,229,68,196,94,166,123,137,153,138,153,123,140,132,127,142,114,151,102,162,91,173,79,180,72,182,68,184,62,183,57,181,53,177,50,172,47,165,46,73,46,73,463,27,463,27,0,172,0,177,-2,180,-5,182,-9,183,-13,182,-17,181,-22,179,-27,176,-31,173,-36,150,-59,141,-69,132,-81,123,-94,137,-107,165,-76,196,-47,229,-21,264,0,303,20,586,73,572,63,558,52,519,16,515,12,511,9,507,7,499,5,495,6,491,8,488,11,486,16,485,23,485,463,49,463,49,417,439,417,439,23,438,16,436,11,432,7,428,5,420,5,417,6,414,8,410,11,394,27,381,39,367,51,353,62,339,72,326, -58,357,30,387,0,415,-33,439,-68,459,-107,466,-107,486,-68,510,-32,538,0,568,30,599,59,599,0,599,463,553,463,553,46,180,46,173,47,168,50,164,53,162,57,162,65,163,68,165,72,208,115,219,128,229,141,215,155,187,124,156,95,123,69,88,46,49,27,49,20,88,0,124,-22,156,-48,187,-77,216,-108,230,-95,208,-69,197,-57,184,-45,168,-29,166,-25,164,-20,163,-17,163,-9,165,-5,168,-2,174,0,180,0,617,134,605,210,571,275,519,327,454,361,380,373,303,361,236,327,184,275,150,210,138,134,136,122,134,117,131,114,127,113,124,113,121,114,118,116,99,135,86,147,72,159,58,170,44,180,30,166,61,137,90,107,116,74,138,39,157,0,164,0,183,39,205,74,231,107,260,138,291,166,277,180,263,171,250,160,237,148,223,136,204,117,201,115,198,114,196,113,192,114,189,116,186,120,184,127,184,135,193,196,221,249,263,290,316,318,377,327,439,318,492,290,534,249,561,196,571,134,604,180,590,170,576,159,562,147,549,135,530,116,527,114,525,113,522,113,517,114,514,117,512,122,511,128,511,134,499,210,464,275,412,327,345,361,269,373,194,361,129,327,77,275,43,210,30,134,77,134,87,196,115,249,157,290,210,318,271,327,332,318,386,290,427,249,455,196,465,135,464,127,462,120,460,116,456,114,452,113,450,114,447,115,442,120,438,123,425,136,412,148,398,160,385,171,371,180,358,166,389,138,417,107,443,74,465,39,484,0,491,0,510,39,533,74,558,107,587,137,617,166,599,466,599,513,44,513,44,466,16383,16383,610,-76,149,385,145,391,144,394,144,401,146,405,148,406,151,409,154,411,159,413,168,413,186,414,203,415,221,416,239,418,256,420,256,441,244,439,232,439,220,438,164,438,133,441,103,446,73,453,44,463,38,459,48,430,55,400,60,370,63,339,64,309,64,284,63,272,63,259,62,247,82,245,85,263,87,281,88,298,89,316,89,343,90,347,91,350,94,354,102,358,105,358,107,357,110,357,112,355,115,353,117,352,577,-108,606,266,606,313,206,313,196,317,193,322,191,327,192,331,193,334,194,338,201,345,212,357,222,368,232,380,240,392,249,405,235,419,208,388,179,360,149,334,115,312,77,293,77,419,42,419,42,159,77,159,77,286,115,267,149, -244,179,218,207,190,235,159,249,173,241,185,232,197,223,208,201,232,197,236,195,240,193,245,192,249,191,252,192,256,194,260,198,263,203,265,209,266,16383,16383,606,-63,606,195,571,195,571,69,533,88,500,111,469,137,441,165,413,195,399,181,408,169,417,158,426,146,436,134,448,122,454,114,456,110,457,106,457,102,456,98,454,94,451,91,446,89,439,88,42,88,42,42,443,42,448,40,452,37,456,32,457,27,457,23,456,20,454,17,448,9,436,-1,426,-13,417,-24,399,-50,413,-63,441,-33,469,-4,500,20,533,43,571,62,571,-63,572,480,534,464,495,449,455,437,415,429,373,427,365,427,362,420,389,387,411,350,430,312,446,272,459,230,477,237,474,254,464,288,459,304,453,321,451,327,450,329,449,332,449,334,450,339,452,344,455,347,459,349,463,350,467,350,468,349,470,348,471,348,500,322,523,290,540,254,551,216,555,178,544,111,513,53,466,7,407,-23,340,-33,273,-23,215,6,168,52,138,110,127,177,134,230,154,280,186,324,228,359,277,383,261,426,201,398,151,356,114,304,90,243,81,178,95,96,131,25,188,-30,259,-67,341,-80,423,-67,494,-30,551,25,588,96,601,178,598,215,590,250,577,285,560,318,538,348,529,358,519,368,508,377,498,386,487,395,485,396,483,398,481,402,481,405,482,407,482,410,483,412,489,418,492,419,494,421,500,423,516,431,532,438,564,454,580,463,405,383,454,359,496,324,528,280,548,230,555,177,544,110,514,52,467,6,408,-23,341,-33,274,-23,215,7,169,53,138,111,127,178,131,216,142,254,159,290,182,322,211,348,212,349,213,349,215,350,219,350,223,349,227,347,230,344,232,334,232,332,231,329,231,327,229,321,223,304,218,288,208,254,205,237,223,230,236,272,252,312,271,350,293,387,320,420,317,427,309,427,267,429,226,437,187,449,148,464,110,480,102,463,118,454,150,438,166,431,182,423,188,421,190,419,193,418,199,412,200,410,201,407,201,402,199,398,197,396,195,395,173,377,163,368,153,358,144,348,122,318,105,285,92,250,84,215,81,178,95,96,131,25,188,-30,259,-67,341,-80,423,-67,494,-30,551,25,588,96,601,178,592,243,568,304,530,356,480,398,420,426,630,154,630,200,207,200,193,201,185,205,180,210,178,216,177,223,182,237,196, -255,215,278,238,303,263,330,246,346,169,269,130,232,87,195,37,157,38,157,38,154,630,154,630,200,38,200,38,198,87,159,130,122,169,85,207,48,246,9,263,23,238,51,215,76,196,99,182,117,177,131,178,138,180,144,185,149,193,153,207,154,309,297,276,324,243,354,210,388,182,424,159,463,155,463,155,-108,202,-108,202,332,203,337,205,340,208,342,212,343,215,343,221,339,225,337,228,333,241,321,255,311,268,302,282,292,295,283,202,-108,202,463,198,463,175,424,147,388,114,354,81,324,48,297,62,283,75,292,89,302,102,311,116,321,129,333,132,337,136,339,142,343,145,343,149,342,152,340,154,337,155,332,155,-108,630,154,630,157,582,195,539,232,500,269,462,307,422,346,406,330,431,303,454,278,473,255,486,237,491,223,491,216,489,210,483,205,475,201,461,200,38,200,38,154,630,200,38,200,38,154,461,154,475,153,483,149,489,144,491,138,491,131,486,117,473,99,454,76,431,51,406,23,422,9,462,48,500,85,539,122,582,159,630,198,295,71,282,62,268,53,255,43,241,33,228,21,225,18,221,15,215,11,212,11,208,12,205,14,203,18,202,23,202,463,155,463,155,-108,159,-108,182,-69,210,-33,243,0,276,30,309,57,202,-108,202,463,155,463,155,21,154,16,152,13,149,11,145,10,139,12,136,14,132,16,129,20,116,31,102,42,89,51,75,61,62,70,48,56,81,29,114,0,147,-33,175,-69,198,-108,599,293,561,312,525,334,493,360,462,388,434,419,420,405,430,392,450,368,462,357,473,345,480,338,482,334,483,331,483,327,482,322,478,317,474,315,469,313,56,313,56,266,465,266,472,265,477,263,480,260,482,256,483,252,482,249,481,245,479,240,477,236,461,220,450,208,440,197,420,173,434,159,463,190,493,218,525,244,561,267,599,286,16383,16383,593,42,593,88,184,88,178,89,172,91,169,94,166,98,166,106,167,110,170,114,172,118,188,134,199,146,209,158,219,169,229,181,215,195,186,165,156,137,124,111,89,88,50,69,50,62,89,43,124,20,157,-4,187,-33,215,-63,229,-50,209,-24,199,-13,188,-1,176,9,172,13,169,17,167,20,166,23,166,27,167,32,170,37,175,40,180,42,185,42,506,71,492,61,479,50,465,39,452,27,439,14,431,8,423,4,420, -4,415,5,412,7,408,11,406,16,405,23,405,456,359,456,359,22,358,15,356,10,352,6,348,4,344,3,340,4,337,5,334,7,330,10,314,26,301,38,287,50,273,61,259,70,245,57,277,28,307,-1,335,-34,359,-70,379,-108,386,-108,406,-70,430,-34,458,-1,488,28,520,57,16383,16383,295,297,264,325,234,356,206,389,182,425,162,463,155,463,135,425,111,389,83,356,53,326,22,298,35,284,49,294,77,316,90,328,102,341,110,347,113,349,116,350,120,351,124,350,128,348,132,345,134,340,135,333,135,-101,181,-101,181,332,182,339,184,344,187,348,195,350,199,350,211,344,215,340,241,316,255,304,268,293,282,283,593,266,593,313,180,313,170,317,167,322,166,327,166,331,167,334,169,338,199,368,219,392,229,405,215,419,187,388,157,360,124,334,89,312,50,293,50,286,89,267,124,244,156,218,186,190,215,159,229,173,209,197,199,208,188,220,172,236,170,240,167,245,166,249,166,256,169,260,172,263,178,265,184,266,16383,16383,599,69,561,88,525,111,493,137,463,165,434,195,420,181,430,169,440,158,450,146,461,134,477,118,481,110,483,102,482,98,480,94,477,91,472,89,465,88,56,88,56,42,469,42,474,40,478,37,482,32,483,27,483,23,482,20,480,17,477,13,473,9,462,-1,450,-13,440,-24,420,-50,434,-63,462,-33,493,-4,525,20,561,43,599,62,599,42,599,88,184,88,178,89,172,91,169,94,166,98,166,106,167,110,170,114,172,118,176,122,184,131,203,150,214,163,227,177,214,194,202,207,192,217,183,225,171,237,169,240,167,244,166,247,166,251,167,255,170,259,174,262,179,265,184,266,599,266,599,313,178,313,172,315,169,319,166,322,166,330,167,334,170,338,172,342,188,358,199,370,210,381,220,393,230,406,216,420,187,389,156,360,124,334,88,312,49,293,49,286,84,269,115,250,145,228,173,204,198,177,173,151,145,127,115,105,83,85,49,69,49,62,88,43,123,20,156,-4,187,-33,215,-63,229,-50,209,-24,199,-13,188,-1,176,9,172,13,169,17,167,20,166,23,166,31,168,35,172,39,177,41,184,42,513,297,482,325,453,356,427,389,405,425,386,463,379,463,362,429,343,397,321,367,297,339,270,313,244,339,220,367,198,397,178,429,162,463,155,463,136,425,113, -389,88,356,59,326,29,298,42,284,55,293,68,303,79,314,91,325,102,337,110,343,113,345,116,346,120,347,124,346,128,344,132,341,134,336,135,329,135,-108,181,-108,181,328,182,335,184,340,187,344,191,346,195,347,203,345,207,343,215,337,243,309,255,298,270,285,287,299,300,310,319,329,327,338,330,341,334,344,337,346,340,347,344,347,348,346,352,343,356,338,358,333,359,329,359,-108,405,-108,405,328,406,335,408,340,412,344,415,346,420,347,423,346,427,345,431,343,439,337,463,313,474,303,486,293,499,283,599,69,565,85,533,105,503,127,475,151,449,177,475,204,503,228,533,250,565,269,599,286,599,293,561,312,525,334,492,360,461,389,433,420,419,406,428,393,438,381,449,370,460,358,473,346,479,338,481,334,482,330,482,327,481,322,479,319,476,315,471,313,49,313,49,266,465,266,469,265,474,262,478,259,481,255,482,251,482,247,481,244,479,240,477,237,465,225,456,217,446,207,434,194,420,177,434,162,445,150,473,122,479,114,481,110,482,106,482,102,481,98,479,94,476,91,471,89,464,88,49,88,49,42,465,42,471,41,476,39,480,35,482,27,482,23,481,20,479,17,473,9,461,-1,449,-13,439,-24,429,-37,420,-50,434,-63,462,-33,492,-4,525,20,561,43,599,62,499,71,486,62,474,51,463,41,439,17,431,11,427,9,423,8,415,8,412,11,408,14,406,19,405,26,405,463,359,463,359,25,358,21,356,16,352,12,348,9,344,8,340,8,337,9,334,11,330,14,300,44,287,55,270,70,255,56,243,45,215,17,207,11,203,9,199,8,191,8,187,11,184,14,182,19,181,26,181,463,135,463,135,25,134,18,132,14,128,10,124,8,116,8,113,9,110,11,102,17,91,29,79,40,68,51,55,61,42,70,29,57,59,28,88,-1,113,-34,136,-70,155,-108,162,-108,178,-74,198,-42,220,-13,244,14,270,41,297,15,321,-12,343,-42,362,-74,379,-108,386,-108,405,-70,427,-34,453,-1,482,28,513,57,599,224,599,270,188,270,181,271,176,272,172,273,170,276,170,283,171,287,173,290,176,293,179,297,191,310,201,323,211,337,220,350,230,364,216,377,189,345,158,311,125,279,88,250,49,227,49,224,16383,16383,599,130,49,130,49,84,468,84,473,83,476,81,478,78,479,74,477, -68,475,65,469,57,457,44,437,18,428,4,419,-9,433,-22,460,9,490,43,524,75,560,104,599,127,599,224,599,227,560,250,524,279,490,311,460,345,433,377,419,364,428,350,437,337,447,323,457,310,469,297,472,293,475,290,477,287,478,283,479,280,478,276,476,273,473,272,468,271,461,270,49,270,49,224,16383,16383,599,84,599,130,49,130,49,127,88,104,125,75,158,43,189,9,216,-22,230,-9,220,4,211,18,191,44,179,57,173,65,171,68,170,71,170,78,172,81,176,83,181,84,188,84,606,84,606,130,459,130,502,224,606,224,606,270,522,270,576,386,537,386,484,270,263,270,257,271,252,274,248,278,246,282,245,286,246,293,248,299,251,304,255,309,271,325,282,337,292,348,303,360,313,372,298,386,248,340,197,297,145,257,93,219,42,180,42,173,146,97,198,57,249,15,298,-30,313,-16,302,-4,278,22,261,39,255,46,250,51,247,57,246,62,245,69,246,72,248,77,252,80,257,83,263,84,399,84,347,-29,386,-29,438,84,16383,16383,463,224,420,130,162,130,149,139,138,148,129,158,123,167,121,177,123,187,129,197,138,207,149,216,163,224,634,180,607,200,568,231,520,270,467,315,414,362,395,345,406,334,418,323,430,311,438,299,441,285,441,281,439,277,435,274,429,271,422,270,359,270,376,362,340,362,323,270,226,270,219,271,213,272,207,274,204,278,202,284,206,294,215,306,228,320,241,333,252,346,237,362,184,315,130,271,82,232,41,201,14,180,14,173,41,155,82,124,131,85,184,40,237,-6,252,9,237,26,224,40,213,51,206,61,204,71,205,77,207,81,212,83,219,84,291,84,275,-6,311,-6,327,84,432,84,438,82,441,80,443,77,443,73,439,60,430,46,418,32,405,19,395,8,414,-6,465,41,518,86,567,124,607,154,634,173,16383,16383,334,130,352,224,515,224,539,206,547,196,553,187,555,177,553,167,547,157,538,148,527,139,514,130,16383,16383,316,224,299,130,133,130,120,139,109,149,100,158,94,168,92,177,95,187,101,197,109,207,121,216,134,224,606,180,555,219,503,257,451,297,400,340,350,386,335,372,346,360,356,348,367,337,377,325,393,309,401,299,402,293,403,286,402,282,400,278,397,274,392,271,385,270,248,270,301,386,263,386,209,270,42,270,42,224,188, -224,145,130,42,130,42,84,124,84,73,-30,111,-30,163,84,385,84,392,83,397,80,400,77,402,72,403,69,403,62,401,57,398,51,393,46,387,39,370,22,359,9,346,-4,335,-16,350,-30,400,15,451,57,503,97,554,135,606,173,16383,16383,184,130,227,224,486,224,499,216,510,207,519,197,525,187,527,177,525,167,519,158,510,148,499,139,487,130,606,84,606,130,162,130,149,139,138,148,129,158,123,167,121,177,123,187,129,197,138,207,149,216,163,224,606,224,606,270,263,270,257,271,252,274,248,278,246,282,245,286,246,293,248,299,251,304,255,309,271,325,282,337,292,348,303,360,313,372,298,386,248,340,197,297,145,257,93,219,42,180,42,173,146,97,198,57,249,15,298,-30,313,-16,302,-4,278,22,261,39,255,46,250,51,247,57,246,62,245,69,246,72,248,77,252,80,257,83,263,84,448,207,402,257,360,308,320,360,282,412,244,463,237,463,198,412,160,360,120,308,78,257,31,207,45,192,58,203,72,216,85,228,102,245,109,251,114,255,120,258,125,260,131,260,135,259,139,257,143,254,146,249,147,242,147,-108,193,-108,193,344,202,357,211,368,220,377,230,382,240,384,250,382,260,377,269,368,278,356,287,343,287,-108,333,-108,333,242,334,249,337,254,341,257,345,259,348,260,355,260,361,258,366,256,377,245,388,235,399,224,411,213,423,203,434,192,606,180,555,219,503,257,451,297,400,340,350,386,335,372,346,360,356,348,367,337,377,325,393,309,401,299,402,293,403,286,402,282,400,278,397,274,392,271,385,270,42,270,42,224,486,224,499,216,510,207,519,197,525,187,527,177,525,167,519,158,510,148,499,139,487,130,42,130,42,84,385,84,392,83,397,80,400,77,402,72,403,69,403,62,401,57,398,51,393,46,387,39,370,22,359,9,346,-4,335,-16,350,-30,400,15,451,57,503,97,554,135,606,173,434,162,423,151,411,141,399,130,388,120,371,103,366,99,361,96,355,94,345,94,341,96,337,100,334,105,333,112,333,463,287,463,287,11,278,-1,269,-12,260,-21,250,-27,240,-29,230,-27,220,-21,211,-13,202,-1,193,10,193,463,147,463,147,112,146,105,143,100,139,96,135,94,125,94,120,96,114,99,109,104,102,110,85,127,72,138,58,151,45,162,31,147,78,97,120, -46,160,-5,198,-57,237,-108,244,-108,282,-57,320,-5,360,46,402,97,448,147,634,180,607,200,568,231,520,270,467,315,414,362,395,345,406,334,418,323,430,311,438,299,441,285,441,281,439,277,435,274,429,271,422,270,226,270,219,271,213,272,207,274,204,278,202,284,206,294,215,306,228,320,241,333,252,346,237,362,184,315,130,271,82,232,41,201,14,180,14,173,41,155,82,124,131,85,184,40,237,-6,252,9,237,26,224,40,213,51,206,61,204,71,205,77,207,81,212,83,219,84,432,84,438,82,441,80,443,77,443,73,439,60,430,46,418,32,405,19,395,8,414,-6,465,41,518,86,567,124,607,154,634,173,16383,16383,133,130,120,139,109,149,100,158,94,168,92,177,95,187,101,197,109,207,121,216,134,224,515,224,539,206,547,196,553,187,555,177,553,167,547,157,538,148,527,139,514,130,434,114,423,104,411,93,399,83,388,72,377,62,366,51,361,48,355,47,348,46,345,47,341,49,337,52,334,57,333,64,333,290,334,297,337,302,341,305,345,307,348,308,355,307,361,306,366,303,371,299,399,271,411,261,423,250,434,240,448,255,402,305,360,356,320,408,282,460,244,511,237,511,198,459,160,407,120,356,78,305,31,255,45,240,58,251,72,263,85,275,102,292,109,298,114,303,120,306,125,307,131,308,135,307,139,305,143,302,146,297,147,290,147,64,146,57,143,52,139,49,135,47,131,46,125,47,120,48,114,52,109,56,102,63,95,69,85,79,72,91,58,103,45,114,31,99,78,49,120,0,160,-52,198,-104,237,-156,244,-156,282,-105,320,-53,360,-1,402,49,448,99,16383,16383,287,-36,278,-49,269,-60,260,-69,250,-74,240,-76,230,-74,220,-69,211,-60,202,-49,193,-36,193,391,202,404,211,415,220,424,230,430,240,432,250,430,260,424,269,415,278,404,287,391,612,23,263,370,261,373,260,376,259,378,258,381,258,388,259,391,260,392,261,394,266,398,270,401,276,403,308,403,338,405,370,407,370,427,302,430,236,436,171,444,107,454,44,463,38,459,58,331,66,266,72,200,75,132,95,132,97,149,97,167,98,184,98,209,100,229,104,237,109,242,118,245,121,244,123,244,126,242,129,241,131,239,480,-108,513,-76,92,343,89,364,89,371,88,377,89,384,91,396,94,400,98,405,102, -408,107,411,113,413,119,414,132,414,139,413,145,412,152,411,159,409,580,-9,607,463,544,454,480,444,415,436,348,430,280,427,280,407,312,405,327,404,343,403,374,403,380,401,384,398,389,394,390,392,391,391,392,388,393,386,393,381,392,378,391,376,387,370,38,23,70,-9,491,409,498,411,512,413,518,414,531,414,538,413,544,411,549,408,553,405,557,400,559,396,561,390,562,384,562,371,558,343,138,-76,170,-108,519,239,521,241,524,242,527,244,530,244,532,245,541,242,546,237,550,229,552,209,552,184,553,167,554,149,555,132,576,132,578,200,584,266,592,331,612,459,612,-104,602,-40,592,23,584,88,578,154,576,222,555,222,554,205,553,187,552,170,552,145,551,135,550,126,546,118,541,112,532,110,530,110,521,113,519,116,170,463,138,431,558,11,559,4,560,-2,562,-16,562,-22,561,-29,561,-35,557,-45,553,-50,549,-53,544,-56,538,-57,531,-58,512,-58,505,-57,498,-55,491,-54,70,365,38,332,387,-15,389,-18,391,-20,393,-26,393,-31,389,-39,384,-43,380,-46,374,-48,343,-48,327,-49,312,-50,296,-50,280,-51,280,-72,348,-74,415,-81,480,-89,544,-99,607,-108,612,332,580,365,159,-54,152,-55,145,-57,139,-58,119,-58,107,-56,102,-53,98,-50,94,-45,91,-40,90,-35,89,-29,88,-22,89,-16,89,-9,90,-2,91,4,92,11,513,431,480,463,131,116,129,113,123,111,121,110,118,110,109,112,104,118,100,126,99,135,98,145,98,170,97,187,97,205,95,222,75,222,72,154,66,88,58,23,48,-40,38,-104,44,-108,107,-99,171,-89,236,-81,302,-74,370,-72,370,-51,354,-50,338,-50,308,-48,276,-48,270,-46,266,-43,261,-39,258,-33,258,-26,260,-20,261,-18,263,-15,596,14,596,60,200,60,191,72,179,86,166,100,154,112,144,121,140,125,137,130,135,133,134,136,134,142,137,146,141,149,146,152,152,154,596,154,596,200,152,200,145,201,140,203,137,206,135,210,134,214,136,222,138,226,141,230,155,244,166,256,178,269,190,281,201,294,596,294,596,340,234,340,234,342,250,364,266,385,281,406,293,425,303,441,287,451,248,395,202,338,150,281,94,228,32,180,32,173,101,118,161,61,211,4,253,-49,286,-97,302,-85,293,-69,280,-51,266,-30,250,-8,233,13,233,14,616,180,547,236,487,293,437,350,395, -403,362,452,346,441,356,425,368,406,382,385,398,363,415,341,415,340,52,340,52,294,448,294,457,282,469,269,482,255,495,242,505,233,509,229,512,225,514,221,515,218,515,216,514,212,511,208,508,205,503,202,497,200,52,200,52,154,495,154,502,153,508,151,511,148,513,144,514,140,514,136,510,128,504,120,482,98,458,72,448,60,52,60,52,14,414,14,414,12,382,-30,368,-51,355,-69,345,-85,361,-96,400,-40,446,16,497,72,554,126,616,173,606,154,606,200,506,200,464,154,380,276,294,154,252,200,173,200,167,201,162,203,158,206,156,210,155,214,157,222,161,230,165,234,177,247,190,260,201,274,212,287,223,301,209,314,180,283,149,252,117,225,81,200,42,180,42,173,81,154,116,130,149,102,180,72,208,41,222,54,212,68,201,82,189,96,177,109,158,128,156,132,155,135,155,138,156,142,159,146,163,150,168,153,172,154,230,154,294,80,380,200,464,80,527,154,606,180,568,200,532,225,499,252,468,283,440,314,426,301,436,287,447,274,458,260,470,247,483,234,489,226,491,221,493,218,493,214,492,210,490,206,487,203,481,201,474,200,396,200,354,154,267,276,184,154,142,200,42,200,42,154,122,154,184,80,267,200,354,80,419,154,477,154,480,153,485,150,489,146,492,142,494,138,492,132,490,128,487,125,484,121,471,109,459,96,447,82,436,68,427,54,441,41,469,72,499,102,532,130,568,154,606,173,316,53,316,88,202,88,202,144,316,144,316,178,202,178,202,339,204,344,208,347,211,349,216,350,219,350,231,344,235,340,248,328,262,316,275,304,289,293,302,283,316,297,284,325,254,356,226,389,202,425,182,463,175,463,155,425,131,389,103,356,73,326,42,298,55,284,69,294,97,316,110,328,123,341,127,344,130,347,133,349,136,350,140,351,144,350,152,342,155,337,155,178,42,178,42,144,155,144,155,88,42,88,42,53,155,53,155,-108,202,-108,202,53,302,71,289,61,275,50,262,39,248,27,235,14,227,8,219,4,216,4,211,5,208,7,204,11,202,16,202,176,316,176,316,211,202,211,202,266,316,266,316,301,202,301,202,463,155,463,155,301,42,301,42,266,155,266,155,211,42,211,42,176,155,176,155,17,152,12,144,4,140,3,136,4,133,5,130,7,127,10,123, -13,110,26,97,38,83,50,69,61,55,70,42,57,73,28,103,-1,131,-34,155,-70,175,-108,182,-108,202,-70,226,-34,254,-1,284,28,316,57,606,154,606,200,531,200,531,154,16383,16383,488,154,488,200,414,200,414,154,16383,16383,371,154,371,200,296,200,296,154,16383,16383,253,154,253,200,173,200,167,201,162,203,158,206,156,210,155,214,157,222,161,230,165,234,177,247,190,260,201,274,212,287,223,301,209,314,180,283,149,252,117,225,81,200,42,180,42,173,81,154,116,130,149,102,180,72,208,41,222,54,212,68,201,82,189,96,177,109,158,128,156,132,155,135,155,138,156,143,159,147,163,150,168,153,173,154,316,297,284,325,254,356,226,389,202,425,182,463,175,463,155,425,131,389,103,356,73,326,42,298,55,284,69,294,97,316,110,328,123,341,127,344,130,347,133,349,136,350,140,351,144,350,152,342,155,337,155,254,202,254,202,339,204,344,208,347,211,349,216,350,219,350,231,344,235,340,248,328,262,316,275,304,289,293,302,283,16383,16383,202,133,202,208,155,208,155,133,16383,16383,202,12,202,87,155,87,155,12,16383,16383,202,-108,202,-33,155,-33,155,-108,606,180,568,200,532,225,499,252,468,283,440,314,426,301,436,287,447,274,458,260,470,247,483,234,489,226,491,221,493,218,493,214,492,210,490,206,487,203,481,201,474,200,395,200,395,154,475,154,482,153,487,150,491,147,493,143,494,138,492,132,490,128,487,125,484,121,471,109,459,96,447,82,436,68,427,54,441,41,469,72,499,102,532,130,568,154,606,173,16383,16383,352,154,352,200,277,200,277,154,16383,16383,234,154,234,200,159,200,159,154,16383,16383,117,154,117,200,42,200,42,154,202,388,202,463,155,463,155,388,16383,16383,202,267,202,342,155,342,155,267,16383,16383,202,146,202,221,155,221,155,146,16383,16383,302,71,289,61,275,50,262,39,248,27,235,14,227,8,219,4,216,4,211,5,208,7,204,11,202,16,202,100,155,100,155,15,152,10,148,6,144,4,140,3,136,4,133,5,130,7,127,10,123,13,110,26,97,38,83,50,69,61,55,70,42,57,73,28,103,-1,131,-34,155,-70,175,-108,182,-108,202,-70,226,-34,254,-1,284,28,316,57,606,154,606,200,209,200,202,201,197,203,193,206,191,210,191,218,192,222,194,226,200, -234,213,247,225,260,236,274,248,288,258,302,244,315,215,283,185,253,152,225,116,200,77,180,77,315,42,315,42,41,77,41,77,173,116,154,152,130,184,102,215,72,243,41,257,54,247,68,236,82,224,96,212,109,199,121,196,125,193,128,191,132,190,135,190,138,191,143,194,147,198,150,203,153,208,154,606,41,606,315,571,315,571,180,532,200,497,225,464,253,433,283,405,315,391,302,401,288,412,274,424,260,448,234,454,226,456,221,457,218,458,214,457,210,455,206,452,203,447,201,440,200,42,200,42,154,441,154,445,153,450,150,454,147,457,143,459,138,457,132,455,128,436,109,424,96,412,82,401,68,391,54,405,41,434,72,464,102,497,130,532,154,571,173,571,41,606,84,606,270,313,270,313,379,298,386,248,340,197,297,145,257,93,219,42,180,42,173,146,97,198,57,249,15,298,-30,313,-23,313,84,16383,16383,571,119,277,119,277,37,162,127,149,137,138,146,129,156,123,167,121,177,123,188,130,198,139,208,150,218,162,228,277,316,277,235,571,235,448,207,402,257,360,308,320,360,282,412,244,463,237,463,198,412,160,360,120,308,78,257,31,207,38,193,147,193,147,-108,333,-108,333,193,441,193,16383,16383,380,228,298,228,298,-73,182,-73,182,228,100,228,190,344,200,356,209,367,219,376,229,382,240,384,251,382,261,376,272,366,282,355,291,344,606,180,555,219,503,257,451,297,400,340,350,386,336,379,336,270,42,270,42,84,336,84,336,-23,350,-30,400,15,451,57,503,97,554,135,606,173,16383,16383,371,37,371,119,77,119,77,235,371,235,371,316,487,228,509,208,519,198,525,188,527,177,525,167,519,156,510,146,499,137,487,127,441,161,333,161,333,463,147,463,147,161,38,161,31,147,78,97,120,46,160,-5,198,-57,237,-108,244,-108,282,-57,320,-5,360,46,402,97,448,147,16383,16383,380,126,291,10,282,-1,272,-12,261,-21,251,-27,240,-29,229,-27,219,-21,209,-12,200,-1,190,10,100,126,182,126,182,428,298,428,298,126,448,227,402,277,360,328,320,380,282,432,244,483,237,483,198,431,160,379,120,327,78,276,31,227,38,213,147,213,147,30,333,30,333,213,441,213,16383,16383,380,248,298,248,298,64,182,64,182,248,100,248,190,363,200,376,209,387,219,396,229,402,240,404,251, -402,261,395,272,386,282,375,291,363,16383,16383,333,-128,333,-15,147,-15,147,-128,16383,16383,298,-93,182,-93,182,-50,298,-50,599,180,561,200,525,224,492,252,462,282,434,313,420,300,429,286,440,272,452,258,464,245,477,233,480,229,483,226,485,222,487,216,485,211,482,207,478,203,473,201,468,200,380,200,370,228,353,252,331,270,304,282,273,286,244,282,217,270,195,252,178,228,168,200,49,200,49,154,168,154,178,127,195,104,217,86,244,74,273,70,303,74,330,86,352,104,369,127,379,154,468,154,475,153,480,151,483,148,485,144,486,140,484,132,482,128,476,120,463,107,439,81,419,53,433,40,461,71,492,101,525,129,561,154,599,173,16383,16383,205,200,212,216,223,230,238,241,255,248,273,251,292,248,309,241,324,230,335,216,343,200,16383,16383,342,154,335,138,323,124,309,114,292,107,273,105,255,107,238,114,224,124,212,138,205,154,520,297,488,325,458,356,430,389,406,425,386,463,379,463,359,425,335,389,307,356,277,326,245,298,259,284,273,294,301,316,314,328,330,344,334,347,337,349,340,350,344,351,348,350,352,348,356,344,358,339,359,333,359,-101,405,-101,405,332,406,339,408,344,412,347,415,349,420,350,423,350,435,344,439,340,465,316,479,304,492,293,506,283,16383,16383,282,71,268,61,255,50,241,39,228,27,215,14,207,8,199,4,195,4,187,6,184,10,182,15,181,23,181,456,135,456,135,22,134,15,132,10,128,6,124,4,120,3,116,4,113,5,110,7,102,13,90,26,76,38,63,50,49,61,35,70,22,57,53,28,83,-1,111,-34,135,-70,155,-108,162,-108,182,-70,206,-34,234,-1,264,28,295,57,606,-29,572,-12,541,6,511,26,483,48,457,72,483,95,511,118,540,138,572,157,606,173,606,180,572,197,541,216,511,236,483,259,457,282,483,305,511,328,540,349,572,367,606,384,606,391,568,410,532,432,499,458,468,486,440,517,426,504,435,491,445,479,456,468,467,456,480,444,486,436,488,432,489,428,489,424,488,420,486,416,483,413,478,411,471,410,42,410,42,364,472,364,476,363,481,361,485,357,488,353,489,348,489,345,488,342,487,340,480,333,426,282,440,268,452,257,462,248,471,240,483,228,486,224,488,221,489,217,489,214,488,210,486,206,482,203,477,201,471,200,42, -200,42,154,472,154,477,153,482,150,485,147,488,143,489,138,489,135,487,129,484,126,480,123,426,72,440,58,452,47,462,38,471,30,483,18,486,14,488,11,489,7,489,4,488,0,486,-3,483,-6,478,-8,471,-9,42,-9,42,-55,472,-55,478,-56,483,-58,487,-62,489,-70,489,-74,488,-77,486,-81,483,-84,480,-88,468,-100,456,-111,436,-135,427,-148,441,-162,469,-131,499,-102,532,-77,568,-54,606,-36,606,154,606,200,391,200,391,315,356,315,356,200,173,200,167,201,162,203,158,206,156,210,155,214,157,222,161,230,165,234,177,247,190,260,223,302,209,315,180,283,149,253,117,225,81,200,42,180,42,173,81,154,116,130,149,102,180,72,208,41,222,54,212,68,201,82,189,96,177,109,158,128,156,132,155,135,155,138,156,143,159,147,163,150,168,153,173,154,356,154,356,41,391,41,391,154,602,180,564,200,528,225,495,253,464,283,436,315,422,302,432,288,443,274,455,260,467,247,480,234,486,226,488,221,489,218,489,214,488,210,486,206,483,203,478,201,471,200,292,200,292,315,257,315,257,200,38,200,38,154,257,154,257,41,292,41,292,154,472,154,476,153,486,147,489,143,490,138,490,135,489,132,487,128,468,109,456,96,444,82,433,68,423,54,437,41,465,72,495,102,528,130,564,154,602,173,615,180,576,200,541,225,508,253,477,283,448,315,434,302,444,288,456,273,480,245,499,226,500,222,502,216,500,211,497,207,493,203,488,201,484,200,341,200,341,315,306,315,306,200,165,200,158,201,153,203,150,206,148,210,147,214,147,218,151,226,157,234,170,247,182,260,204,288,214,302,200,315,171,283,141,253,108,225,72,200,34,180,34,173,72,154,108,130,141,102,171,72,199,41,213,54,204,68,193,82,181,96,169,109,156,121,152,125,150,128,148,132,146,135,146,138,147,143,151,147,155,150,160,153,165,154,306,154,306,41,341,41,341,154,483,154,490,153,495,151,499,148,501,144,502,140,500,132,498,128,495,124,491,120,455,81,444,68,434,54,448,41,477,72,507,102,540,130,576,154,615,173,606,154,606,200,448,200,448,315,414,315,414,200,359,200,359,315,323,315,323,200,173,200,167,201,162,203,158,206,156,210,155,214,157,222,161,230,165,234,177,247,190,260,223,302,209,315,180, -283,149,253,117,225,81,200,42,180,42,173,81,154,116,130,149,102,180,72,208,41,222,54,212,68,201,82,189,96,177,109,158,128,156,132,155,135,155,138,156,143,159,147,163,150,168,153,173,154,323,154,323,41,359,41,359,154,414,154,414,41,448,41,448,154,606,180,568,200,532,225,499,253,468,283,440,315,426,302,436,288,458,260,470,247,483,234,489,226,491,221,493,218,493,214,492,210,490,206,487,203,481,201,474,200,325,200,325,315,290,315,290,200,234,200,234,315,199,315,199,200,42,200,42,154,199,154,199,41,234,41,234,154,290,154,290,41,325,41,325,154,475,154,480,153,485,150,489,147,492,143,494,138,492,132,490,128,487,125,484,121,471,109,459,96,447,82,436,68,427,54,441,41,469,72,499,102,532,130,568,154,606,173,622,180,583,200,548,225,515,253,484,283,455,315,441,302,451,288,463,273,487,245,506,226,507,222,509,216,507,211,504,207,500,203,495,201,491,200,387,200,387,315,352,315,352,200,297,200,297,315,262,315,262,200,158,200,151,201,146,203,143,206,141,210,140,214,140,218,144,226,150,234,163,247,175,260,197,288,207,302,193,315,164,283,134,253,101,225,65,200,27,180,27,173,65,154,101,130,134,102,164,72,192,41,206,54,197,68,186,82,174,96,162,109,149,121,145,125,143,128,141,132,139,135,139,138,140,143,144,147,148,150,153,153,158,154,262,154,262,41,297,41,297,154,352,154,352,41,387,41,387,154,490,154,497,153,502,151,505,148,507,144,508,140,506,132,502,124,498,120,462,81,451,68,441,54,455,41,484,72,514,102,548,130,583,154,622,173,606,154,606,200,230,200,230,311,223,314,193,283,159,252,121,225,82,200,42,180,42,173,82,154,122,129,159,101,193,71,223,40,230,44,230,154,16383,16383,195,116,182,130,164,144,144,158,126,169,110,178,126,186,144,198,164,211,182,225,195,238,606,180,566,200,527,225,490,253,455,283,426,314,419,311,419,200,42,200,42,154,419,154,419,44,426,40,456,71,490,101,527,129,566,154,606,173,16383,16383,454,238,466,225,484,211,504,197,523,185,538,177,523,168,504,157,484,144,466,130,454,117,634,180,594,200,555,225,518,253,484,283,454,314,447,311,447,200,202,200,202,311,195,314,165, -283,130,252,93,225,54,200,14,180,14,173,54,154,94,129,131,101,165,71,195,40,202,44,202,154,447,154,447,44,454,40,484,71,518,101,555,129,594,154,634,173,16383,16383,481,238,494,225,512,211,532,197,551,185,566,177,551,168,532,157,512,144,494,130,481,117,16383,16383,166,116,154,130,136,144,117,158,97,169,82,178,97,186,117,198,136,211,154,225,166,238,150,61,150,1,158,52,158,52,150,1,158,8,158,52,158,8,163,42,163,42,158,8,163,18,163,42,163,18,165,30,91,30,92,19,92,42,92,42,92,19,97,8,92,42,97,8,98,52,98,52,97,8,105,1,98,52,105,1,106,61,106,61,105,1,115,-3,106,61,115,-3,116,66,116,66,115,-3,127,-5,116,66,127,-5,128,68,128,68,127,-5,140,-3,128,68,140,-3,140,66,140,66,140,-3,150,1,140,66,150,1,150,61,165,416,163,436,164,390,165,416,164,390,164,395,165,416,164,395,165,400,165,416,165,400,165,406,165,416,165,406,165,411,164,390,163,436,159,451,164,390,159,451,151,463,164,390,151,463,141,471,164,390,141,471,132,123,128,473,114,471,123,123,128,473,123,123,132,123,128,473,132,123,141,471,92,398,93,390,96,452,96,452,93,390,123,123,96,452,123,123,103,463,103,463,123,123,114,471,92,437,91,420,91,415,92,437,91,415,91,410,92,437,91,410,91,404,92,437,91,404,92,398,92,437,92,398,96,452,172,443,173,430,173,453,173,453,173,430,176,408,173,453,176,408,178,461,178,461,176,408,181,378,178,461,181,378,184,468,184,468,181,378,187,342,184,468,187,342,193,472,193,472,187,342,195,302,193,472,195,302,202,473,202,473,195,302,209,302,202,473,209,302,212,472,212,472,209,302,216,341,212,472,216,341,220,468,220,468,216,341,222,376,220,468,222,376,226,462,226,462,222,376,227,405,226,462,227,405,231,454,231,454,227,405,231,428,231,454,231,428,232,445,54,443,55,430,55,453,55,453,55,430,58,408,55,453,58,408,59,461,59,461,58,408,63,378,59,461,63,378,66,468,66,468,63,378,69,342,66,468,69,342,74,472,74,472,69,342,77,302,74,472,77,302,84,473,84,473,77,302,91,302,84,473,91,302,94,472,94,472,91,302,98,340,94,472,98, -340,102,468,102,468,98,340,105,375,102,468,105,375,108,462,108,462,105,375,109,404,108,462,109,404,112,454,112,454,109,404,112,428,112,454,112,428,113,445,127,463,105,322,119,152,119,152,105,322,99,284,119,152,99,284,96,0,96,0,99,284,84,190,96,0,84,190,78,152,78,152,84,190,4,190,78,152,4,190,4,152,23,322,23,284,99,284,23,322,99,284,105,322,127,463,119,152,125,190,127,463,125,190,140,284,127,463,140,284,145,322,127,463,145,322,167,463,259,463,239,322,253,152,253,152,239,322,233,284,253,152,233,284,232,0,232,0,233,284,219,190,232,0,219,190,213,152,213,152,219,190,125,190,213,152,125,190,119,152,145,322,140,284,233,284,145,322,233,284,239,322,280,322,300,463,273,284,273,284,300,463,259,463,273,284,259,463,259,190,259,190,259,463,253,152,259,190,253,152,329,152,280,322,273,284,347,284,280,322,347,284,347,322,259,190,329,152,329,190,232,0,213,152,191,0,96,0,78,152,55,0,185,446,216,439,216,462,216,462,216,439,241,426,216,462,241,426,243,456,243,456,241,426,261,407,243,456,261,407,265,449,265,449,261,407,276,382,265,449,276,382,283,439,283,439,276,382,287,350,283,439,287,350,298,427,298,427,287,350,298,350,320,134,318,148,320,119,320,119,318,148,315,160,320,119,315,160,314,76,314,76,315,160,311,172,314,76,311,172,306,182,296,45,314,76,306,182,296,45,306,182,294,198,296,45,294,198,279,213,296,45,279,213,267,23,267,23,279,213,265,103,267,23,265,103,262,76,267,23,262,76,253,55,267,23,253,55,238,40,267,23,238,40,230,9,263,126,265,103,279,213,263,126,279,213,258,230,263,126,258,230,255,146,185,205,218,184,228,249,228,249,218,184,241,165,228,249,241,165,258,230,258,230,241,165,255,146,185,20,185,205,185,273,185,20,185,273,161,217,185,20,161,217,185,-60,185,465,185,509,161,217,185,465,161,217,185,273,185,465,185,273,185,446,185,465,185,446,216,462,161,0,161,217,161,20,161,0,161,20,128,1,128,1,161,20,126,24,128,1,126,24,100,5,100,5,126,24,96,37,100,5,96,37,76,12,76,12,96,37,72,59,76,12,72,59,54,89,53,22,76,12,54, -89,53,22,54,89,41,127,53,22,41,127,30,127,53,22,30,127,30,36,185,509,161,509,161,446,161,446,161,509,161,465,161,446,161,217,185,509,99,411,114,426,123,459,123,459,114,426,134,438,123,459,134,438,161,465,161,465,134,438,161,446,89,446,62,425,75,274,89,446,75,274,88,373,89,446,88,373,91,393,89,446,91,393,99,411,89,446,99,411,123,459,88,373,75,274,90,355,90,355,75,274,111,247,90,355,111,247,97,340,97,340,111,247,110,324,37,359,40,327,43,397,43,397,40,327,53,299,43,397,53,299,62,425,62,425,53,299,75,274,110,324,111,247,131,307,131,307,111,247,161,217,131,307,161,217,161,285,161,285,161,217,161,446,230,9,238,40,215,28,230,9,215,28,185,20,230,9,185,20,185,0,185,-60,161,217,161,0,185,-60,161,0,161,-60,185,273,185,205,228,249,456,188,462,171,469,200,469,200,462,171,464,151,474,100,464,151,459,107,474,100,459,107,457,55,457,55,459,107,445,68,457,55,445,68,432,19,432,19,445,68,424,35,432,19,424,35,401,-4,401,-4,424,35,399,13,401,-4,399,13,370,5,370,5,358,8,366,-12,366,-12,358,8,347,14,366,-12,347,14,338,25,338,-7,366,-12,338,25,338,-7,338,25,333,38,338,-7,333,38,331,53,338,-7,331,53,315,5,342,114,353,145,374,223,374,223,353,145,368,173,374,223,368,173,386,195,386,195,391,201,413,231,413,231,391,201,398,205,413,231,398,205,405,209,338,201,308,168,315,5,338,201,315,5,331,53,338,201,331,53,334,83,338,201,334,83,342,114,338,201,342,114,374,223,280,84,285,53,288,127,288,127,285,53,297,26,288,127,297,26,308,168,308,168,297,26,315,5,456,188,455,217,447,201,447,201,455,217,436,228,447,201,436,228,435,209,435,209,436,228,420,212,413,211,420,212,413,231,413,211,413,231,405,209,413,231,374,223,386,195,436,228,413,231,420,212,474,100,480,149,478,178,474,100,478,178,469,200,474,100,469,200,464,151,370,5,366,-12,401,-4,94,319,98,343,99,444,99,444,98,343,105,366,99,444,105,366,136,465,136,465,105,366,114,389,136,465,114,389,126,410,126,410,134,422,136,465,136,465,134,422,141,432,136,465,141,432,178,473,178, -473,141,432,150,440,178,473,150,440,162,447,108,256,125,228,119,249,119,249,125,228,132,247,161,255,132,247,138,229,161,255,138,229,151,232,99,266,94,280,98,233,99,266,98,233,125,228,99,266,125,228,108,256,94,280,92,296,98,233,98,233,92,296,76,246,76,246,92,296,99,444,99,444,92,296,94,319,207,430,215,426,209,462,207,430,209,462,201,434,201,434,209,462,201,467,201,434,201,467,196,437,196,437,201,467,193,471,196,437,193,471,190,442,190,442,193,471,186,473,190,442,186,473,183,448,183,448,186,473,178,473,183,448,178,473,177,455,346,421,348,444,330,413,330,413,348,444,328,432,330,413,328,432,313,409,313,409,328,432,310,428,313,409,310,428,292,408,292,408,310,428,287,427,272,427,259,430,262,411,272,427,262,411,272,409,272,427,272,409,282,408,272,427,282,408,287,427,247,436,239,418,251,414,247,436,251,414,259,430,259,430,251,414,262,411,234,443,220,454,220,422,234,443,220,422,223,416,234,443,223,416,225,409,234,443,225,409,225,398,234,443,225,398,231,328,234,443,231,328,239,357,234,443,239,357,239,418,234,443,239,418,247,436,174,244,185,254,186,277,186,277,185,254,204,275,186,277,204,275,207,310,207,310,204,275,219,301,207,310,219,301,220,352,220,352,219,301,231,328,220,352,231,328,225,398,434,495,404,495,377,448,377,448,404,495,371,463,377,448,371,463,361,432,361,432,371,463,348,444,361,432,348,444,346,421,377,448,101,-12,134,-12,377,448,134,-12,434,495,241,387,241,393,241,399,241,387,241,399,241,405,241,387,241,405,240,411,241,387,240,411,239,418,241,387,239,418,239,357,163,237,174,244,186,277,163,237,186,277,161,255,163,237,161,255,151,232,220,454,209,462,215,426,220,454,215,426,220,422,43,324,47,293,50,370,50,370,47,293,58,267,50,370,58,267,70,411,70,411,58,267,76,246,70,411,76,246,99,444,132,247,125,228,138,229,178,473,162,447,177,455,292,408,287,427,282,408,455,217,456,188,469,200,214,469,185,455,199,412,199,412,185,455,197,393,198,197,197,393,185,455,198,197,185,455,177,240,166,264,145,217,177,240,166,264,177,240,185,455,166,264,185,455,162,432,166,264,162,432,156,290,139,248,100, -222,105,173,139,248,105,173,121,195,139,248,121,195,145,217,139,248,145,217,166,264,100,222,70,193,75,7,100,222,75,7,94,122,100,222,94,122,97,149,100,222,97,149,105,173,110,63,98,89,108,-4,108,-4,98,89,94,122,75,7,70,193,50,29,50,29,70,193,48,162,50,29,48,162,35,58,35,58,48,162,34,129,35,58,34,129,30,96,142,350,144,332,147,403,147,403,144,332,149,312,147,403,149,312,162,432,162,432,149,312,156,290,259,55,237,43,241,12,241,12,237,43,218,34,241,12,218,34,212,0,212,0,218,34,199,30,212,0,199,30,181,-6,181,-6,199,30,180,28,153,32,129,44,149,-8,153,32,149,-8,181,-6,153,32,181,-6,180,28,110,63,108,-4,149,-8,110,63,149,-8,129,44,344,105,352,158,327,124,344,105,327,124,350,13,350,13,327,124,326,31,326,31,327,124,306,150,326,31,306,150,300,55,300,55,306,150,286,177,300,55,286,177,283,73,283,73,286,177,269,204,283,73,269,204,260,101,260,101,269,204,252,234,260,101,252,234,239,129,239,129,252,234,235,269,239,129,235,269,225,291,218,161,239,129,225,291,218,161,225,291,213,315,218,161,213,315,205,335,218,161,205,335,200,354,218,161,200,354,198,197,198,373,197,393,198,197,198,373,198,197,200,354,199,412,207,428,214,469,214,469,207,428,218,440,214,469,218,440,248,473,248,473,218,440,234,448,248,473,234,448,252,451,252,451,270,448,279,470,279,470,270,448,285,439,279,470,285,439,305,459,305,459,285,439,297,426,305,459,297,426,304,409,304,366,309,311,306,389,306,389,309,311,326,441,326,441,309,311,329,333,326,441,329,333,339,417,339,417,329,333,340,358,339,417,340,358,344,387,305,459,304,409,306,389,305,459,306,389,326,441,279,470,248,473,252,451,257,308,235,269,278,290,257,308,278,290,280,326,280,326,278,290,309,311,280,326,309,311,295,345,295,345,309,311,304,366,257,308,225,291,235,269,270,30,300,55,283,73,270,30,283,73,259,55,270,30,259,55,241,12,344,105,350,13,363,82,363,82,350,13,373,0,363,82,373,0,383,64,383,64,373,0,396,-6,383,64,396,-6,403,51,403,51,396,-6,420,-8,403,51,420,-8,426,43,426,43,420,-8,447, --5,426,43,447,-5,450,41,450,41,447,-5,471,4,450,41,471,4,465,42,378,276,386,270,498,298,498,298,386,270,391,262,498,298,391,262,392,251,392,251,398,187,414,213,392,251,414,213,432,242,432,242,442,257,392,251,392,251,442,257,452,269,392,251,452,269,464,277,479,282,498,284,498,298,479,282,498,298,464,277,464,277,498,298,392,251,365,281,378,276,498,298,365,281,498,298,347,298,365,281,347,298,347,284,392,251,390,231,398,187,398,187,390,231,383,210,398,187,383,210,382,161,382,161,383,210,370,186,382,161,370,186,364,134,364,134,370,186,352,158,364,134,352,158,344,105,525,70,515,77,511,42,511,42,515,77,502,63,511,42,502,63,493,20,493,20,502,63,490,53,493,20,490,53,478,46,478,46,465,42,471,4,478,46,471,4,493,20,108,-4,94,122,75,7,142,350,147,403,141,368,34,444,35,428,35,453,35,453,35,428,38,405,35,453,38,405,39,462,39,462,38,405,43,376,39,462,43,376,46,468,46,468,43,376,49,341,46,468,49,341,54,472,54,472,49,341,56,302,54,472,56,302,64,473,64,473,56,302,70,302,64,473,70,302,74,472,74,472,70,302,78,341,74,472,78,341,82,468,82,468,78,341,84,376,82,468,84,376,88,462,88,462,84,376,89,406,88,462,89,406,92,454,92,454,89,406,92,429,92,454,92,429,93,445,34,177,41,105,41,251,41,251,41,105,62,37,41,251,62,37,62,318,62,318,62,37,97,-24,62,318,97,-24,94,178,94,178,97,378,62,318,163,413,213,462,206,473,163,413,206,473,145,430,163,413,145,430,129,365,94,178,97,252,97,378,97,378,97,252,108,312,97,378,108,312,145,430,145,430,108,312,129,365,163,-62,129,-11,144,-79,163,-62,144,-79,205,-123,163,-62,205,-123,213,-112,107,43,97,106,97,-24,107,43,97,-24,144,-79,107,43,144,-79,129,-11,94,178,97,-24,97,106,136,244,139,171,139,171,171,32,139,171,136,97,171,32,136,97,136,-26,136,-26,136,97,126,36,136,-26,126,36,105,-15,136,244,139,171,170,311,170,311,139,171,171,32,170,311,171,32,192,244,192,244,171,32,192,99,192,244,192,99,199,173,135,374,88,429,106,363,135,374,106,363,127,307,135,374,127,307,136,244,135, -374,136,244,170,311,72,413,106,363,88,429,72,413,88,429,29,473,72,413,29,473,20,462,20,-112,27,-123,71,-64,71,-64,27,-123,87,-79,71,-64,87,-79,105,-15,105,-15,87,-79,136,-26,96,355,96,355,110,353,96,355,110,353,98,400,96,355,98,400,91,406,96,355,91,406,85,411,96,355,85,411,78,413,96,355,78,413,78,360,72,414,64,413,65,365,72,414,65,365,78,360,72,414,78,360,78,413,50,396,51,378,53,403,53,403,51,378,56,371,53,403,56,371,58,409,58,409,56,371,65,365,58,409,65,365,64,413,114,274,121,281,123,309,123,309,121,281,125,286,123,309,125,286,135,314,135,314,125,286,128,290,135,314,128,290,132,294,132,294,136,297,135,314,135,314,136,297,149,321,109,305,91,302,97,256,109,305,97,256,104,263,109,305,104,263,114,274,109,305,114,274,123,309,154,196,160,190,155,236,155,236,160,190,158,244,162,256,158,244,160,190,162,256,160,190,167,187,201,220,200,225,201,204,201,220,201,204,202,213,201,220,202,213,202,216,198,230,196,236,196,197,198,230,196,197,201,204,198,230,201,204,200,225,191,251,187,266,190,191,191,251,190,191,196,197,191,251,196,197,196,236,187,266,184,281,190,191,190,191,184,281,183,297,190,191,183,297,183,187,183,187,183,297,182,313,176,473,168,472,168,361,176,473,168,361,169,349,176,473,169,349,169,320,176,473,169,320,174,185,176,473,174,185,183,187,176,473,183,187,182,313,176,473,182,313,182,340,176,473,182,340,182,357,176,473,182,357,184,472,169,340,169,320,169,349,168,472,161,469,162,399,168,472,162,399,165,386,168,472,165,386,167,373,168,472,167,373,168,361,158,413,162,399,161,469,158,413,161,469,156,463,158,413,156,463,155,422,285,414,277,415,280,361,280,361,277,415,267,412,280,361,267,412,266,359,266,359,267,412,256,404,266,359,256,404,249,355,249,355,256,404,244,393,249,355,244,393,235,352,235,352,244,393,233,381,235,352,233,381,223,370,223,370,215,363,221,347,221,347,215,363,208,357,221,347,208,357,206,340,206,340,208,357,201,352,206,340,201,352,192,346,182,340,182,320,188,316,182,340,188,316,188,330,182,340,188,330,192,346,192,346,188,330,206,340,246,305,232, -309,236,275,246,305,236,275,246,263,246,305,246,263,254,255,246,305,254,255,261,302,278,245,286,246,289,294,289,294,286,246,293,250,289,294,293,250,297,289,297,289,293,250,299,256,297,289,299,256,302,281,302,281,299,256,302,263,302,281,302,263,303,272,277,298,261,302,262,249,277,298,262,249,270,246,277,298,270,246,278,245,277,298,278,245,289,294,302,388,301,397,301,379,301,379,301,397,298,405,301,379,298,405,297,371,297,371,298,405,292,410,297,371,292,410,290,366,290,366,292,410,285,414,290,366,285,414,280,361,223,370,221,347,235,352,225,287,236,275,232,309,225,287,232,309,218,313,225,287,218,313,215,297,205,319,194,326,196,310,205,319,196,310,205,304,205,319,205,304,215,297,205,319,215,297,218,313,200,456,197,463,199,430,200,456,199,430,200,437,200,456,200,437,201,443,200,456,201,443,202,448,186,390,189,402,191,468,191,468,189,402,194,415,191,468,194,415,197,463,197,463,194,415,196,423,197,463,196,423,199,430,184,472,182,357,182,367,184,472,182,367,184,378,184,472,184,378,186,390,184,472,186,390,191,468,188,330,188,316,196,310,188,330,196,310,194,326,174,185,169,320,169,313,174,185,169,313,168,296,174,185,168,296,167,282,174,185,167,282,167,187,165,269,162,256,167,187,165,269,167,187,167,282,141,301,147,306,149,321,149,321,147,306,156,311,149,321,156,311,164,330,164,330,156,311,169,320,164,330,169,320,169,340,106,391,110,353,119,378,119,378,110,353,122,349,119,378,122,349,130,367,130,367,122,349,135,344,130,367,135,344,142,357,142,357,135,344,149,338,142,357,149,338,154,349,154,349,149,338,164,330,154,349,164,330,169,340,151,444,152,437,152,457,152,457,152,437,153,430,152,457,153,430,156,463,156,463,153,430,155,422,155,236,152,229,154,196,154,196,152,229,151,222,154,196,151,222,151,203,151,203,151,222,150,216,151,203,150,216,149,211,91,302,75,298,80,246,91,302,80,246,85,248,91,302,85,248,91,251,91,302,91,251,97,256,48,270,49,262,49,280,49,280,49,262,52,255,49,280,52,255,54,287,54,287,52,255,57,250,54,287,57,250,63,293,63,293,57,250,64,246,63,293,64,246,75,298,75,298,64,246,73, -245,75,298,73,245,80,246,98,400,110,353,106,391,149,321,136,297,141,301,151,444,152,457,151,449,262,249,261,302,254,255,51,378,50,396,49,388,263,383,216,383,263,-28,263,-28,216,383,216,200,263,-28,216,200,216,154,216,154,216,200,34,200,216,154,34,200,34,154,263,154,445,154,263,200,263,200,445,154,445,200,263,-28,216,154,216,-28,88,-2,92,-1,98,68,98,68,92,-1,96,-1,98,68,96,-1,99,-1,99,-1,102,-1,114,60,114,60,102,-1,105,-2,114,60,105,-2,107,-4,38,31,40,19,40,45,40,45,40,19,45,9,40,45,45,9,46,56,46,56,45,9,53,2,46,56,53,2,55,64,55,64,53,2,65,-2,55,64,65,-2,66,69,66,69,65,-2,79,-3,66,69,79,-3,80,71,80,71,79,-3,83,-3,80,71,83,-3,98,68,98,68,83,-3,88,-2,137,10,134,31,133,-14,133,-14,134,31,126,47,133,-14,126,47,123,-38,123,-38,126,47,114,60,123,-38,114,60,109,-9,109,-9,107,-23,123,-38,123,-38,107,-23,107,-61,114,60,107,-4,109,-6,114,60,109,-6,109,-9,114,60,98,68,99,-1,51,-84,58,-97,72,-69,72,-69,58,-97,85,-81,72,-69,85,-81,88,-53,88,-53,85,-81,107,-61,88,-53,107,-61,100,-38,100,-38,107,-61,107,-23,199,136,199,180,27,180,199,136,27,180,27,136,49,30,51,18,51,43,51,43,51,18,56,8,51,43,56,8,57,54,57,54,56,8,65,0,57,54,65,0,65,63,65,63,65,0,75,-5,65,63,75,-5,76,68,76,68,75,-5,87,-7,76,68,87,-7,88,70,88,70,87,-7,100,-5,88,70,100,-5,100,68,100,68,100,-5,110,0,100,68,110,0,111,62,111,62,110,0,119,8,111,62,119,8,119,53,119,53,119,8,125,19,119,53,125,19,125,42,125,42,125,19,127,30,201,473,154,473,-5,-9,201,473,-5,-9,41,-9,142,445,173,455,173,455,178,473,173,455,207,445,178,473,207,445,229,462,229,462,207,445,233,417,229,462,233,417,272,429,272,429,233,417,251,370,272,429,251,370,262,307,233,46,235,3,251,91,251,91,235,3,280,40,251,91,280,40,262,151,262,151,280,40,266,227,272,429,266,227,280,40,272,429,280,40,305,378,305,378,280,40,310,94,305,378,310,94,325,311,325, -311,310,94,327,160,325,311,327,160,333,231,175,9,175,-9,207,18,207,18,175,-9,235,3,207,18,235,3,233,46,99,371,117,417,118,461,118,461,117,417,142,445,118,461,142,445,178,473,178,473,142,445,173,455,17,235,22,166,23,308,23,308,22,166,38,99,23,308,38,99,41,373,41,373,38,99,68,43,41,373,68,43,73,425,73,425,68,43,88,153,73,425,88,153,84,230,84,230,88,308,73,425,73,425,88,308,99,371,73,425,99,371,118,461,142,18,117,46,113,4,142,18,113,4,175,-9,142,18,175,-9,175,9,113,4,117,46,99,91,113,4,99,91,88,153,113,4,88,153,68,43,272,429,262,307,266,227,141,31,128,20,276,0,276,0,128,20,110,14,276,0,110,14,83,10,111,412,118,413,203,473,203,473,118,413,123,414,203,473,123,414,128,415,128,415,136,414,203,473,203,473,136,414,142,410,203,473,142,410,146,403,230,17,218,25,149,66,149,66,218,25,211,37,149,66,211,37,149,380,148,393,149,380,203,473,148,393,203,473,146,403,203,473,77,409,97,407,203,473,97,407,104,410,203,473,104,410,111,412,209,53,209,471,203,473,209,53,203,473,149,380,209,53,149,380,211,37,276,0,276,10,249,12,276,0,249,12,230,17,276,0,230,17,147,46,276,0,147,46,141,31,276,0,83,10,83,0,147,46,230,17,149,66,97,407,77,409,77,400,36,330,53,366,54,418,54,418,53,366,70,392,54,418,70,392,82,448,82,448,70,392,89,409,82,448,89,409,120,467,120,467,89,409,111,418,120,467,111,418,138,421,138,421,172,417,166,473,166,473,172,417,210,467,34,380,21,334,36,330,34,380,36,330,54,418,233,288,239,214,236,323,236,323,239,214,246,450,246,450,239,214,265,250,246,450,265,250,273,423,273,423,265,250,282,284,273,423,282,284,290,390,290,390,282,284,293,317,290,390,293,317,296,350,246,450,210,467,219,385,246,450,219,385,232,357,246,450,232,357,236,323,210,467,172,417,199,405,210,467,199,405,219,385,223,253,205,218,206,177,223,253,206,177,239,214,223,253,239,214,233,288,20,0,294,0,20,9,20,9,294,0,91,53,20,9,91,53,145,141,145,141,91,53,206,177,145,141,206,177,179,181,179,181,206, -177,205,218,166,473,120,467,138,421,297,67,285,58,294,0,294,0,285,58,271,54,294,0,271,54,255,53,294,0,255,53,91,53,332,96,322,100,309,80,332,96,309,80,297,67,332,96,297,67,294,0,31,360,43,357,46,397,46,397,43,357,60,385,46,397,60,385,67,429,67,429,60,385,79,405,67,429,79,405,95,453,95,453,79,405,100,420,95,453,100,420,128,468,128,468,100,420,122,428,128,468,122,428,147,431,147,431,172,428,169,473,169,473,172,428,205,469,172,428,193,420,205,469,205,469,193,420,209,405,205,469,209,405,235,456,235,456,209,405,219,386,235,456,219,386,223,360,223,360,220,336,237,298,237,298,220,336,213,280,237,298,256,317,258,436,258,436,256,317,269,337,258,436,269,337,273,409,273,409,269,337,276,357,273,409,276,357,278,377,237,298,258,436,235,456,237,298,235,456,223,360,212,280,213,280,220,336,212,280,220,336,212,314,212,280,212,314,204,213,212,280,204,213,225,198,212,280,225,198,229,273,229,273,240,177,242,266,242,266,240,177,249,152,242,266,249,152,253,260,253,260,249,152,252,123,270,55,252,123,247,89,270,55,247,89,245,31,245,31,247,89,234,59,245,31,234,59,215,13,215,13,234,59,215,36,215,13,215,36,189,21,185,279,178,224,204,213,185,279,204,213,201,295,201,295,204,213,212,314,302,153,300,175,300,131,300,131,300,175,296,195,300,131,296,195,296,111,296,111,296,195,290,213,296,111,290,213,289,91,289,91,290,213,282,229,289,91,282,229,280,72,280,72,282,229,271,244,280,72,271,244,270,55,270,55,271,244,262,252,270,55,262,252,253,260,145,-7,181,0,149,16,149,16,181,0,160,16,189,21,160,16,181,0,189,21,181,0,215,13,122,246,107,241,128,231,122,246,128,231,135,251,135,251,128,231,145,230,135,251,145,230,147,256,147,256,145,230,158,229,147,256,158,229,157,261,157,261,158,229,166,266,185,279,166,266,169,227,185,279,169,227,178,224,169,473,128,468,147,431,166,266,158,229,169,227,145,-7,149,16,138,18,145,-7,138,18,127,22,145,-7,127,22,114,28,145,-7,114,28,107,-9,107,-9,114,28,100,37,107,-9,100,37,89,44,107,-9,89,44,80,49,107,-9,80,49,79, --7,80,49,72,53,79,-7,79,-7,72,53,64,55,79,-7,64,55,58,-2,58,-2,64,55,57,55,58,-2,57,55,48,54,42,5,58,-2,48,54,42,5,48,54,40,51,42,5,40,51,34,45,42,5,34,45,32,16,30,38,29,30,32,16,30,38,32,16,34,45,128,231,107,241,107,231,252,123,270,55,253,260,229,273,225,198,240,177,9,117,205,117,9,162,9,162,205,117,37,162,9,162,37,162,228,473,228,473,37,162,205,402,228,473,205,402,259,0,259,0,205,402,205,162,259,0,205,162,205,117,205,117,205,162,37,162,228,473,259,0,259,473,259,162,259,117,331,117,259,162,331,117,331,162,259,0,205,117,205,0,296,133,298,170,298,191,296,133,298,191,295,210,296,133,295,210,290,227,296,133,290,227,288,100,249,288,249,134,255,46,249,288,255,46,273,259,273,259,255,46,274,71,273,259,274,71,283,243,283,243,274,71,288,100,283,243,288,100,290,227,209,12,230,24,230,67,230,67,230,24,255,46,230,67,255,46,244,99,244,99,255,46,249,134,155,16,164,-4,183,23,183,23,164,-4,187,2,183,23,187,2,209,41,209,41,187,2,209,12,209,41,209,12,230,67,282,466,275,464,277,412,282,466,277,412,280,414,282,466,280,414,281,417,282,466,281,417,306,477,282,466,306,477,288,469,266,463,269,408,275,464,275,464,269,408,273,410,275,464,273,410,277,412,294,474,288,469,306,477,294,474,306,477,300,481,122,463,98,348,127,408,122,463,127,408,266,463,266,463,127,408,263,408,266,463,263,408,269,408,53,288,91,286,98,348,98,348,91,286,125,279,98,348,125,279,151,337,151,337,125,279,155,268,151,337,155,268,192,325,192,325,155,268,180,254,192,325,180,254,202,239,202,239,219,223,223,309,223,309,219,223,232,204,223,309,232,204,249,288,249,288,232,204,241,183,249,288,241,183,247,160,122,463,45,298,46,290,122,463,46,290,47,289,122,463,47,289,50,288,122,463,50,288,53,288,122,463,53,288,98,348,45,298,45,297,46,290,46,290,45,297,45,292,45,292,45,297,45,296,45,292,45,296,45,295,111,-9,138,-8,116,30,111,-9,116,30,105,38,111,-9,105,38,92,48,111,-9,92,48,82,54,111,-9,82,54,81,-7,82, -54,72,58,81,-7,81,-7,72,58,63,60,81,-7,63,60,57,-1,57,-1,63,60,53,60,57,-1,53,60,42,59,38,7,57,-1,42,59,38,7,42,59,34,56,38,7,34,56,27,50,38,7,27,50,26,19,23,43,22,34,26,19,23,43,26,19,27,50,146,17,137,20,138,-8,146,17,138,-8,164,-4,146,17,164,-4,155,16,223,309,192,325,202,239,127,24,116,30,138,-8,127,24,138,-8,137,20,249,288,247,160,249,134,45,292,45,295,45,294,195,299,178,299,205,262,205,262,178,299,170,267,147,265,170,267,161,296,147,265,161,296,144,290,89,186,94,219,100,388,100,388,94,219,106,243,100,388,106,243,106,268,106,268,106,243,125,257,106,268,125,257,126,281,126,281,125,257,147,265,126,281,147,265,144,290,178,299,161,296,170,267,262,91,253,58,255,9,255,9,253,58,237,32,255,9,237,32,232,0,232,0,237,32,216,16,232,0,216,16,207,-7,207,-7,216,16,188,10,207,-7,188,10,180,-9,180,-9,188,10,153,18,180,-9,153,18,149,-6,149,-6,153,18,125,41,149,-6,125,41,120,2,120,2,125,41,105,78,120,2,105,78,95,17,95,17,105,78,93,127,95,17,93,127,89,186,74,36,95,17,89,186,89,186,100,388,74,36,74,36,100,388,73,356,74,36,73,356,57,61,57,61,73,356,52,320,57,61,52,320,46,84,46,84,52,320,36,110,305,60,314,80,321,203,321,203,314,80,321,103,321,203,321,103,327,153,327,153,321,103,326,127,265,131,275,24,277,274,277,274,275,24,292,41,277,274,292,41,304,244,304,244,292,41,305,60,304,244,305,60,321,203,205,262,232,245,241,293,241,293,232,245,250,218,241,293,250,218,277,274,277,274,250,218,261,180,277,274,261,180,265,131,262,91,255,9,275,24,262,91,275,24,265,131,106,268,124,327,136,421,136,421,124,327,156,379,136,421,156,379,173,444,173,444,156,379,199,420,173,444,199,420,213,460,213,460,199,420,252,450,213,460,252,450,259,471,259,471,252,450,313,468,259,471,313,468,313,479,136,421,100,388,106,268,23,195,25,166,27,240,27,240,25,166,29,137,27,240,29,137,36,281,36,281,29,137,36,110,36,281,36,110,52,320,195,299,205,262,241,293,166,-4,314, -452,259,412,259,412,314,452,314,463,259,412,314,463,109,412,87,410,109,412,314,463,87,410,314,463,56,463,56,463,14,360,27,354,56,463,27,354,43,378,56,463,43,378,57,395,56,463,57,395,71,405,56,463,71,405,87,410,166,-4,259,412,120,-4,234,152,247,227,215,171,215,171,247,227,203,259,215,171,203,259,190,191,190,191,203,259,208,289,190,191,208,289,183,273,183,273,150,294,190,191,190,191,150,294,148,219,127,199,148,219,130,232,92,11,96,76,92,111,92,111,94,136,92,203,92,203,94,136,100,159,92,203,100,159,130,232,130,232,100,159,111,179,130,232,111,179,127,199,41,131,45,67,50,155,50,155,45,67,64,36,50,155,64,36,66,178,66,178,64,36,92,11,66,178,92,11,92,203,92,203,92,11,92,111,150,294,125,315,130,232,150,294,130,232,148,219,125,315,108,337,130,232,130,232,108,337,98,359,130,232,98,359,94,265,94,265,98,359,95,384,98,454,95,384,99,408,98,454,99,408,109,427,179,473,172,454,198,450,179,473,198,450,218,468,218,468,198,450,219,439,218,468,219,439,250,454,250,454,219,439,235,422,250,454,235,422,245,400,255,61,244,40,259,11,259,11,244,40,228,24,259,11,228,24,220,-4,220,-4,228,24,207,14,220,-4,207,14,181,10,181,10,152,14,173,-9,173,-9,152,14,129,-4,129,-4,152,14,127,27,129,-4,127,27,108,47,129,-4,108,47,96,76,129,-4,96,76,92,11,109,427,125,442,135,469,135,469,125,442,146,451,135,469,146,451,179,473,179,473,146,451,172,454,69,432,50,401,53,315,69,432,53,315,69,291,69,432,69,291,94,265,69,432,94,265,95,384,69,432,95,384,98,454,50,401,44,364,46,339,50,401,46,339,53,315,240,281,266,300,246,349,246,349,266,300,248,373,250,454,248,373,266,300,250,454,266,300,275,432,275,432,266,300,284,321,275,432,284,321,291,405,291,405,284,321,294,345,291,405,294,345,297,373,240,281,246,349,239,327,240,281,239,327,226,307,240,281,226,307,208,289,240,281,208,289,203,259,312,109,309,140,305,69,305,69,309,140,298,170,305,69,298,170,287,36,287,36,298,170,278,198,287,36,278,198,259,87,259,87,278,198,256,111,248,133,256,111,278, -198,248,133,278,198,247,227,248,133,247,227,234,152,259,87,259,11,287,36,181,10,173,-9,220,-4,255,61,259,11,259,87,250,454,245,400,248,373,98,454,109,427,135,469,45,67,41,131,39,105,86,355,90,377,79,442,79,442,90,377,95,398,79,442,95,398,119,465,119,465,95,398,102,416,119,465,102,416,110,430,110,430,118,438,119,465,119,465,118,438,127,445,119,465,127,445,166,473,166,473,127,445,137,450,166,473,137,450,149,453,166,473,149,453,161,454,161,454,194,447,166,473,166,473,194,447,193,471,172,196,147,166,171,167,172,196,171,167,193,171,172,196,142,202,147,166,118,220,100,248,105,172,118,220,105,172,147,166,118,220,147,166,142,202,85,332,86,355,79,442,85,332,79,442,70,191,85,332,70,191,89,286,89,286,70,191,105,172,89,286,105,172,100,248,21,308,27,260,28,361,28,361,27,260,44,221,28,361,44,221,48,407,48,407,44,221,70,191,48,407,70,191,79,442,192,198,172,196,193,171,192,198,193,171,214,204,214,204,193,171,214,179,214,204,214,179,233,214,233,214,214,179,234,190,233,214,234,190,248,229,248,229,234,190,252,205,248,229,252,205,253,248,253,248,252,205,267,101,253,248,267,101,253,276,249,340,253,276,259,439,249,340,259,439,239,454,193,471,194,447,217,464,217,464,194,447,220,425,217,464,220,425,239,454,239,454,220,425,238,389,239,454,238,389,249,340,321,276,319,310,318,228,318,228,319,310,314,342,318,228,314,342,308,182,308,182,314,342,304,371,308,182,304,371,292,397,308,182,292,397,291,140,291,140,292,397,277,420,291,140,277,420,267,101,267,101,277,420,259,439,267,101,259,439,253,276,41,-15,91,-6,99,16,99,16,91,-6,132,4,99,16,132,4,152,46,152,46,132,4,169,19,152,46,169,19,196,88,196,88,169,19,203,40,196,88,203,40,230,142,230,142,203,40,238,68,230,142,238,68,252,205,252,205,238,68,267,101,99,16,39,-1,41,-15,59,295,59,270,64,306,64,306,59,270,65,259,64,306,65,259,73,314,73,314,65,259,73,251,73,314,73,251,83,319,83,319,73,251,84,246,83,319,84,246,96,321,96,321,84,246,96,244,96,321,96,244,108,319,108,319,96,244,108,246,108, -319,108,246,119,313,119,313,108,246,119,251,119,313,119,251,127,305,127,305,119,251,127,259,127,305,127,259,132,294,132,294,127,259,132,270,132,294,132,270,134,282,59,43,59,19,64,54,64,54,59,19,65,8,64,54,65,8,73,63,73,63,65,8,73,0,73,63,73,0,83,68,83,68,73,0,84,-5,83,68,84,-5,96,70,96,70,84,-5,96,-7,96,70,96,-7,108,68,108,68,96,-7,108,-5,108,68,108,-5,119,62,119,62,108,-5,119,0,119,62,119,0,127,54,127,54,119,0,127,8,127,54,127,8,132,43,132,43,127,8,132,19,132,43,132,19,134,30,59,19,59,43,57,30,59,270,59,295,57,282,58,295,58,270,63,306,63,306,58,270,64,259,63,306,64,259,72,314,72,314,64,259,72,251,72,314,72,251,83,319,83,319,72,251,83,246,83,319,83,246,95,321,95,321,83,246,95,244,95,321,95,244,107,319,107,319,95,244,107,246,107,319,107,246,118,313,118,313,107,246,118,251,118,313,118,251,126,305,126,305,118,251,126,259,126,305,126,259,132,294,132,294,126,259,132,270,132,294,132,270,134,282,105,-2,109,-1,115,68,115,68,109,-1,113,-1,115,68,113,-1,116,-1,116,-1,119,-1,131,60,131,60,119,-1,122,-3,131,60,122,-3,124,-5,56,32,58,20,58,45,58,45,58,20,63,10,58,45,63,10,64,56,64,56,63,10,71,2,64,56,71,2,73,64,73,64,71,2,82,-1,73,64,82,-1,84,69,84,69,82,-1,97,-3,84,69,97,-3,98,71,98,71,97,-3,101,-3,98,71,101,-3,115,68,115,68,101,-3,105,-2,153,9,150,30,150,-16,150,-16,150,30,143,47,150,-16,143,47,140,-40,140,-40,143,47,131,60,140,-40,131,60,126,-10,126,-10,124,-63,140,-40,131,60,124,-5,125,-7,131,60,125,-7,126,-10,131,60,115,68,116,-1,124,-63,126,-10,123,-24,124,-63,123,-24,116,-39,124,-63,116,-39,105,-54,124,-63,105,-54,102,-82,89,-69,68,-84,75,-97,89,-69,75,-97,102,-82,89,-69,102,-82,105,-54,58,270,58,295,56,282,132,178,434,328,434,373,132,178,434,373,39,181,132,178,39,181,434,-16,132,178,434,-16,434,27,434,-16,39,181,39,174,34,270,34,224,446,224,34,270,446,224,446,270,34,130,34, -84,446,84,34,130,446,84,446,130,434,174,434,181,39,373,434,174,39,373,39,328,434,174,39,328,341,178,434,174,341,178,39,27,434,174,39,27,39,-16,84,409,84,409,84,409,84,409,93,455,69,434,84,409,69,434,70,329,84,409,70,329,81,327,202,468,162,473,174,448,174,448,162,473,149,452,129,450,149,452,162,473,129,450,162,473,125,469,84,409,87,422,93,455,93,455,87,422,97,434,93,455,97,434,125,469,125,469,97,434,112,443,125,469,112,443,129,450,48,373,49,357,53,406,53,406,49,357,54,344,53,406,54,344,69,434,69,434,54,344,61,335,69,434,61,335,70,329,86,396,91,328,93,386,93,386,91,328,99,332,93,386,99,332,101,378,101,378,99,332,105,339,101,378,105,339,107,369,107,369,105,339,109,347,107,369,109,347,110,357,91,328,86,396,84,409,91,328,84,409,81,327,166,69,166,-4,178,67,178,67,166,-4,178,-3,178,67,178,-3,188,61,188,61,178,-3,188,2,188,61,188,2,196,53,196,53,188,2,196,10,196,53,196,10,201,43,201,43,196,10,201,20,201,43,201,20,203,31,129,31,131,20,131,43,131,43,131,20,135,10,131,43,135,10,136,54,136,54,135,10,143,2,136,54,143,2,144,62,144,62,143,2,154,-3,144,62,154,-3,154,67,154,67,154,-3,166,-4,154,67,166,-4,166,69,174,448,195,437,202,468,202,468,195,437,211,420,202,468,211,420,237,454,237,454,211,420,222,397,237,454,222,397,226,370,226,370,224,344,247,262,247,262,224,344,218,318,247,262,218,318,216,225,216,225,218,318,210,292,216,225,210,292,203,206,203,206,210,292,200,266,203,206,200,266,192,187,192,187,200,266,190,239,192,187,190,239,183,165,183,165,190,239,177,205,183,165,177,205,176,142,176,142,177,205,171,115,283,400,265,431,268,292,283,400,268,292,281,316,283,400,281,316,288,339,283,400,288,339,290,363,247,262,268,292,265,431,247,262,265,431,237,454,247,262,237,454,226,370,171,115,177,205,168,177,171,115,168,177,163,153,171,115,163,153,160,133,171,115,160,133,159,115,218,56,176,100,185,34,185,34,176,100,149,157,185,34,149,157,130,85,130,85,149,157,140,226,147,395,140,226,142,257,147,395,142,257,147, -288,147,288,156,318,180,425,180,425,156,318,169,346,180,425,169,346,184,371,184,371,207,399,207,442,207,442,207,399,234,421,207,442,234,421,237,456,237,456,234,421,265,438,237,456,265,438,268,466,268,466,265,438,299,448,268,466,299,448,301,471,301,471,299,448,338,452,301,471,338,452,337,473,337,473,338,452,410,463,130,85,140,226,147,395,130,85,147,395,120,360,130,85,120,360,99,320,130,85,99,320,94,151,86,276,81,229,94,151,86,276,94,151,99,320,538,261,541,170,555,334,538,261,555,334,528,321,528,321,555,334,523,390,528,321,523,390,499,373,499,373,523,390,474,434,499,373,474,434,456,415,456,415,474,434,410,463,456,415,410,463,401,442,401,442,410,463,338,452,401,442,338,452,337,452,337,452,338,452,299,448,207,442,180,425,184,371,481,51,452,38,454,14,454,14,452,38,424,28,454,14,424,28,422,3,422,3,424,28,396,22,422,3,396,22,394,-4,394,-4,396,22,368,18,394,-4,368,18,366,-8,366,-8,368,18,341,17,366,-8,341,17,338,-9,338,-9,341,17,274,27,338,-9,274,27,255,1,255,1,274,27,218,56,255,1,218,56,185,34,387,350,375,354,379,323,379,323,375,354,368,325,355,323,368,325,360,355,355,323,360,355,341,317,341,317,360,355,339,353,341,317,339,353,327,307,327,307,339,353,320,347,327,307,320,347,313,293,313,293,320,347,303,337,313,293,303,337,299,276,279,228,284,245,286,324,286,324,284,245,291,261,286,324,291,261,303,337,303,337,291,261,299,276,271,306,274,192,275,210,271,306,275,210,286,324,286,324,275,210,279,228,282,154,286,101,290,142,290,142,286,101,306,103,290,142,306,103,302,134,302,134,306,103,316,131,328,133,316,131,325,109,328,133,325,109,343,120,276,171,274,192,267,104,276,171,267,104,286,101,276,171,286,101,282,154,274,192,271,306,267,104,267,104,271,306,256,284,267,104,256,284,250,115,250,115,256,284,243,259,250,115,243,259,237,131,237,131,243,259,233,233,237,131,233,233,228,152,228,152,233,233,227,206,228,152,227,206,225,179,375,354,360,355,368,325,373,152,375,152,380,193,373,152,380,193,370,172,370,172,360,158,373,152,373,152,360,158,359,134,431,128,425,135,437,100,437, -100,425,135,421,144,437,100,421,144,420,102,420,102,421,144,420,156,421,162,421,164,420,346,420,346,421,164,421,166,420,346,421,166,422,168,422,168,468,346,420,346,420,346,413,320,420,102,420,346,420,102,420,156,420,346,420,156,420,159,420,346,420,159,421,162,413,320,412,320,420,102,420,102,412,320,405,333,420,102,405,333,403,109,403,109,405,333,401,283,403,109,401,283,399,262,403,109,399,262,395,240,399,298,401,283,405,333,399,298,405,333,397,343,399,298,397,343,395,309,388,318,395,309,397,343,388,318,397,343,387,350,388,318,387,350,379,323,538,261,534,220,541,170,541,170,534,220,520,182,541,170,520,182,513,133,513,133,520,182,501,152,513,133,501,152,478,109,478,109,501,152,477,131,478,109,477,131,450,123,450,123,439,125,478,109,478,109,439,125,437,100,555,334,541,170,560,216,555,334,560,216,566,268,403,109,395,240,390,120,390,120,395,240,388,216,390,120,388,216,380,134,380,134,388,216,380,193,380,134,380,193,375,152,350,146,339,138,343,120,350,146,343,120,359,134,350,146,359,134,360,158,316,131,306,103,325,109,328,133,343,120,339,138,431,128,437,100,439,125,481,51,454,14,490,30,147,395,147,288,180,425,77,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,243,472,107,71,139,152,243,472,139,152,152,180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,257,472,345,15,338,14,495,0,495,0,338,14,329,13,495,0,329,13,316,13,363,29,361,25,495,0,495,0,361,25,358,22,495,0,358,22,355,20,355,20,350,17,495,0,495,0,350,17,345,15,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,243,472,152,180,232,373,243,472,232,373,313,180,243,472,313,180,257,472,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107,71,243,472,476,17,462,24,495,0,476,17,495,0,495,13,364,33,363,29,495,0,364,33,495, -0,365,37,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,495,0,316,13,316,0,71,33,59,22,248,0,248,0,59,22,40,16,248,0,40,16,12,13,77,413,79,385,156,434,77,413,156,434,208,463,208,463,156,434,161,437,208,463,161,437,167,438,208,463,167,438,196,438,208,463,196,438,241,433,290,43,271,34,304,5,304,5,271,34,250,29,304,5,250,29,248,0,248,0,250,29,225,26,248,0,225,26,194,26,194,26,177,27,248,0,248,0,177,27,165,30,248,0,165,30,77,52,77,52,165,30,79,79,362,420,325,443,330,254,330,254,325,443,320,343,330,254,320,343,315,312,330,254,315,312,315,249,315,249,315,312,303,287,315,249,303,287,295,245,295,245,303,287,282,270,295,245,282,270,295,244,295,244,282,270,302,200,295,244,302,200,320,238,320,238,302,200,314,190,215,256,227,225,253,260,253,260,227,225,254,221,253,260,254,221,282,270,282,270,254,221,278,213,282,270,278,213,302,200,330,92,325,78,350,21,350,21,325,78,317,66,350,21,317,66,308,56,308,56,290,43,304,5,227,225,215,256,194,227,194,227,215,256,151,256,194,227,151,256,151,228,152,45,151,57,79,385,152,45,79,385,79,79,79,79,165,30,157,36,79,79,157,36,152,45,380,205,368,216,385,47,385,47,368,216,355,224,385,47,355,224,350,21,350,21,355,224,339,232,350,21,339,232,334,125,334,125,333,108,350,21,350,21,333,108,330,92,339,232,320,238,323,177,339,232,323,177,330,162,339,232,330,162,333,144,339,232,333,144,334,125,325,443,273,458,276,421,325,443,276,421,300,402,325,443,300,402,315,375,325,443,315,375,320,343,273,458,208,463,241,433,273,458,241,433,276,421,79,385,151,57,151,415,79,385,151,415,151,424,79,385,151,424,153,430,79,385,153,430,156,434,208,463,12,463,41,447,208,463,41,447,60,442,208,463,60,442,72,431,208,463,72,431,77,413,372,284,380,298,384,387,384,387,380,298,386,313,384,387,386,313,391,347,391,347,386,313,390, -330,342,260,353,266,362,420,362,420,353,266,362,273,362,420,362,273,384,387,384,387,362,273,372,284,409,160,402,177,407,82,409,160,407,82,415,124,409,160,415,124,413,143,393,192,380,205,385,47,393,192,385,47,407,82,393,192,407,82,402,177,308,56,304,5,350,21,362,420,330,254,342,260,41,447,12,463,12,450,320,238,314,190,323,177,248,0,12,13,12,0,71,33,248,0,77,52,87,52,103,195,101,239,101,239,111,427,87,52,87,52,111,427,83,401,87,52,83,401,63,80,63,80,83,401,61,372,63,80,61,372,45,112,45,112,61,372,43,340,45,112,43,340,31,148,31,148,43,340,30,306,31,148,30,306,22,186,22,186,30,306,22,268,22,186,22,268,20,227,109,157,113,31,119,123,119,123,113,31,144,13,119,123,144,13,133,95,133,95,144,13,152,71,172,53,152,71,178,0,172,53,178,0,194,39,194,39,178,0,214,-6,194,39,214,-6,220,29,220,29,214,-6,252,-9,220,29,252,-9,247,23,247,23,252,-9,276,21,311,24,276,21,300,-5,311,24,300,-5,343,5,103,195,87,52,113,31,103,195,113,31,109,157,152,71,144,13,178,0,356,456,362,410,367,453,367,453,362,410,381,392,367,453,381,392,376,451,376,451,381,392,384,450,392,451,384,450,391,381,392,451,391,381,399,368,384,450,381,392,391,381,319,466,319,436,336,462,336,462,319,436,342,425,336,462,342,425,346,460,346,460,342,425,362,410,346,460,362,410,356,456,302,469,285,472,295,443,302,469,295,443,319,436,302,469,319,436,319,466,285,472,269,473,295,443,295,443,269,473,269,445,211,435,269,445,214,471,211,435,214,471,177,462,434,314,427,473,418,314,418,314,427,473,414,473,418,314,414,473,413,335,413,335,414,473,410,465,413,335,410,465,407,353,407,353,410,465,405,459,407,353,405,459,399,368,399,368,405,459,399,454,399,368,399,454,392,451,443,79,430,91,415,47,415,47,430,91,400,65,415,47,400,65,382,23,382,23,400,65,371,45,382,23,371,45,343,5,343,5,371,45,342,32,343,5,342,32,311,24,276,21,252,-9,300,-5,269,445,269,473,252,473,269,445,252,473,214,471,101,239,108,307,111,427,111,427,108,307,130,364,111,427,130,364,143,448,143, -448,130,364,164,408,143,448,164,408,177,462,177,462,164,408,211,435,67,34,56,23,208,0,208,0,56,23,38,17,208,0,38,17,11,13,73,80,71,53,154,30,154,30,71,53,208,0,154,30,208,0,164,27,164,27,208,0,178,26,218,27,178,26,208,0,218,27,208,0,249,2,146,420,150,428,73,385,73,385,150,428,157,434,73,385,157,434,200,463,200,463,157,434,167,437,200,463,167,437,181,438,181,438,167,437,181,437,181,438,181,437,220,436,181,438,220,436,200,463,200,463,220,436,252,461,288,8,323,17,305,48,305,48,323,17,330,62,330,62,330,63,357,85,357,85,330,63,356,29,357,85,356,29,384,45,218,27,249,2,251,31,251,31,249,2,288,8,251,31,288,8,279,37,279,37,288,8,305,48,341,440,337,389,360,364,341,440,360,364,378,422,378,422,360,364,379,337,378,422,379,337,410,400,410,400,379,337,392,306,410,400,392,306,400,270,254,431,284,422,299,453,299,453,284,422,311,408,299,453,311,408,341,440,341,440,311,408,337,389,252,461,220,436,254,431,252,461,254,431,299,453,480,234,477,275,476,186,476,186,477,275,468,312,476,186,468,312,464,143,464,143,468,312,454,345,464,143,454,345,445,104,445,104,454,345,434,374,445,104,434,374,418,72,418,72,434,374,410,400,418,72,410,400,403,230,403,230,400,185,418,72,418,72,400,185,392,146,418,72,392,146,384,45,384,45,392,146,377,113,384,45,377,113,357,85,330,62,323,17,356,29,330,62,356,29,330,63,154,30,148,37,73,80,73,80,148,37,145,46,73,80,145,46,73,385,73,385,145,46,145,59,73,385,145,59,145,408,56,442,66,431,200,463,200,463,66,431,71,413,200,463,71,413,73,385,38,447,56,442,200,463,38,447,200,463,11,463,38,447,11,463,11,450,208,0,11,13,11,0,67,34,208,0,71,53,146,420,73,385,145,408,410,400,400,270,403,230,64,34,53,23,386,0,386,0,53,23,36,17,386,0,36,17,9,13,68,411,70,385,148,434,68,411,148,434,63,430,63,430,148,434,155,436,63,430,155,436,380,463,380,463,155,436,165,437,64,34,164,29,68,52,68,52,164,29,151,35,68,52,151,35,70,80,70,80,151,35,143,44,70,80,143, -44,70,385,70,385,143,44,141,59,70,385,141,59,141,412,141,258,141,229,246,229,141,258,246,229,246,258,277,259,246,258,277,227,277,259,277,227,298,265,298,265,277,227,298,222,298,265,298,222,311,277,311,277,298,222,311,210,311,277,311,210,320,297,320,297,311,210,320,191,320,297,320,191,326,325,326,325,320,191,326,161,326,325,326,161,341,161,380,463,165,437,257,437,380,463,257,437,298,435,380,463,298,435,327,429,380,463,327,429,346,416,380,463,346,416,357,395,380,463,357,395,365,363,380,463,365,363,382,363,70,385,141,412,141,423,70,385,141,423,144,430,70,385,144,430,148,434,380,463,9,463,35,447,380,463,35,447,53,441,380,463,53,441,63,430,357,53,328,37,386,0,386,0,328,37,289,28,386,0,289,28,237,26,386,0,418,118,398,118,386,0,398,118,379,80,386,0,379,80,357,53,386,0,237,26,212,26,386,0,212,26,184,26,386,0,184,26,164,29,386,0,164,29,64,34,386,0,9,13,9,0,35,447,9,463,9,450,246,258,246,229,277,227,326,325,341,161,341,325,53,440,64,429,379,463,379,463,64,429,155,436,379,463,155,436,165,437,379,463,165,437,257,437,379,463,257,437,300,435,70,386,142,51,141,78,141,258,141,229,240,229,141,258,240,229,240,258,270,259,240,258,271,227,270,259,271,227,292,265,292,265,271,227,292,222,292,265,292,222,306,277,306,277,292,222,306,210,306,277,306,210,315,296,315,296,306,210,315,190,315,296,315,190,320,324,320,324,315,190,320,161,320,324,320,161,335,161,379,463,300,435,328,429,379,463,328,429,346,416,379,463,346,416,358,395,379,463,358,395,365,363,379,463,365,363,382,363,70,386,141,78,141,409,70,386,141,409,141,421,70,386,141,421,143,428,70,386,143,428,148,433,70,386,148,433,68,412,155,436,64,429,68,412,155,436,68,412,148,433,36,447,53,440,379,463,36,447,379,463,9,463,36,447,9,463,9,450,205,0,205,13,177,16,205,0,177,16,159,22,205,0,159,22,68,55,205,0,68,55,63,35,205,0,63,35,52,23,205,0,52,23,35,16,205,0,35,16,8,13,205,0,8,13,8,0,70,86,68,55,159,22,70,86,159,22,148,33,70,86,148,33,142, -51,70,86,142,51,70,386,240,258,240,229,271,227,320,324,335,161,335,324,23,229,25,189,26,274,26,274,25,189,32,153,26,274,32,153,36,315,36,315,32,153,43,121,36,315,43,121,51,352,51,352,43,121,59,91,51,352,59,91,72,385,72,385,59,91,80,65,72,385,80,65,98,413,98,413,80,65,102,227,220,437,225,471,196,427,196,427,225,471,189,463,196,427,189,463,175,414,175,414,189,463,156,397,136,372,156,397,155,451,136,372,155,451,124,434,124,434,98,413,104,267,124,434,104,267,111,306,124,434,111,306,121,341,124,434,121,341,136,372,270,-9,286,18,227,-6,227,-6,286,18,225,27,227,-6,225,27,186,3,186,3,225,27,174,54,186,3,174,54,146,18,146,18,174,54,135,97,146,18,135,97,111,39,111,39,135,97,111,155,111,39,111,155,102,227,362,36,342,26,352,-1,352,-1,342,26,316,20,352,-1,316,20,312,-7,312,-7,316,20,286,18,102,227,80,65,111,39,375,407,372,453,365,455,375,407,365,455,358,421,375,407,378,451,372,453,286,473,273,445,296,444,286,473,296,444,305,471,305,471,296,444,318,439,305,471,318,439,322,468,322,468,318,439,339,431,322,468,339,431,340,463,340,463,339,431,358,421,340,463,358,421,358,457,358,457,358,421,365,455,378,451,387,395,384,450,384,450,387,395,388,450,397,451,388,450,397,382,397,451,397,382,406,367,375,407,387,395,378,451,425,326,441,326,435,473,425,326,435,473,420,473,425,326,420,473,417,466,425,326,417,466,415,348,411,459,405,454,406,367,411,459,406,367,415,348,411,459,415,348,417,466,388,450,387,395,397,382,475,233,496,235,496,248,475,233,496,248,461,227,461,227,496,248,379,198,461,227,379,198,380,171,389,8,380,171,380,61,389,8,380,61,375,47,461,227,380,171,453,218,453,218,380,171,389,8,453,218,389,8,449,202,449,202,389,8,421,22,449,202,421,22,448,179,448,179,421,22,448,39,496,248,317,248,345,232,496,248,345,232,363,227,496,248,363,227,374,216,496,248,374,216,379,198,362,36,352,-1,389,8,362,36,389,8,375,47,265,473,225,471,245,443,265,473,245,443,273,445,265,473,273,445,286,473,189,463,155,451,156,397,225,471,220,437,245,443,312, --7,286,18,270,-9,345,232,317,248,317,235,397,451,406,367,405,454,104,267,98,413,102,227,69,35,58,23,208,0,208,0,58,23,40,16,208,0,40,16,13,13,13,13,40,16,12,13,209,463,13,463,40,447,209,463,40,447,58,441,209,463,58,441,69,429,209,463,69,429,74,411,209,463,74,411,165,441,209,463,165,441,183,447,209,463,183,447,209,450,75,384,147,53,146,79,146,252,146,220,359,220,146,252,359,220,359,252,359,252,359,220,437,35,359,252,437,35,431,52,75,384,146,79,146,384,75,384,146,384,148,411,75,384,148,411,153,429,75,384,153,429,165,441,75,384,165,441,74,411,353,37,342,24,492,0,492,0,342,24,324,17,492,0,324,17,297,13,466,447,492,450,492,463,466,447,492,463,448,440,448,440,492,463,357,411,448,440,357,411,359,384,431,52,359,384,359,252,430,77,430,384,359,384,359,384,430,384,431,411,359,384,431,411,437,429,492,463,296,463,323,447,492,463,323,447,341,441,492,463,341,441,352,430,492,463,352,430,357,411,492,0,492,13,466,17,492,0,466,17,448,23,492,0,448,23,357,57,492,0,357,57,353,37,359,87,357,57,448,23,359,87,448,23,437,35,359,87,437,35,359,220,208,0,207,13,181,16,208,0,181,16,163,23,208,0,163,23,74,55,208,0,74,55,69,35,75,85,74,55,163,23,75,85,163,23,153,35,75,85,153,35,147,53,75,85,147,53,75,384,208,0,13,13,13,0,492,0,297,13,297,0,359,384,431,52,430,77,323,447,296,463,296,450,448,440,359,384,437,429,40,447,13,463,13,450,73,32,62,21,220,0,220,0,62,21,42,16,220,0,42,16,13,13,13,13,42,16,12,13,220,463,13,463,42,447,220,463,42,447,62,442,220,463,62,442,74,431,220,463,74,431,79,413,220,463,79,413,171,442,220,463,171,442,191,448,220,463,191,448,220,450,171,22,159,33,80,78,80,78,159,33,153,52,80,78,153,52,80,386,80,386,153,52,152,78,80,386,152,78,152,386,80,386,152,386,153,413,80,386,153,413,159,431,80,386,159,431,171,442,80,386,171,442,79,413,220,0,220,13,191,16,220,0,191,16,171,22,220,0,171,22,79,51,220,0,79,51,73,32,220,0,13, -13,13,0,79,51,171,22,80,78,42,447,13,463,13,450,109,33,104,24,107,-4,107,-4,104,24,97,19,107,-4,97,19,86,17,86,17,79,19,107,-4,107,-4,79,19,66,-9,219,447,248,450,248,463,219,447,248,463,201,441,201,441,248,463,110,413,201,441,110,413,112,385,140,11,112,385,112,66,140,11,112,66,111,47,184,384,185,412,164,39,184,384,164,39,179,78,184,384,179,78,184,130,185,412,190,430,112,385,185,412,112,385,140,11,185,412,140,11,164,39,248,463,47,463,76,447,248,463,76,447,94,441,248,463,94,441,105,431,248,463,105,431,110,413,109,33,107,-4,140,11,109,33,140,11,111,47,66,-9,79,19,74,23,66,-9,74,23,71,30,66,-9,71,30,68,38,66,-9,68,38,64,48,66,-9,64,48,59,58,66,-9,59,58,53,66,66,-9,53,66,47,72,66,-9,47,72,43,-7,47,72,39,76,43,-7,43,-7,39,76,30,77,43,-7,30,77,23,-1,23,-1,30,77,19,75,23,-1,19,75,10,70,23,-1,10,70,9,9,9,9,10,70,3,61,9,9,3,61,0,23,0,23,3,61,-1,51,0,23,-1,51,-3,41,76,447,47,463,47,450,201,441,112,385,190,430,221,450,221,450,192,447,192,447,221,450,221,463,192,447,221,463,174,440,174,440,221,463,85,411,174,440,85,411,87,384,159,50,87,384,87,88,159,50,87,88,165,33,165,33,87,88,176,22,87,384,159,50,158,77,158,244,158,207,177,222,158,244,177,222,283,359,283,359,177,222,233,269,283,359,233,269,363,394,87,384,158,77,158,384,87,384,158,384,159,411,87,384,159,411,163,429,87,384,163,429,174,440,221,463,23,463,51,447,221,463,51,447,70,440,221,463,70,440,80,429,221,463,80,429,85,411,328,405,317,391,363,394,363,394,317,391,301,376,363,394,301,376,283,359,473,463,291,463,309,449,473,463,309,449,320,448,473,463,320,448,329,445,473,463,329,445,334,441,473,463,334,441,337,435,473,463,337,435,338,427,473,463,338,427,428,442,473,463,428,442,448,447,473,463,448,447,473,450,338,427,363,394,389,417,338,427,389,417,409,433,338,427,409,433,428,442,335,417,328,405,363,394,335,417,363,394,338,427,338,21,332,17,506,0,506,0,332,17,324, -15,506,0,324,15,313,14,342,30,506,0,471,22,342,30,471,22,451,35,342,30,451,35,427,57,342,30,427,57,397,90,342,30,397,90,338,45,397,90,233,269,246,150,397,90,246,150,277,117,397,90,277,117,304,89,397,90,304,89,324,64,397,90,324,64,338,45,488,15,471,22,506,0,488,15,506,0,506,13,341,25,338,21,506,0,341,25,506,0,342,30,294,13,294,0,506,0,294,13,506,0,313,14,220,0,220,13,194,16,220,0,194,16,176,22,220,0,176,22,85,57,220,0,85,57,80,36,220,0,80,36,69,23,220,0,69,23,51,16,220,0,51,16,23,13,220,0,23,13,23,0,85,57,176,22,87,88,246,150,233,269,177,222,309,449,291,463,291,450,51,447,23,463,23,450,206,450,206,450,178,447,178,447,206,450,206,463,178,447,206,463,159,441,159,441,206,463,68,409,159,441,68,409,70,382,142,45,70,382,70,80,142,45,70,80,148,36,148,36,70,80,68,53,148,36,68,53,159,31,159,31,68,53,63,35,159,31,63,35,178,28,178,28,63,35,385,0,178,28,385,0,204,27,204,27,385,0,252,27,141,59,141,384,70,382,70,382,141,384,142,411,70,382,142,411,147,429,206,463,9,463,36,447,206,463,36,447,54,440,206,463,54,440,64,428,206,463,64,428,68,409,388,97,382,87,385,0,385,0,382,87,377,78,385,0,377,78,371,70,371,70,355,54,385,0,385,0,355,54,335,42,385,0,335,42,312,34,419,122,401,122,394,108,419,122,394,108,388,97,419,122,388,97,385,0,284,29,252,27,385,0,284,29,385,0,312,34,385,0,63,35,52,23,385,0,52,23,35,16,385,0,35,16,9,13,385,0,9,13,9,0,70,382,142,45,141,59,36,447,9,463,9,450,159,441,70,382,147,429,69,40,57,25,172,0,172,0,57,25,38,17,172,0,38,17,9,13,466,37,455,24,605,0,605,0,455,24,436,17,605,0,436,17,409,13,578,448,604,450,604,463,578,448,604,463,561,442,561,442,604,463,472,401,561,442,472,401,550,430,550,430,472,401,545,412,561,24,550,35,472,86,472,86,550,35,545,53,472,86,545,53,472,401,472,401,545,53,543,78,472,401,543,78,543,385,284,0,293,0,310,112,310, -112,293,0,472,401,310,112,472,401,465,463,465,463,472,401,604,463,148,463,10,463,39,447,148,463,39,447,58,441,148,463,58,441,70,430,148,463,70,430,75,411,148,463,75,411,77,384,148,463,77,384,107,384,148,463,107,384,284,0,148,463,284,0,310,112,107,105,107,384,77,384,107,105,77,384,109,67,109,67,77,384,77,105,109,67,77,105,114,41,114,41,77,105,75,66,114,41,75,66,126,25,126,25,75,66,69,40,126,25,69,40,172,0,605,0,605,13,579,17,605,0,579,17,561,24,605,0,561,24,471,57,605,0,471,57,466,37,144,17,126,25,172,0,144,17,172,0,172,13,172,0,9,13,9,0,605,0,409,13,409,0,471,57,561,24,472,86,39,447,10,463,10,450,545,412,472,401,543,385,69,42,57,27,172,0,172,0,57,27,38,18,172,0,38,18,9,13,359,446,369,443,495,463,495,463,369,443,377,439,495,463,377,439,384,432,384,432,390,424,495,463,495,463,390,424,393,413,495,463,393,413,454,442,454,442,393,413,448,438,454,442,448,438,448,437,448,437,448,438,441,430,441,430,448,438,397,383,441,430,397,383,398,363,416,-7,398,363,398,125,416,-7,398,125,127,463,495,463,454,442,461,445,495,463,461,445,470,447,495,463,470,447,480,449,495,463,480,449,495,450,428,-7,428,355,416,-7,416,-7,428,355,429,383,416,-7,429,383,398,363,398,363,429,383,431,404,398,363,431,404,436,419,396,400,397,383,448,438,396,400,448,438,393,413,346,448,359,446,495,463,346,448,495,463,329,463,346,448,329,463,329,450,127,463,9,463,27,449,127,463,27,449,41,445,127,463,41,445,52,438,127,463,52,438,64,428,127,463,64,428,77,413,127,463,77,413,107,377,127,463,107,377,416,-7,77,413,109,68,107,105,75,67,69,42,126,28,126,28,69,42,172,0,126,28,172,0,144,19,144,19,172,0,172,13,77,105,75,67,114,44,77,105,114,44,109,68,77,105,109,68,77,413,172,0,9,13,9,0,75,67,126,28,114,44,27,449,9,463,9,450,107,377,77,413,107,105,441,430,398,363,436,419,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,135,376,152,401,176,462,135,376,176, -462,113,430,114,142,113,34,126,105,126,105,113,34,177,1,126,105,177,1,144,73,144,73,177,1,166,47,182,35,166,47,177,1,182,35,177,1,252,-9,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,65,379,65,85,113,430,65,85,104,232,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,114,142,106,185,113,34,113,34,106,185,104,232,34,152,65,85,65,379,34,152,65,379,34,313,34,152,34,313,23,234,312,27,293,21,328,1,328,1,293,21,274,17,328,1,274,17,253,16,253,16,234,17,252,-9,252,-9,234,17,216,20,252,-9,216,20,198,26,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360,391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,329,462,252,473,252,448,392,144,381,107,391,33,391,33,381,107,364,75,391,33,364,75,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,236,399,282,402,236,440,377,399,282,440,377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,439,84,402,236,399,188,439,84,399,188,392,144,439,84,392,144,391,33,253,16,252,-9,328,1,113,34,104,232,65,85,312,27,328,1,328,37,182,35,252,-9,198,26,155,437,166,437,166,438,192,463,166,438,217,434,192,463,217,434,232,461,232,461,217,434,255,423,232,461,255,423,267,456,267,456,255,423,282,403,267,456,282,403,298,446,298,446,282,403,298,373,298,446,298,373,323,434,323,434,298,373,303,333,323,434,303,333,316,226,316,226,298,298,291,214,291,214,298,298,283,269,291,214,283,269,263,206,263,206,283,269,259,248,263,206,259,248,230,203,230,203,259,248,226,234,230,203,226,234,190,202,190,202,226,234,184,230,190,202,184,230,180,202,180,202,184,230,176,230,180,202,176,230,170,202,170,202,176,230,168,230,170,202,168,230,161,202,161,202,168,230,160,231,161,202,160,231,152,203,152,203,160,231,151,231,152,203,151,231,141,232,141,78,141,232,70,386,141,78,70,386,143,51,143,51,70,386,70, -85,141,232,141,204,152,203,380,336,378,356,378,315,378,315,378,356,374,375,378,315,374,375,373,294,373,294,374,375,367,392,373,294,367,392,365,276,365,276,367,392,357,407,365,276,357,407,354,259,354,259,357,407,345,420,354,259,345,420,340,245,340,245,345,420,323,434,340,245,323,434,316,226,192,463,11,463,37,447,192,463,37,447,54,441,192,463,54,441,64,430,192,463,64,430,69,412,192,463,69,412,70,386,192,463,70,386,148,434,192,463,148,434,155,437,192,463,155,437,166,438,141,413,142,422,70,386,141,413,70,386,141,232,144,429,148,434,70,386,144,429,70,386,142,422,207,0,207,13,179,16,207,0,179,16,160,22,207,0,160,22,69,55,207,0,69,55,65,35,207,0,65,35,55,23,207,0,55,23,38,16,207,0,38,16,11,13,207,0,11,13,11,0,70,85,69,55,160,22,70,85,160,22,148,33,70,85,148,33,143,51,37,447,11,463,11,450,298,298,316,226,303,333,217,434,166,438,166,437,111,158,111,35,119,125,119,125,111,35,132,22,119,125,132,22,130,95,130,95,132,22,145,70,161,52,145,70,156,10,161,52,156,10,185,0,111,158,106,195,111,35,111,35,106,195,104,234,94,51,104,234,106,274,94,51,106,274,77,70,77,70,106,274,115,431,77,70,115,431,66,381,206,439,252,473,186,429,186,429,252,473,178,463,186,429,178,463,167,416,167,416,178,463,150,398,134,375,150,398,178,463,134,375,178,463,115,431,181,37,185,0,204,25,204,25,185,0,214,-36,204,25,214,-36,228,18,228,18,214,-36,247,-68,228,18,247,-68,252,16,252,16,247,-68,289,-93,252,16,289,-93,277,18,328,462,252,473,270,446,270,446,252,473,251,448,228,446,251,448,252,473,228,446,252,473,206,439,289,443,306,437,328,462,328,462,306,437,323,428,328,462,323,428,338,416,338,416,360,393,391,431,391,431,360,393,378,362,391,431,378,362,391,325,325,1,348,8,340,49,340,49,348,8,357,66,372,89,357,66,368,17,372,89,368,17,387,29,330,-42,298,-4,338,-110,300,25,298,-4,325,1,300,25,325,1,321,35,321,35,325,1,340,49,289,-93,338,-110,298,-4,289,-93,298,-4,300,25,289,-93,300,25,277,18,470,314,439,380,454,108,470, -314,454,108,469,145,470,314,469,145,478,186,470,314,478,186,481,233,400,195,406,45,402,237,402,237,406,45,439,380,439,380,406,45,433,75,439,380,433,75,454,108,399,283,402,237,439,380,399,283,439,380,391,431,399,283,391,431,391,325,391,431,328,462,338,416,394,155,385,119,387,29,394,155,387,29,406,45,394,155,406,45,400,195,357,66,348,8,368,17,457,-123,491,-123,491,-110,457,-123,491,-110,445,-104,457,-123,445,-104,403,-91,457,-123,403,-91,394,-120,365,-71,330,-42,338,-110,365,-71,338,-110,394,-120,365,-71,394,-120,403,-91,115,431,106,274,112,311,115,431,112,311,122,346,115,431,122,346,134,375,26,195,33,161,35,314,35,314,33,161,44,128,35,314,44,128,66,381,66,381,44,128,59,98,66,381,59,98,77,70,145,70,132,22,156,10,26,195,35,314,23,232,372,89,387,29,385,119,328,462,270,446,289,443,161,52,185,0,181,37,111,35,104,234,94,51,165,437,178,437,178,438,202,463,178,438,225,434,202,463,225,434,240,461,240,461,225,434,261,423,240,461,261,423,274,456,274,456,261,423,286,404,274,456,286,404,303,447,303,447,286,404,301,378,303,447,301,378,306,344,300,305,292,288,303,235,303,235,292,288,280,274,303,235,280,274,266,264,266,264,248,255,256,223,256,223,248,255,228,248,256,223,228,248,348,0,348,0,228,248,206,244,348,0,206,244,182,216,182,216,206,244,179,241,182,216,179,241,143,240,371,393,361,409,363,275,363,275,361,409,348,422,363,275,348,422,339,252,339,252,348,422,328,436,339,252,328,436,306,344,306,344,328,436,303,447,300,305,303,235,305,323,305,323,303,235,339,252,305,323,339,252,306,344,378,304,383,338,381,357,378,304,381,357,377,375,378,304,377,375,371,393,378,304,371,393,363,275,266,264,256,223,303,235,445,15,431,19,462,0,462,0,431,19,419,24,462,0,419,24,348,0,348,0,419,24,408,33,348,0,408,33,396,46,143,78,143,240,71,386,143,78,71,386,144,51,144,51,71,386,71,87,143,240,143,214,182,216,202,463,12,463,39,447,202,463,39,447,56,441,202,463,56,441,66,430,202,463,66,430,70,412,202,463,70,412,71,386,202,463,71,386,156,434,202,463,156,434,165,437,202,463,165, -437,178,438,143,408,144,421,71,386,143,408,71,386,143,240,149,429,156,434,71,386,149,429,71,386,144,421,205,0,205,13,178,16,205,0,178,16,160,22,205,0,160,22,70,56,205,0,70,56,65,35,205,0,65,35,55,23,205,0,55,23,38,16,205,0,38,16,12,13,205,0,12,13,12,0,71,87,70,56,160,22,71,87,160,22,149,33,71,87,149,33,144,51,39,447,12,463,12,450,256,223,348,0,396,46,445,15,462,0,462,13,225,434,178,438,178,437,70,5,74,10,91,59,91,59,74,10,79,13,91,59,79,13,85,14,85,14,90,14,91,59,91,59,90,14,96,13,91,59,96,13,120,35,120,35,96,13,103,11,120,35,103,11,110,9,133,328,116,351,135,230,135,230,116,351,110,378,102,252,110,378,99,452,102,252,99,452,78,275,78,275,99,452,73,427,78,275,73,427,62,299,62,299,73,427,56,393,62,299,56,393,53,325,53,325,56,393,50,351,113,400,123,418,132,468,132,468,123,418,137,432,132,468,137,432,172,473,172,473,137,432,157,441,172,473,157,441,180,445,180,445,205,442,188,473,188,473,205,442,202,471,113,400,132,468,99,452,113,400,99,452,110,378,188,473,172,473,180,445,202,471,205,442,216,468,216,468,205,442,227,434,216,468,227,434,230,464,230,464,227,434,248,423,230,464,248,423,245,458,245,458,248,423,253,455,133,328,135,230,159,305,159,305,135,230,162,215,159,305,162,215,194,283,194,283,162,215,188,199,194,283,188,199,213,182,190,16,167,-7,184,-9,190,16,184,-9,201,-9,190,16,152,20,167,-7,110,9,118,6,120,35,120,35,118,6,134,0,120,35,134,0,152,20,152,20,134,0,150,-3,152,20,150,-3,167,-7,51,-8,66,-8,66,94,66,94,66,-8,67,0,66,94,67,0,91,59,91,59,67,0,70,5,45,139,30,139,51,-8,45,139,51,-8,66,94,194,283,213,182,235,259,235,259,213,182,235,165,235,259,235,165,252,149,252,149,260,140,275,233,275,233,260,140,265,130,275,233,265,130,269,119,344,121,340,152,337,77,337,77,340,152,327,180,337,77,327,180,317,41,317,41,327,180,305,207,317,41,305,207,286,14,286,14,305,207,275,233,286,14,275,233,273,94,273,94,269,68,286, -14,286,14,269,68,258,46,286,14,258,46,247,-3,247,-3,258,46,240,30,247,-3,240,30,217,19,275,233,269,119,272,107,275,233,272,107,273,94,275,233,235,259,252,149,217,19,190,16,201,-9,217,19,201,-9,247,-3,266,408,282,390,271,450,271,450,282,390,276,449,282,450,276,449,282,390,266,408,271,450,266,451,266,408,266,451,259,452,266,408,259,452,253,455,266,408,253,455,248,423,313,473,298,473,301,356,313,473,301,356,306,341,313,473,306,341,311,324,313,473,311,324,328,324,288,453,289,380,292,458,292,458,289,380,295,368,292,458,295,368,296,465,296,465,295,368,301,356,296,465,301,356,298,473,282,450,282,390,289,380,282,450,289,380,288,453,135,230,110,378,102,252,410,463,17,463,98,432,410,463,98,432,136,434,410,463,136,434,178,434,410,463,178,434,249,434,410,463,249,434,291,434,410,463,291,434,329,432,410,463,329,432,356,425,410,463,356,425,375,409,410,463,375,409,388,383,410,463,388,383,398,345,410,463,398,345,415,345,268,22,256,33,178,86,178,86,256,33,251,51,178,86,251,51,178,434,178,434,251,51,249,77,178,434,249,77,249,434,17,463,12,345,29,345,17,463,29,345,38,383,17,463,38,383,51,409,17,463,51,409,70,425,17,463,70,425,98,432,316,0,316,13,288,16,316,0,288,16,268,22,316,0,268,22,177,55,316,0,177,55,172,35,316,0,172,35,160,23,316,0,160,23,141,16,316,0,141,16,112,13,316,0,112,13,112,0,177,55,268,22,178,86,147,110,148,11,152,88,152,88,148,11,169,2,152,88,169,2,161,69,161,69,169,2,175,52,188,42,175,52,193,-4,188,42,193,-4,204,33,204,33,193,-4,219,-8,204,33,219,-8,222,26,222,26,219,-8,248,-9,222,26,248,-9,242,22,242,22,248,-9,265,21,291,23,265,21,285,-7,291,23,285,-7,318,-1,145,166,145,384,130,23,145,166,130,23,145,135,145,135,130,23,148,11,145,135,148,11,147,110,175,52,169,2,193,-4,396,144,394,119,405,63,405,63,394,119,390,98,405,63,390,98,390,41,390,41,390,98,382,80,390,41,382,80,371,63,371,62,371,63,356,48,371,62,356,48,370,23,370,23,356,48,346,9,337,37,315,28,318,-1,337, -37,318,-1,346,9,337,37,346,9,356,48,494,463,331,463,360,446,494,463,360,446,379,437,494,463,379,437,390,421,494,463,390,421,445,435,494,463,445,435,464,445,494,463,464,445,494,450,427,361,429,395,416,87,427,361,416,87,423,114,427,361,423,114,426,145,427,361,426,145,427,183,405,63,416,87,429,395,405,63,429,395,397,359,405,63,397,359,397,175,405,63,397,175,396,144,434,419,445,435,395,396,434,419,395,396,397,359,434,419,397,359,429,395,371,62,370,23,390,41,371,62,390,41,371,63,265,21,248,-9,285,-7,180,446,208,450,208,463,180,446,208,463,161,440,161,440,208,463,71,415,161,440,71,415,73,391,75,133,73,391,73,174,81,97,93,67,146,411,146,411,93,67,109,42,146,411,109,42,145,384,145,384,109,42,130,23,146,411,151,429,73,391,146,411,73,391,75,133,146,411,75,133,81,97,208,463,10,463,38,447,208,463,38,447,56,441,208,463,56,441,66,431,208,463,66,431,71,415,38,447,10,463,10,450,161,440,73,391,151,429,360,446,331,463,331,450,445,435,390,421,395,396,291,23,318,-1,315,28,87,373,258,-7,87,373,87,373,258,-7,146,420,87,373,146,420,145,427,145,427,146,434,87,373,87,373,146,434,150,440,87,373,150,440,71,407,197,463,11,463,29,448,197,463,29,448,44,442,197,463,44,442,57,429,197,463,57,429,71,407,197,463,71,407,156,444,197,463,156,444,165,447,197,463,165,447,177,448,197,463,177,448,197,450,393,405,390,394,423,387,423,387,390,394,386,383,423,387,386,383,382,371,382,371,280,113,423,387,423,387,280,113,268,-7,488,463,345,463,361,449,488,463,361,449,375,447,488,463,375,447,386,442,488,463,386,442,393,434,488,463,393,434,395,421,488,463,395,421,459,442,488,463,459,442,473,448,488,463,473,448,488,450,395,421,423,387,435,413,395,421,435,413,447,431,395,421,447,431,459,442,395,413,393,405,423,387,395,413,423,387,395,421,258,-7,268,-7,280,113,258,-7,280,113,173,352,258,-7,173,352,162,377,258,-7,162,377,154,396,258,-7,154,396,149,409,258,-7,149,409,146,420,361,449,345,463,345,450,29,448,11,463,11,450,156,444,71,407,150,440,22,447,38,439,174,463,174,463,38, -439,51,424,174,463,51,424,135,442,135,442,51,424,63,400,135,442,63,400,77,366,77,366,102,294,131,436,131,436,102,294,130,428,130,423,130,428,129,220,130,423,129,220,157,144,156,449,174,450,174,463,156,449,174,463,143,446,143,446,174,463,135,442,130,428,102,294,129,220,135,442,77,366,131,436,3,463,3,450,22,447,3,463,22,447,174,463,351,231,374,172,352,426,352,426,354,434,311,330,311,330,354,434,291,383,279,413,291,383,360,440,279,413,360,440,405,463,405,463,360,440,371,445,405,463,371,445,386,449,386,449,405,450,405,463,352,426,311,330,329,288,352,426,329,288,351,231,360,440,291,383,354,434,405,463,220,463,240,449,405,463,240,449,255,444,405,463,255,444,267,433,405,463,267,433,279,413,552,367,505,156,528,221,552,367,528,221,556,297,552,367,463,130,482,85,552,367,482,85,505,156,463,130,363,385,374,172,463,130,374,172,397,112,463,130,397,112,419,52,463,130,419,52,441,-7,463,130,441,-7,452,-7,463,130,452,-7,482,85,374,172,363,385,360,395,374,172,360,395,356,404,374,172,356,404,354,413,374,172,354,413,352,420,374,172,352,420,352,426,563,412,561,402,595,401,595,401,561,402,559,392,595,401,559,392,556,297,556,297,559,392,556,380,556,297,556,380,552,367,563,421,595,401,602,419,563,421,602,419,610,432,563,421,610,432,620,440,563,421,620,440,652,463,563,421,652,463,562,432,563,412,595,401,563,421,634,446,652,450,652,463,634,446,652,463,620,440,652,463,515,463,533,449,652,463,533,449,547,445,652,463,547,445,556,439,652,463,556,439,562,432,238,132,138,395,157,144,238,132,157,144,184,68,238,132,184,68,211,-7,238,132,211,-7,221,-7,238,132,221,-7,329,288,238,132,329,288,311,330,157,144,138,395,135,403,157,144,135,403,132,410,157,144,132,410,131,417,157,144,131,417,130,423,533,449,515,463,515,450,240,449,220,463,220,450,43,23,170,0,60,37,60,37,170,0,123,23,60,37,123,23,81,59,81,59,123,23,118,29,81,59,118,29,116,36,116,36,118,43,109,93,109,93,118,43,122,53,109,93,122,53,218,230,218,230,122,53,129,65,218,230,129,65,139,80,144,338,218,230,176,416,144,338,176,416,173, -429,173,429,175,437,144,338,218,230,139,80,153,98,153,98,237,202,218,230,218,230,237,202,232,327,218,230,232,327,212,357,109,93,81,59,116,36,144,338,175,437,109,387,109,387,175,437,179,443,109,387,179,443,83,418,83,418,179,443,186,446,83,418,186,446,226,463,226,463,186,446,195,448,226,463,195,448,205,449,205,449,226,450,226,463,226,463,16,463,40,446,226,463,40,446,61,437,226,463,61,437,83,418,365,414,359,406,380,380,380,380,359,406,351,395,380,380,351,395,341,380,341,380,263,283,280,257,280,257,263,283,303,104,280,257,303,104,415,65,415,65,303,104,316,84,415,65,316,84,326,67,488,463,321,463,341,449,488,463,341,449,354,446,488,463,354,446,363,442,488,463,363,442,367,436,488,463,367,436,369,427,488,463,369,427,443,440,488,463,443,440,463,447,488,463,463,447,488,450,369,427,380,380,404,408,369,427,404,408,424,428,369,427,424,428,443,440,368,421,365,414,380,380,368,421,380,380,369,427,341,380,280,257,380,380,333,23,326,19,493,0,493,0,326,19,316,16,493,0,316,16,304,15,339,35,493,0,457,22,339,35,457,22,443,31,339,35,443,31,430,45,339,35,430,45,415,65,339,35,415,65,338,43,415,65,326,67,333,54,415,65,333,54,338,43,263,283,232,327,237,202,263,283,237,202,303,104,473,16,457,22,493,0,473,16,493,0,493,13,338,28,333,23,493,0,338,28,493,0,339,35,286,13,286,0,493,0,286,13,493,0,304,15,218,230,212,357,195,381,218,230,195,381,183,400,218,230,183,400,176,416,170,0,170,13,148,16,170,0,148,16,133,19,170,0,133,19,123,23,26,17,7,13,170,0,26,17,170,0,43,23,170,0,7,13,7,0,341,449,321,463,321,450,40,446,16,463,16,450,169,405,166,412,220,205,220,205,166,412,163,419,220,205,163,419,129,340,129,340,163,419,161,425,129,340,161,425,161,431,161,431,162,437,129,340,211,463,16,463,34,447,211,463,34,447,51,438,211,463,51,438,71,419,211,463,71,419,173,446,211,463,173,446,182,448,211,463,182,448,194,449,211,463,194,449,211,450,173,446,71,419,166,442,166,442,71,419,95,387,166,442,95,387,162,437,162,437,95,387,129,340,292, -77,292,212,276,244,292,77,276,244,294,50,294,50,276,244,220,205,294,50,220,205,301,32,301,32,220,205,220,86,301,32,220,86,313,22,313,22,220,86,219,55,313,22,219,55,364,0,364,0,219,55,213,34,364,0,213,34,201,23,385,417,383,412,395,372,395,372,383,412,381,405,395,372,381,405,377,399,377,399,276,244,292,212,492,463,340,463,359,449,492,463,359,449,372,446,492,463,372,446,381,442,492,463,381,442,385,436,492,463,385,436,387,428,492,463,387,428,451,438,492,463,451,438,470,446,492,463,470,446,492,450,387,428,395,372,416,403,387,428,416,403,434,424,387,428,434,424,451,438,395,372,387,428,386,423,395,372,386,423,385,417,377,399,292,212,395,372,334,16,313,22,364,0,334,16,364,0,364,13,181,16,150,13,364,0,181,16,364,0,201,23,173,398,169,405,220,205,173,398,220,205,276,244,364,0,150,13,150,0,359,449,340,463,340,450,34,447,16,463,16,450,49,379,54,391,37,463,37,463,54,391,60,402,37,463,60,402,70,413,70,413,81,421,37,463,37,463,81,421,95,428,37,463,95,428,113,433,102,27,405,453,313,437,313,437,405,453,405,463,313,437,405,463,163,437,136,436,163,437,405,463,136,436,405,463,37,463,37,463,23,344,41,344,37,463,41,344,45,364,37,463,45,364,49,379,313,437,7,10,102,27,102,27,7,10,401,0,102,27,401,0,279,27,279,27,401,0,301,27,389,83,382,68,401,0,401,0,382,68,372,56,401,0,372,56,360,46,360,46,349,39,401,0,401,0,349,39,335,34,401,0,335,34,319,30,401,0,419,123,402,123,401,0,402,123,395,101,401,0,395,101,389,83,401,0,7,10,7,0,301,27,401,0,319,30,37,463,113,433,136,436,121,435,128,441,62,463,62,463,128,441,138,445,62,463,138,445,209,463,209,463,138,445,152,446,115,-53,115,413,62,463,115,-53,62,463,62,-108,115,-53,62,-108,116,-68,116,426,121,435,62,463,116,426,62,463,115,413,209,-90,152,-90,209,-108,209,-108,152,-90,139,-89,209,-108,139,-89,62,-108,62,-108,139,-89,129,-85,62,-108,129,-85,121,-78,116,-68,62,-108,121,-78,209,463,152,446,209,446,201,-9,41,473,-5,473,201,-9,-5,473,153,-9,172,-108,172, -463,118,408,172,-108,118,408,118,-58,172,-108,118,-58,117,-70,172,-108,117,-70,114,-79,172,-108,114,-79,108,-85,172,-108,108,-85,98,-89,172,-108,98,-89,85,-90,172,-108,85,-90,23,-90,172,-108,23,-90,23,-108,107,440,113,432,172,463,172,463,113,432,117,421,172,463,117,421,118,408,172,463,23,463,83,446,172,463,83,446,97,445,172,463,97,445,107,440,83,446,23,463,23,446,17,208,64,208,144,463,144,463,64,208,165,410,144,463,165,410,185,463,185,463,165,410,265,208,185,463,265,208,313,208,350,-87,350,-51,0,-51,350,-87,0,-51,0,-87,141,355,170,355,68,459,141,355,68,459,61,465,141,355,61,465,55,469,141,355,55,469,50,472,141,355,50,472,44,474,141,355,44,474,38,474,141,355,38,474,34,422,13,452,13,445,14,460,14,460,13,445,16,439,14,460,16,439,17,466,17,466,16,439,20,433,17,466,20,433,22,471,22,471,20,433,26,427,22,471,26,427,29,473,29,473,26,427,34,422,29,473,34,422,38,474,52,218,61,214,62,291,62,291,61,214,70,212,62,291,70,212,75,301,75,301,70,212,80,214,75,301,80,214,88,308,88,308,80,214,89,219,88,308,89,219,103,314,103,314,89,219,98,271,100,233,98,271,95,225,155,322,146,305,164,303,155,322,164,303,177,321,177,321,164,303,179,296,177,321,179,296,197,317,197,317,179,296,191,283,197,317,191,283,198,266,107,291,117,299,119,318,119,318,117,299,130,304,119,318,130,304,137,321,137,321,130,304,146,305,137,321,146,305,155,322,103,314,98,271,100,282,103,314,100,282,107,291,103,314,107,291,119,318,98,271,89,219,95,225,40,257,41,234,45,268,45,268,41,234,46,225,45,268,46,225,52,280,52,280,46,225,52,218,52,280,52,218,62,291,258,79,258,213,257,235,258,79,257,235,256,253,258,79,256,253,252,267,258,79,252,267,260,-5,266,40,273,-2,272,35,272,35,273,-2,280,33,286,33,280,33,285,3,286,33,285,3,297,13,262,49,259,62,260,-5,262,49,260,-5,273,-2,262,49,273,-2,266,40,205,24,212,10,213,310,213,310,212,10,220,0,213,310,220,0,227,302,227,302,220,0,232,-4,227,302,232,-4,238,291,238,291,232,-4,246,-6,238,291,246,-6,247, -279,247,279,246,-6,260,-5,247,279,260,-5,252,267,213,310,197,317,198,266,213,310,198,266,201,242,213,310,201,242,201,188,213,310,201,188,202,44,213,310,202,44,205,24,201,44,202,44,201,188,201,205,201,188,201,242,303,41,297,37,297,13,303,41,297,13,309,27,303,41,309,27,309,46,291,35,286,33,297,13,291,35,297,13,297,37,280,33,273,-2,285,3,201,44,201,188,201,89,201,44,201,89,200,78,201,44,200,78,198,69,201,44,198,69,194,60,201,44,194,60,187,53,201,44,187,53,179,23,179,23,187,53,177,45,177,45,169,40,179,23,179,23,169,40,161,37,179,23,161,37,158,8,158,8,161,37,153,35,158,8,153,35,144,34,138,160,156,169,159,189,159,189,156,169,177,178,159,189,177,178,201,205,201,205,177,178,201,188,91,111,96,122,106,165,106,165,96,122,102,132,106,165,102,132,111,141,111,141,123,151,128,176,128,176,123,151,138,160,128,176,138,160,159,189,128,176,106,165,111,141,100,255,99,260,100,233,100,255,100,233,102,241,100,255,102,241,101,249,98,265,98,271,100,233,98,265,100,233,99,260,89,156,75,148,75,-3,89,156,75,-3,88,88,89,156,88,88,88,100,89,156,88,100,91,111,89,156,91,111,106,165,88,88,75,-3,90,68,90,68,75,-3,99,-6,90,68,99,-6,97,53,97,53,99,-6,107,42,28,87,29,40,35,105,35,105,29,40,39,20,35,105,39,20,46,122,46,122,39,20,55,5,46,122,55,5,59,136,59,136,55,5,75,-3,59,136,75,-3,75,148,118,-5,138,0,120,36,120,36,138,0,136,34,144,34,136,34,138,0,144,34,138,0,158,8,107,42,99,-6,118,-5,107,42,118,-5,120,36,29,40,28,87,26,66,258,79,260,-5,259,62,41,234,40,257,39,245,6,436,9,436,23,454,23,454,9,436,11,437,23,454,11,437,14,437,14,437,29,436,23,454,23,454,29,436,41,459,135,22,120,29,130,-3,130,-3,120,29,111,39,130,-3,111,39,99,2,99,2,111,39,107,52,99,2,107,52,104,478,104,478,107,52,107,263,104,478,107,263,107,477,87,473,72,468,73,13,73,13,72,468,57,464,73,13,57,464,55,25,55,25,57,464,48,396,55,25,48,396,48,39,4, -436,6,436,23,454,4,436,23,454,2,448,4,436,2,448,2,435,218,26,205,20,216,1,216,1,205,20,191,17,216,1,191,17,175,16,175,16,154,17,164,-6,164,-6,154,17,135,22,164,-6,135,22,130,-3,87,473,73,13,99,2,87,473,99,2,104,478,29,436,39,433,41,459,41,459,39,433,45,426,41,459,45,426,57,464,57,464,45,426,48,414,57,464,48,414,48,396,177,319,177,278,191,277,177,319,191,277,202,322,202,322,191,277,205,272,202,322,205,272,243,314,243,314,205,272,218,266,243,314,218,266,229,257,107,223,111,240,118,283,118,283,111,240,121,255,118,283,121,255,134,299,134,299,121,255,136,267,134,299,136,267,154,312,154,312,136,267,155,275,154,312,155,275,177,319,177,319,155,275,177,278,107,223,118,283,107,263,107,223,107,263,107,52,243,314,239,245,248,228,243,314,248,228,278,293,278,293,248,228,256,208,278,293,256,208,261,186,261,94,256,75,261,25,261,25,256,75,249,59,261,25,249,59,240,45,240,45,230,35,261,25,261,25,230,35,218,26,261,25,218,26,216,1,327,168,321,217,319,110,319,110,321,217,305,260,319,110,305,260,296,61,296,61,305,260,278,293,296,61,278,293,266,138,266,138,278,293,264,163,261,94,261,25,265,115,265,115,261,25,296,61,265,115,296,61,266,138,175,16,164,-6,216,1,278,293,261,186,264,163,243,314,229,257,239,245,114,68,91,97,107,0,107,0,91,97,76,135,107,0,76,135,70,22,70,22,76,135,71,180,77,286,71,180,76,220,77,286,76,220,88,254,180,44,151,-6,168,-5,180,44,168,-5,185,-1,180,44,144,50,151,-6,114,68,107,0,151,-6,114,68,151,-6,144,50,190,297,197,291,205,318,205,318,197,291,203,281,205,318,203,281,208,268,208,268,212,252,234,308,234,308,212,252,216,241,234,308,216,241,222,232,171,322,166,302,180,300,171,322,180,300,205,318,205,318,180,300,190,297,273,272,258,292,265,226,273,272,265,226,272,232,273,272,272,232,277,241,273,272,277,241,279,250,258,292,234,308,237,222,258,292,237,222,245,220,258,292,245,220,256,222,258,292,256,222,265,226,234,308,222,232,229,226,234,308,229,226,237,222,234,308,205,318,208,268,243,33,254, -45,260,84,260,84,254,45,264,61,260,84,264,61,279,109,279,109,264,61,276,80,279,109,276,80,288,103,185,-1,201,4,202,46,202,46,201,4,216,12,202,46,216,12,222,53,222,53,216,12,231,23,222,53,231,23,241,65,241,65,231,23,243,33,241,65,243,33,260,84,202,46,180,44,185,-1,135,296,166,302,151,320,135,296,151,320,132,316,135,296,132,316,113,309,135,296,113,309,109,280,94,299,77,286,88,254,94,299,88,254,109,280,94,299,109,280,113,309,56,265,39,241,42,55,56,265,42,55,70,22,56,265,70,22,71,180,56,265,71,180,77,286,27,213,20,182,24,97,27,213,24,97,42,55,27,213,42,55,39,241,166,302,171,322,151,320,24,97,20,182,17,148,238,292,223,304,224,273,224,273,223,304,209,312,224,273,209,312,208,288,208,288,209,312,195,318,208,288,195,318,189,299,189,299,195,318,180,321,189,299,180,321,166,302,94,252,113,279,119,313,119,313,113,279,137,296,119,313,137,296,165,322,165,322,137,296,166,302,165,322,166,302,180,321,19,144,25,94,26,200,26,200,25,94,42,52,26,200,42,52,47,249,47,249,42,52,69,20,47,249,69,20,79,288,79,288,69,20,79,172,79,288,79,172,83,216,79,288,83,216,94,252,79,288,94,252,119,313,176,30,148,-6,170,-4,176,30,170,-4,190,0,176,30,143,36,148,-6,116,55,96,84,105,0,116,55,105,0,148,-6,116,55,148,-6,143,36,83,124,79,172,69,20,83,124,69,20,105,0,83,124,105,0,96,84,236,64,234,60,238,40,238,40,234,60,231,56,238,40,231,56,227,52,227,52,219,44,223,22,223,22,219,44,210,37,223,22,210,37,207,9,207,9,210,37,200,33,207,9,200,33,190,0,190,0,200,33,188,31,190,0,188,31,176,30,197,437,199,437,215,454,215,454,199,437,202,437,215,454,202,437,205,437,205,437,219,436,215,454,215,454,219,436,236,460,215,454,191,448,194,436,215,454,194,436,197,437,238,292,238,232,238,40,238,292,238,40,238,401,237,416,238,401,255,466,237,416,255,466,236,460,238,292,224,273,234,254,238,292,234,254,238,232,241,-6,344,30,315,41,241,-6,315,41,306,45,241,-6,306,45,300,52,241,-6,300,52,298, -63,241,-6,298,63,255,466,241,-6,255,466,238,40,241,-6,238,40,238,-4,238,40,238,232,238,71,238,40,238,71,238,68,238,40,238,68,236,64,227,52,223,22,238,40,297,80,297,477,293,478,297,80,293,478,274,472,297,80,274,472,298,63,334,40,331,40,344,30,344,30,331,40,329,40,344,30,329,40,327,40,327,40,315,41,344,30,338,40,334,40,344,30,338,40,344,30,344,41,236,460,219,436,228,432,236,460,228,432,234,426,236,460,234,426,237,416,194,436,191,448,191,436,255,466,238,401,238,40,255,466,298,63,274,472,73,140,70,165,68,21,68,21,70,165,68,194,68,21,68,194,43,254,68,21,43,254,40,54,40,54,43,254,24,207,40,54,24,207,23,98,23,98,24,207,17,152,187,320,163,322,168,294,168,294,163,322,144,297,122,294,144,297,163,322,122,294,163,322,113,314,266,87,247,67,254,36,254,36,247,67,226,52,254,36,226,52,224,12,224,12,226,52,204,44,224,12,204,44,190,-1,190,-1,204,44,178,41,284,194,281,215,278,232,284,194,278,232,273,248,284,194,273,248,267,261,284,194,267,261,259,273,284,194,259,273,245,290,284,194,245,290,228,304,284,194,228,304,212,216,284,194,212,216,70,216,284,194,70,216,68,194,198,269,206,246,209,314,209,314,206,246,212,216,209,314,212,216,228,304,278,69,297,110,286,115,278,69,286,115,266,87,278,69,266,87,254,36,159,43,142,47,151,-6,159,43,151,-6,190,-1,159,43,190,-1,178,41,142,47,126,55,151,-6,151,-6,126,55,112,66,151,-6,112,66,105,0,105,0,112,66,100,80,187,320,168,294,186,285,187,320,186,285,198,269,187,320,198,269,209,314,70,216,77,245,73,290,73,290,77,245,88,267,73,290,88,267,113,314,113,314,88,267,103,284,113,314,103,284,122,294,73,290,43,254,68,194,73,290,68,194,70,216,105,0,100,80,87,99,105,0,87,99,79,119,105,0,79,119,73,140,105,0,73,140,68,21,80,390,76,370,132,46,132,46,76,370,73,345,132,46,73,345,72,293,72,293,73,345,72,315,72,293,72,315,15,315,110,445,132,46,131,73,131,315,131,293,216,293,131,315,216,293,216,315,186,455,195,478,179,458,179,458,195,478,170,459,156, -456,170,459,170,476,156,456,170,476,147,469,131,396,133,418,127,459,127,459,133,418,137,436,127,459,137,436,147,469,147,469,137,436,145,449,147,469,145,449,156,456,127,459,110,445,131,73,127,459,131,73,131,396,264,449,255,461,256,412,264,449,256,412,263,418,264,449,263,418,267,425,264,449,267,425,268,434,232,407,239,406,239,470,239,470,239,406,248,408,239,470,248,408,255,461,255,461,248,408,256,412,207,431,214,421,219,476,219,476,214,421,220,414,219,476,220,414,239,470,239,470,220,414,226,410,239,470,226,410,232,407,200,442,207,431,219,476,200,442,219,476,195,478,200,442,195,478,193,450,195,478,170,476,170,459,196,0,196,10,167,13,196,0,167,13,148,18,196,0,148,18,71,47,196,0,71,47,66,30,196,0,66,30,56,19,196,0,56,19,39,13,196,0,39,13,14,10,196,0,14,10,14,0,132,46,110,445,97,427,132,46,97,427,87,409,132,46,87,409,80,390,72,73,71,47,148,18,72,73,148,18,137,29,72,73,137,29,132,46,72,73,132,46,72,293,72,293,15,315,15,293,195,478,186,455,193,450,119,166,113,114,124,102,124,102,113,114,112,94,112,94,113,114,107,108,112,94,107,108,102,84,102,84,107,108,101,103,102,84,101,103,96,73,96,73,101,103,95,97,96,73,95,97,93,64,93,64,89,92,89,-18,89,-18,89,92,88,1,162,105,178,122,156,105,156,105,178,122,154,127,156,105,154,127,148,106,148,106,154,127,135,108,124,102,135,108,134,142,124,102,134,142,119,166,165,322,158,302,170,301,165,322,170,301,176,321,176,321,170,301,182,297,176,321,182,297,187,320,187,320,182,297,192,290,187,320,192,290,198,318,198,318,192,290,202,281,198,318,202,281,210,315,210,315,202,281,209,270,178,122,162,105,168,105,178,122,168,105,172,105,178,122,172,105,175,105,178,122,175,105,190,106,154,127,134,142,135,108,237,306,221,312,222,237,237,306,222,237,227,220,237,306,227,220,229,202,237,306,229,202,230,185,237,306,230,185,234,122,237,306,234,122,248,131,237,306,248,131,245,303,234,122,230,185,228,164,234,122,228,164,221,146,234,122,221,146,220,115,178,122,190,106,196,125,196,125,190,106,205,109,196,125,205, -109,210,133,210,133,205,109,220,115,210,133,220,115,221,146,115,278,126,291,128,316,128,316,126,291,140,299,128,316,140,299,165,322,165,322,140,299,158,302,106,234,106,237,96,300,96,300,106,237,109,259,96,300,109,259,128,316,128,316,109,259,115,278,113,114,119,166,110,197,113,114,110,197,106,234,113,114,106,234,96,300,113,114,96,300,89,129,71,276,54,244,58,163,71,276,58,163,70,145,71,276,70,145,89,129,71,276,89,129,96,300,54,244,48,208,51,184,54,244,51,184,58,163,71,74,62,64,62,16,71,74,62,16,73,9,71,74,73,9,84,86,51,37,52,29,52,46,52,46,52,29,55,22,52,46,55,22,56,55,56,55,55,22,62,16,56,55,62,16,62,64,42,-37,43,-124,62,-19,62,-19,43,-124,69,-138,62,-19,69,-138,69,-61,69,-61,70,-51,62,-19,62,-19,70,-51,73,-42,62,-19,73,-42,88,1,88,1,73,-42,79,-32,88,1,79,-32,89,-18,103,-1,101,53,95,58,103,-1,95,58,93,64,103,-1,93,64,89,-18,103,-1,112,49,101,53,84,86,73,9,88,1,84,86,88,1,89,92,87,-92,102,-148,108,-102,108,-102,102,-148,141,-151,108,-102,141,-151,136,-109,136,-109,141,-151,170,-111,170,-111,170,-112,215,-108,215,-108,170,-112,171,-149,215,-108,171,-149,201,-144,73,-78,69,-61,69,-138,73,-78,69,-138,102,-148,73,-78,102,-148,87,-92,29,-53,22,-68,26,-105,29,-53,26,-105,43,-124,29,-53,43,-124,42,-37,275,299,267,299,271,272,275,299,271,272,329,272,275,299,329,272,329,299,283,192,284,213,284,224,283,192,284,224,282,236,283,192,282,236,280,247,283,192,280,247,279,174,276,259,271,272,271,158,276,259,271,158,279,174,276,259,279,174,280,247,267,299,259,300,261,144,267,299,261,144,271,158,267,299,271,158,271,272,252,301,245,303,248,131,252,301,248,131,261,144,252,301,261,144,259,300,216,254,222,237,221,312,216,254,221,312,210,315,216,254,210,315,209,270,291,-20,300,-30,308,10,308,10,300,-30,303,-44,308,-79,303,-44,297,-66,194,-9,216,-9,238,41,238,41,216,-9,250,-10,238,41,250,-10,267,36,267,36,250,-10,274,-14,267,36,274,-14,290,25,290,25,274,-14,291,-20,290,25,291,-20,308,10,319,-9,308,10,308, --79,319,-9,308,-79,316,-65,319,-9,316,-65,321,-50,319,-9,321,-50,323,-33,215,-108,230,-135,251,-99,251,-99,230,-135,257,-122,251,-99,257,-122,279,-85,279,-85,257,-122,280,-107,279,-85,280,-107,297,-66,297,-66,280,-107,296,-93,297,-66,296,-93,308,-79,194,-9,238,41,168,-7,168,-7,238,41,148,45,168,-7,148,45,143,-6,143,-6,148,45,128,46,143,-6,128,46,121,-3,121,-3,128,46,112,49,121,-3,112,49,103,-1,170,-111,141,-151,171,-149,170,-111,171,-149,170,-112,215,-108,201,-144,230,-135,303,-44,308,-79,308,10,26,-105,22,-68,20,-83,89,92,93,64,95,97,47,31,39,20,158,0,158,0,39,20,26,14,158,0,26,14,6,10,10,437,12,437,26,453,26,453,12,437,14,437,26,453,14,437,16,437,16,437,31,436,26,453,26,453,31,436,47,459,26,453,7,448,9,436,26,453,9,436,10,437,123,20,115,30,51,71,51,71,115,30,111,47,51,71,111,47,51,401,50,416,51,401,64,465,50,416,64,465,47,459,47,459,31,436,41,433,47,459,41,433,47,427,47,459,47,427,50,416,110,263,110,476,106,478,110,263,106,478,110,71,110,71,106,478,92,473,110,71,92,473,111,47,111,47,92,473,79,469,111,47,79,469,64,465,189,320,188,284,207,281,189,320,207,281,212,322,212,322,207,281,221,272,212,322,221,272,244,317,244,317,221,272,232,258,244,317,232,258,238,237,110,240,127,257,129,286,129,286,127,257,142,270,129,286,142,270,148,302,148,302,142,270,157,278,148,302,157,278,168,313,168,313,157,278,172,283,168,313,172,283,189,320,189,320,172,283,188,284,110,71,110,240,110,263,110,263,110,240,129,286,235,30,227,20,341,0,341,0,227,20,213,14,341,0,213,14,192,10,244,317,238,237,240,210,303,31,240,210,240,71,303,31,240,71,310,21,310,21,240,71,239,47,310,21,239,47,341,0,341,0,239,47,235,30,299,71,299,211,296,251,299,71,296,251,285,282,299,71,285,282,300,47,322,15,310,21,341,0,322,15,341,0,341,10,240,210,303,31,244,317,244,317,303,31,300,47,244,317,300,47,268,304,268,304,300,47,285,282,158,0,158,10,137,14,158,0,137,14,123,20,158,0,123,20,50,47,158,0,50,47,47,31,158, -0,6,10,6,0,50,47,123,20,51,71,51,401,111,47,64,465,341,0,192,10,192,0,9,436,7,448,7,436,55,442,56,431,56,453,56,453,56,431,61,421,56,453,61,421,61,463,61,463,61,421,69,414,61,463,69,414,69,471,69,471,69,414,79,409,69,471,79,409,79,476,79,476,79,409,90,407,79,476,90,407,91,478,91,478,90,407,102,409,91,478,102,409,102,476,102,476,102,409,112,414,102,476,112,414,112,471,112,471,112,414,119,421,112,471,119,421,119,463,119,463,119,421,124,431,119,463,124,431,124,453,124,453,124,431,126,442,61,29,51,18,177,0,177,0,51,18,35,13,177,0,35,13,11,10,28,275,34,276,123,322,123,322,34,276,39,276,123,322,39,276,44,276,44,276,53,274,123,322,123,322,53,274,59,270,123,322,59,270,63,262,61,29,177,0,65,46,65,46,177,0,139,19,65,46,139,19,66,73,66,73,139,19,130,30,66,73,130,30,66,232,66,249,66,232,123,322,66,249,123,322,63,262,21,274,28,275,123,322,21,274,123,322,14,284,21,274,14,284,14,273,125,73,125,320,123,322,125,73,123,322,66,232,125,73,66,232,126,47,154,13,139,19,177,0,154,13,177,0,177,10,177,0,11,10,11,0,66,232,130,30,126,47,121,471,121,414,129,463,129,463,121,414,129,421,129,463,129,421,134,453,134,453,129,421,134,431,134,453,134,431,136,442,64,442,66,431,66,453,66,453,66,431,71,421,66,453,71,421,71,463,71,463,71,421,78,414,71,463,78,414,79,471,79,471,78,414,88,409,79,471,88,409,89,476,89,476,88,409,99,407,89,476,99,407,100,478,100,478,99,407,111,409,100,478,111,409,111,476,111,476,111,409,121,414,111,476,121,414,121,471,26,273,32,275,46,292,26,273,46,292,23,284,26,273,23,284,23,273,59,-123,54,-126,58,-145,58,-145,54,-126,49,-127,58,-145,49,-127,43,-128,43,-128,37,-127,58,-145,58,-145,37,-127,31,-125,58,-145,31,-125,26,-122,73,262,87,306,69,270,69,270,87,306,67,298,69,270,67,298,63,274,63,274,67,298,54,276,49,276,54,276,67,298,49,276,67,298,46,292,75,-79,73,-95,92,-126,92,-126,73,-95,70,-106,92,-126,70,-106,66,-115,66,-115,63, --119,92,-126,92,-126,63,-119,59,-123,92,-126,59,-123,58,-145,130,-53,131,322,116,-95,116,-95,131,322,108,313,116,-95,108,313,92,-126,92,-126,108,313,87,306,92,-126,87,306,77,234,77,234,87,306,76,250,46,292,32,275,38,275,46,292,38,275,44,276,46,292,44,276,49,276,135,0,135,320,131,322,135,0,131,322,130,-53,92,-126,77,234,77,-30,92,-126,77,-30,76,-58,92,-126,76,-58,75,-79,16,-151,58,-145,26,-122,16,-151,26,-122,20,-116,16,-151,20,-116,13,-108,16,-151,13,-108,6,-100,16,-151,6,-100,0,-93,16,-151,0,-93,-4,-150,-4,-150,0,-93,-6,-89,-4,-150,-6,-89,-13,-86,-4,-150,-13,-86,-19,-86,-4,-150,-19,-86,-22,-144,-29,-87,-37,-91,-36,-136,-29,-87,-36,-136,-22,-144,-29,-87,-22,-144,-19,-86,-43,-97,-47,-104,-45,-126,-43,-97,-45,-126,-36,-136,-43,-97,-36,-136,-37,-91,-45,-126,-47,-104,-48,-113,87,306,73,262,76,250,53,27,45,20,169,0,169,0,45,20,30,15,169,0,30,15,5,10,15,437,19,437,26,453,26,453,19,437,23,437,26,453,23,437,27,438,27,438,39,436,48,459,48,459,39,436,48,432,48,459,48,432,53,424,10,436,15,437,26,453,10,436,26,453,5,448,10,436,5,448,5,436,272,62,165,198,221,37,221,37,165,198,116,183,221,37,116,183,116,176,118,34,116,47,67,464,118,34,67,464,57,395,57,395,67,464,56,412,67,464,48,459,53,424,67,464,53,424,56,412,48,459,26,453,27,438,116,47,116,477,113,478,116,47,113,478,98,473,116,47,98,473,83,469,116,47,83,469,67,464,212,268,165,198,185,216,212,268,185,216,230,256,212,268,116,183,165,198,225,284,222,279,230,256,230,256,222,279,217,273,230,256,217,273,212,268,336,315,193,315,207,305,336,315,207,305,217,303,336,315,217,303,224,301,336,315,224,301,227,297,336,315,227,297,228,293,336,315,228,293,288,297,336,315,288,297,311,303,336,315,311,303,336,305,228,293,230,256,263,282,228,293,263,282,288,297,230,256,228,293,227,289,230,256,227,289,225,284,226,15,223,12,353,0,353,0,223,12,219,11,353,0,219,11,214,10,229,21,353,0,319,19,229,21,319,19,304,28,229,21,304,28,288,42,229,21,288,42,272,62,229,21,272,62,229, -23,272,62,221,37,224,33,272,62,224,33,226,29,272,62,226,29,228,26,272,62,228,26,229,23,336,13,319,19,353,0,336,13,353,0,353,10,228,18,226,15,353,0,228,18,353,0,229,21,201,10,201,0,353,0,201,10,353,0,214,10,169,0,169,10,155,11,169,0,155,11,140,13,169,0,140,13,129,17,169,0,129,17,56,39,169,0,56,39,53,27,129,17,122,24,57,57,57,57,122,24,118,34,57,57,118,34,57,395,169,0,5,10,5,0,56,39,129,17,57,57,207,305,193,315,193,305,62,30,53,20,180,0,180,0,53,20,37,14,180,0,37,14,15,10,26,437,31,437,40,454,40,454,31,437,35,437,40,454,35,437,39,438,39,438,51,436,40,454,40,454,51,436,63,460,40,454,13,448,20,437,40,454,20,437,26,437,51,436,59,431,63,460,63,460,59,431,65,423,63,460,65,423,83,466,83,466,65,423,68,410,83,466,68,410,69,393,129,41,69,393,69,64,129,41,69,64,133,27,133,27,69,64,142,18,127,61,127,475,124,478,127,61,124,478,103,472,127,61,103,472,83,466,127,61,83,466,129,41,180,0,180,10,157,13,180,0,157,13,142,18,180,0,142,18,67,44,180,0,67,44,62,30,20,437,13,448,13,436,180,0,15,10,15,0,67,44,142,18,69,64,69,393,129,41,83,466,23,280,27,281,35,296,35,296,27,281,31,281,35,296,31,281,36,281,36,281,45,280,54,302,54,302,45,280,52,275,54,302,52,275,57,266,35,296,13,291,18,280,35,296,18,280,23,280,54,302,57,266,72,308,72,308,57,266,59,253,72,308,59,253,60,235,120,34,60,235,60,62,120,34,60,62,125,23,125,23,60,62,134,16,54,302,35,296,36,281,116,320,111,322,116,268,116,268,111,322,119,49,116,268,119,49,118,268,118,268,119,49,119,244,118,268,119,244,119,245,242,25,234,17,357,0,357,0,234,17,220,12,357,0,220,12,200,10,225,322,206,321,218,282,218,282,206,321,202,286,186,284,202,286,187,317,186,284,187,317,169,280,169,280,187,317,166,308,169,280,166,308,153,274,153,274,166,308,144,292,153,274,144,292,139,265,139,265,144,292,128,255,144,292,118,268,119,245,144,292,119,245,121,247,144, -292,121,247,123,249,144,292,123,249,125,252,144,292,125,252,128,255,119,49,111,322,91,314,119,49,91,314,120,34,206,321,187,317,202,286,242,25,357,0,247,39,247,39,357,0,322,17,247,39,322,17,248,60,248,60,322,17,313,27,248,60,313,27,248,208,246,320,248,208,263,313,246,320,225,322,231,272,246,320,231,272,240,256,246,320,240,256,246,235,246,320,246,235,248,208,290,285,278,301,308,43,290,285,308,43,306,66,290,285,306,66,299,263,306,243,319,259,322,285,322,285,319,259,332,271,322,285,332,271,344,301,344,301,332,271,347,279,344,301,347,279,366,313,366,313,347,279,363,284,366,313,363,284,381,286,381,286,402,283,389,320,389,320,402,283,413,322,306,66,306,243,299,263,299,263,306,243,322,285,389,320,366,313,381,286,430,28,423,19,542,0,542,0,423,19,410,14,542,0,410,14,390,10,417,274,428,259,443,317,443,317,428,259,433,237,443,317,433,237,435,207,499,26,435,207,435,63,499,26,435,63,505,18,505,18,435,63,434,43,505,18,434,43,513,14,513,14,434,43,542,0,513,14,542,0,524,12,524,12,542,0,542,10,413,322,402,283,417,274,413,322,417,274,443,317,495,54,495,196,491,241,495,54,491,241,482,276,495,54,482,276,466,301,495,54,466,301,496,38,496,38,466,301,443,317,496,38,443,317,435,207,496,38,435,207,499,26,336,12,322,17,357,0,336,12,357,0,357,10,308,43,278,301,263,313,308,43,263,313,248,208,308,43,248,208,313,27,166,0,166,10,147,12,166,0,147,12,134,16,166,0,134,16,59,41,166,0,59,41,54,26,166,0,54,26,45,17,166,0,45,17,31,12,166,0,31,12,11,10,166,0,11,10,11,0,72,308,60,235,120,34,72,308,120,34,91,314,18,280,13,291,13,279,59,41,134,16,60,62,357,0,200,10,200,0,542,0,390,10,390,0,430,28,542,0,434,43,225,322,218,282,231,272,51,29,43,19,160,0,160,0,43,19,31,13,160,0,31,13,13,10,13,10,31,13,12,10,18,280,22,281,33,297,33,297,22,281,27,281,33,297,27,281,31,281,31,281,41,280,33,297,33,297,41,280,52,303,33,297,11,291,14,280,33,297,14,280,18,280,41,280,48, -275,52,303,52,303,48,275,53,267,52,303,53,267,70,309,70,309,53,267,56,254,70,309,56,254,56,236,116,36,56,236,56,66,116,36,56,66,120,26,120,26,56,66,129,18,113,320,107,322,113,266,113,266,107,322,115,51,113,266,115,51,115,244,113,266,115,244,135,287,135,287,115,244,132,260,135,287,132,260,147,271,135,287,147,271,155,303,155,303,147,271,161,279,155,303,161,279,175,314,175,314,161,279,174,282,175,314,174,282,187,284,187,284,205,281,195,320,195,320,205,281,214,322,115,51,107,322,88,315,115,51,88,315,116,36,195,320,175,314,187,284,233,32,225,21,340,0,340,0,225,21,213,14,340,0,213,14,195,10,220,273,230,259,243,317,243,317,230,259,236,239,243,317,236,239,238,213,238,213,236,239,238,212,238,213,238,212,302,27,302,27,238,212,238,73,302,27,238,73,310,18,310,18,238,73,237,49,310,18,237,49,340,0,340,0,237,49,233,32,214,322,205,281,220,273,214,322,220,273,243,317,297,59,297,214,293,252,297,59,293,252,283,282,297,59,283,282,298,40,322,13,310,18,340,0,322,13,340,0,340,10,298,40,283,282,266,304,298,40,266,304,243,317,298,40,243,317,238,213,298,40,238,213,302,27,160,0,160,10,142,13,160,0,142,13,129,18,160,0,129,18,55,44,160,0,55,44,51,29,70,309,56,236,116,36,70,309,116,36,88,315,14,280,11,291,11,279,160,0,13,10,13,0,55,44,129,18,56,66,340,0,195,10,194,0,89,128,82,24,96,98,96,98,82,24,123,1,96,98,123,1,107,72,107,72,123,1,120,48,130,35,120,48,123,1,130,35,123,1,172,-6,227,315,178,322,182,301,182,301,178,322,165,302,138,297,165,302,178,322,138,297,178,322,125,314,262,98,252,62,268,24,268,24,252,62,235,35,268,24,235,35,224,1,224,1,235,35,212,18,224,1,212,18,184,13,184,13,169,14,172,-6,172,-6,169,14,155,18,172,-6,155,18,142,25,196,296,209,289,227,315,227,315,209,289,221,279,227,315,221,279,231,267,231,267,243,248,268,293,268,293,243,248,253,225,268,293,253,225,260,199,321,216,300,260,301,60,321,216,301,60,322,107,321,216,322,107,329,162,262,98,268,24,266, -143,266,143,268,24,268,293,268,293,268,24,301,60,268,293,301,60,300,260,268,293,260,199,264,171,268,293,264,171,266,143,268,293,227,315,231,267,184,13,172,-6,224,1,82,24,85,159,84,191,84,191,87,230,82,293,82,293,87,230,98,260,82,293,98,260,125,314,125,314,98,260,115,283,125,314,115,283,138,297,82,24,84,191,82,293,82,24,82,293,49,59,49,59,82,293,49,259,49,59,49,259,28,105,28,105,49,259,28,214,28,105,28,214,20,159,85,159,82,24,89,128,227,315,182,301,196,296,130,35,172,-6,142,25,47,-122,38,-131,173,-151,173,-151,38,-131,24,-136,173,-151,24,-136,3,-139,13,276,16,276,28,293,28,293,16,276,20,276,28,293,20,276,23,276,23,276,36,275,28,293,28,293,36,275,48,300,28,293,6,286,10,275,28,293,10,275,13,276,115,49,111,62,125,11,125,11,111,62,111,23,112,-108,111,-86,67,306,112,-108,67,306,52,236,52,236,67,306,52,253,36,275,44,271,48,300,48,300,44,271,49,264,48,300,49,264,67,306,67,306,49,264,52,253,111,266,111,320,107,322,111,266,107,322,111,-86,111,266,111,-86,111,234,111,266,111,234,115,246,111,266,115,246,130,287,329,173,323,221,322,115,322,115,323,221,307,263,322,115,307,263,301,66,301,66,307,263,282,294,301,66,282,294,270,27,270,27,282,294,269,145,270,27,269,145,265,102,270,27,265,102,253,66,282,294,250,315,253,228,282,294,253,228,265,190,282,294,265,190,269,145,189,320,183,280,212,274,189,320,212,274,212,322,212,322,212,274,235,256,212,322,235,256,250,315,250,315,235,256,253,228,152,-2,166,-5,164,18,164,18,166,-5,184,16,212,22,184,16,229,2,212,22,229,2,236,39,236,39,229,2,270,27,236,39,270,27,253,66,184,16,166,-5,182,-6,184,16,182,-6,229,2,173,-151,173,-138,146,-137,173,-151,146,-137,128,-132,173,-151,128,-132,51,-109,173,-151,51,-109,47,-122,86,314,67,306,111,-86,86,314,111,-86,107,322,128,-132,118,-123,52,-90,52,-90,118,-123,112,-108,52,-90,112,-108,52,236,115,246,127,259,130,287,130,287,127,259,144,270,130,287,144,270,149,303,149,303,144,270,163,277,149,303,163,277,168,314,168,314,163,277,183,280,168, -314,183,280,189,320,115,49,125,11,127,36,127,36,125,11,139,3,127,36,139,3,144,26,144,26,139,3,152,-2,144,26,152,-2,164,18,10,275,6,286,6,275,173,-151,3,-139,3,-151,51,-109,128,-132,52,-90,157,37,146,39,153,-4,153,-4,146,39,135,43,153,-4,135,43,129,-6,129,-6,135,43,125,48,129,-6,125,48,116,55,116,55,103,70,129,-6,129,-6,103,70,92,90,129,-6,92,90,92,0,92,0,92,90,84,114,92,0,84,114,79,140,153,-4,176,1,157,37,157,37,176,1,169,36,182,37,169,36,176,1,182,37,176,1,198,12,187,321,173,302,197,299,187,321,197,299,202,319,202,319,197,299,215,291,202,319,215,291,217,314,217,314,215,291,229,277,217,314,229,277,234,307,234,307,229,277,236,258,234,307,236,258,252,298,252,298,236,258,239,233,252,298,239,233,239,45,239,45,239,233,239,89,94,251,114,279,122,313,122,313,114,279,141,296,122,313,141,296,171,322,171,322,141,296,173,302,171,322,173,302,187,321,79,288,46,250,61,21,79,288,61,21,77,169,79,288,77,169,82,214,79,288,82,214,94,251,79,288,94,251,122,313,77,169,61,21,79,140,17,144,23,94,25,201,25,201,23,94,38,53,25,201,38,53,46,250,46,250,38,53,61,21,231,-120,220,-130,341,-151,341,-151,220,-130,202,-136,341,-151,202,-136,177,-139,238,73,236,66,239,45,239,45,236,66,233,62,239,45,233,62,230,58,230,58,220,50,239,45,239,45,220,50,220,26,239,80,238,73,239,45,239,80,239,45,239,89,209,44,196,40,198,12,209,44,198,12,220,26,209,44,220,26,220,50,298,-97,298,320,290,320,298,-97,290,320,252,298,298,-97,252,298,299,-113,341,-151,341,-139,323,-136,341,-151,323,-136,310,-131,341,-151,310,-131,237,-106,341,-151,237,-106,231,-120,239,45,302,-124,299,-113,239,45,299,-113,252,298,239,-86,237,-106,310,-131,239,-86,310,-131,302,-124,239,-86,302,-124,239,45,341,-151,177,-139,177,-151,79,140,61,21,92,0,182,37,198,12,196,40,15,275,20,275,28,292,28,292,20,275,25,276,28,292,25,276,30,276,30,276,39,274,48,299,48,299,39,274,45,270,48,299,45,270,50,262,28,292,5,284,10,274,28,292,10,274,15,275,112,256,112, -320,109,322,112,256,109,322,112,63,112,63,109,322,87,314,112,63,87,314,113,43,113,43,87,314,68,306,113,43,68,306,53,234,53,234,68,306,52,250,68,306,48,299,50,262,68,306,50,262,52,250,48,299,28,292,30,276,171,274,179,320,167,276,167,276,179,320,164,313,167,276,164,313,164,278,164,278,164,313,161,278,148,274,161,278,164,313,148,274,164,313,148,301,191,258,196,322,186,262,186,262,196,322,179,320,186,262,179,320,179,267,179,267,179,320,175,271,202,254,207,253,209,320,209,320,207,253,216,255,209,320,216,255,220,315,220,315,216,255,224,259,220,315,224,259,228,308,228,308,224,259,230,265,228,308,230,265,233,298,233,298,230,265,233,274,233,298,233,274,234,285,197,255,202,254,209,320,197,255,209,320,196,322,197,255,196,322,191,258,115,235,123,250,131,282,131,282,123,250,135,264,131,282,135,264,148,301,148,301,135,264,148,274,112,63,112,220,112,256,112,256,112,220,115,235,112,256,115,235,131,282,172,0,172,10,147,13,172,0,147,13,130,18,172,0,130,18,52,41,172,0,52,41,49,29,172,0,49,29,40,21,172,0,40,21,26,15,172,0,26,15,3,10,172,0,3,10,3,0,130,18,119,28,53,59,53,59,119,28,113,43,53,59,113,43,53,234,10,274,5,284,5,273,52,41,130,18,53,59,179,320,171,274,175,271,51,3,54,4,58,71,58,71,54,4,58,5,58,71,58,5,63,5,63,5,58,5,62,5,63,5,62,5,67,5,63,5,67,5,71,43,71,43,67,5,72,5,71,43,72,5,89,24,89,24,72,5,78,4,89,24,78,4,85,2,51,3,58,71,48,0,48,0,58,71,48,107,48,0,48,107,45,-2,45,-2,48,107,37,107,45,-2,37,107,37,-2,100,317,74,307,82,276,82,276,74,307,79,259,89,153,79,259,74,307,89,153,74,307,65,173,65,173,74,307,53,289,65,173,53,289,49,193,49,193,53,289,40,265,49,193,40,265,39,214,39,214,40,265,36,235,142,321,132,321,154,303,154,303,132,321,131,306,114,304,131,306,132,321,114,304,132,321,100,317,192,309,188,310,188,277,188,277,188,310,183,312,188,277,183,312,179,313,179,313,170,317,173,294,173,294,170,317,161, -319,173,294,161,319,154,303,154,303,161,319,152,320,154,303,152,320,142,321,207,312,205,310,211,220,211,220,205,310,202,308,211,220,202,308,200,253,200,253,202,308,200,308,200,253,200,308,198,308,198,308,195,308,200,253,200,253,195,308,192,309,200,253,192,309,188,277,211,220,221,220,218,315,211,220,218,315,210,315,211,220,210,315,207,312,179,313,173,294,188,277,244,80,242,102,239,53,239,53,242,102,235,120,239,53,235,120,224,29,224,29,235,120,223,136,224,29,223,136,206,151,172,18,176,-1,184,30,184,30,176,-1,203,10,184,30,203,10,192,44,192,44,203,10,195,60,206,151,195,60,203,10,206,151,203,10,224,29,170,104,180,95,182,166,182,166,180,95,188,84,182,166,188,84,206,151,206,151,188,84,193,73,206,151,193,73,195,60,182,166,109,211,120,134,182,166,120,134,158,113,182,166,158,113,170,104,109,211,99,219,120,134,120,134,99,219,90,228,120,134,90,228,89,153,89,153,90,228,84,238,89,153,84,238,80,249,137,9,145,-6,156,11,156,11,145,-6,176,-1,156,11,176,-1,172,18,100,317,82,276,89,290,100,317,89,290,100,299,100,317,100,299,114,304,137,9,110,12,115,-4,137,9,115,-4,126,-5,137,9,126,-5,136,-6,137,9,136,-6,145,-6,110,12,89,24,95,0,110,12,95,0,105,-3,110,12,105,-3,115,-4,95,0,89,24,85,2,71,43,58,71,63,5,79,259,89,153,80,249,59,346,45,330,49,293,49,293,45,330,33,319,49,293,33,319,21,311,74,364,59,346,59,25,74,364,59,25,72,7,74,364,72,7,89,-2,74,364,89,-2,89,386,52,50,59,25,59,346,52,50,59,346,49,293,52,50,49,293,49,82,10,294,11,294,11,303,11,303,11,294,12,293,11,303,12,293,14,305,14,305,12,293,49,293,14,305,49,293,17,308,17,308,49,293,21,311,10,300,9,298,9,296,10,300,9,296,10,295,10,300,10,295,10,294,10,300,10,294,11,303,97,397,111,-6,108,92,108,315,108,293,178,293,108,315,178,293,178,315,108,92,108,396,108,400,108,92,108,400,107,402,108,92,107,402,106,404,108,92,106,404,105,405,108,92,105,405,103,405,108,92,103,405,100,401,108,92,100,401,97,397,120, -39,131,-4,131,32,131,32,131,-4,145,30,153,30,145,30,149,1,153,30,149,1,165,12,113,51,109,69,111,-6,113,51,111,-6,131,-4,113,51,131,-4,120,39,111,-6,97,397,94,393,111,-6,94,393,92,390,111,-6,92,390,89,386,111,-6,89,386,89,-2,181,27,195,46,186,54,181,27,186,54,177,44,181,27,177,44,169,38,181,27,169,38,165,12,161,33,153,30,165,12,161,33,165,12,169,38,145,30,131,-4,149,1,108,92,111,-6,109,69,109,315,6,315,24,303,109,315,24,303,36,298,109,315,36,298,44,289,109,315,44,289,49,276,109,315,49,276,50,259,109,315,50,259,54,53,109,315,54,53,64,28,109,315,64,28,82,9,109,315,82,9,106,-2,109,315,106,-2,109,89,230,74,227,67,235,53,235,53,227,67,223,61,235,53,223,61,217,55,217,55,206,47,214,29,214,29,206,47,194,41,214,29,194,41,193,12,193,12,194,41,182,37,193,12,182,37,172,1,172,1,182,37,170,34,172,1,170,34,158,34,158,34,142,36,152,-4,152,-4,142,36,135,-6,135,-6,142,36,129,44,135,-6,129,44,118,56,135,-6,118,56,111,71,135,-6,111,71,106,-2,109,89,106,-2,111,71,158,34,152,-4,172,1,233,258,235,53,292,315,292,315,235,53,237,53,292,315,237,53,240,-5,240,-5,237,53,237,-3,235,53,233,258,233,96,235,53,233,96,232,83,235,53,232,83,230,74,217,55,214,29,235,53,315,36,304,40,316,20,316,20,304,40,297,47,316,20,297,47,297,14,297,14,297,47,293,59,297,14,293,59,279,8,279,8,293,59,292,75,279,8,292,75,292,315,292,315,240,-5,260,2,292,315,260,2,279,8,292,315,181,315,203,301,292,315,203,301,218,296,292,315,218,296,227,289,292,315,227,289,232,276,292,315,232,276,233,258,332,35,315,36,316,20,332,35,316,20,336,25,332,35,336,25,336,35,54,53,50,259,50,83,203,301,181,315,181,303,24,303,6,315,6,305,122,265,120,271,161,23,161,23,120,271,119,276,161,23,119,276,77,224,77,224,119,276,118,281,77,224,118,281,118,286,118,286,119,292,77,224,151,315,13,315,27,303,151,315,27,303,38,296,151,315,38,296,49,283,151,315,49,283,61,260,151,315,61, -260,123,297,151,315,123,297,129,300,151,315,129,300,138,303,151,315,138,303,151,305,119,292,123,297,61,260,119,292,61,260,77,224,196,80,124,259,161,23,196,80,161,23,163,20,196,80,163,20,164,16,196,80,164,16,165,13,196,80,165,13,166,11,196,80,166,11,166,9,196,80,166,9,169,2,196,80,169,2,172,-2,196,80,172,-2,174,-6,196,80,174,-6,177,-8,196,80,177,-8,179,-9,196,80,179,-9,182,-8,196,80,182,-8,185,-4,196,80,185,-4,189,1,196,80,189,1,193,11,196,80,193,11,198,25,196,80,198,25,266,261,288,250,266,261,198,25,334,315,237,315,249,303,334,315,249,303,258,300,334,315,258,300,265,295,334,315,265,295,268,289,334,315,268,289,270,282,334,315,270,282,314,298,334,315,314,298,323,303,334,315,323,303,334,305,288,250,298,273,270,282,288,250,270,282,269,278,288,250,269,278,269,274,288,250,269,274,268,269,288,250,268,269,267,265,288,250,267,265,266,261,306,289,314,298,270,282,306,289,270,282,298,273,249,303,237,315,237,305,122,265,161,23,124,259,27,303,13,315,13,305,30,299,37,292,141,315,141,315,37,292,44,279,141,315,44,279,52,260,52,260,146,21,109,273,109,273,146,21,110,269,52,260,109,277,109,281,109,281,110,289,52,260,52,260,110,289,113,295,52,260,113,295,119,299,141,315,52,260,119,299,141,315,119,299,128,302,141,315,128,302,141,305,23,303,30,299,141,315,23,303,141,315,15,315,23,303,15,315,15,305,260,185,285,280,286,287,260,185,286,287,245,217,245,217,286,287,232,256,224,275,232,256,290,293,224,275,290,293,297,298,326,315,184,315,197,302,326,315,197,302,208,297,326,315,208,297,216,288,326,315,216,288,224,275,326,315,224,275,297,298,326,315,297,298,309,301,326,315,309,301,326,305,290,293,232,256,286,287,355,81,297,238,324,20,355,81,324,20,329,7,355,81,329,7,333,-1,355,81,333,-1,336,-6,355,81,336,-6,338,-9,355,81,338,-9,341,-9,355,81,341,-9,344,-8,355,81,344,-8,347,-5,355,81,347,-5,350,0,355,81,350,0,354,10,355,81,354,10,360,24,355,81,360,24,419,237,324,20,297,238,292,250,324,20,292,250,289,259,324,20,289,259,287, -266,324,20,287,266,286,273,324,20,286,273,260,185,457,266,419,237,360,24,486,315,400,315,412,301,486,315,412,301,421,298,486,315,421,298,426,294,486,315,426,294,430,289,486,315,430,289,430,284,486,315,430,284,468,290,486,315,468,290,473,297,486,315,473,297,479,301,486,315,479,301,486,305,457,266,463,281,430,284,457,266,430,284,430,276,457,266,430,276,428,268,457,266,428,268,426,258,457,266,426,258,423,248,457,266,423,248,419,237,173,0,177,7,182,77,182,77,177,7,182,17,182,77,182,17,245,217,245,217,182,17,260,185,182,77,113,260,146,21,182,77,146,21,151,9,182,77,151,9,155,1,182,77,155,1,159,-4,182,77,159,-4,162,-8,182,77,162,-8,165,-9,182,77,165,-9,167,-8,182,77,167,-8,170,-5,182,77,170,-5,173,0,111,264,110,269,146,21,111,264,146,21,113,260,52,260,109,273,109,277,412,301,400,315,400,305,468,290,430,284,463,281,260,185,286,273,285,280,197,302,184,315,184,305,43,22,34,15,113,0,113,0,34,15,24,12,113,0,24,12,12,10,45,299,55,292,162,315,162,315,55,292,65,279,162,315,65,279,77,263,77,262,77,263,143,162,77,262,143,162,131,289,131,289,132,295,77,262,77,262,132,295,136,299,77,262,136,299,162,315,162,315,136,299,142,302,162,315,142,302,150,304,43,22,113,0,52,31,52,31,113,0,89,15,52,31,89,15,63,46,63,46,89,15,86,18,63,46,86,18,85,23,85,23,86,27,63,46,63,46,86,27,87,31,63,46,87,31,143,162,143,162,87,31,90,37,143,162,90,37,94,43,143,162,94,43,99,52,99,52,155,138,143,162,143,162,155,138,144,259,143,162,144,259,137,272,150,304,162,305,162,315,162,315,17,315,23,305,162,315,23,305,35,303,162,315,35,303,45,299,133,282,131,289,143,162,133,282,143,162,137,272,170,218,168,221,219,40,219,40,168,221,166,224,219,40,166,224,164,227,164,227,153,244,155,138,155,138,153,244,144,259,311,16,300,25,223,27,223,27,300,25,289,37,223,27,289,37,278,52,278,52,188,190,219,40,219,40,188,190,178,218,219,40,178,218,173,213,173,212,173,213,172,216,173,212,172,216,219,40,219,40,172,216,170,218,303, -315,192,315,203,303,303,315,203,303,211,301,303,315,211,301,216,298,303,315,216,298,219,294,303,315,219,294,220,289,303,315,220,289,265,293,303,315,265,293,277,299,303,315,277,299,290,303,303,315,290,303,303,305,246,273,255,284,220,289,246,273,220,289,219,283,246,273,219,283,216,276,246,273,216,276,210,268,246,273,210,268,203,257,246,273,203,257,195,244,246,273,195,244,190,237,246,273,190,237,188,190,188,190,190,237,186,231,188,190,186,231,182,224,188,190,182,224,178,218,220,16,215,13,335,0,335,0,215,13,206,11,335,0,206,11,195,10,221,35,222,33,278,52,278,52,222,33,222,30,278,52,222,30,223,27,223,27,222,21,335,0,335,0,222,21,220,16,278,52,219,40,220,37,278,52,220,37,221,35,164,227,155,138,219,40,335,0,335,10,323,12,335,0,323,12,311,16,335,0,311,16,223,27,113,0,113,10,103,11,113,0,103,11,95,12,113,0,95,12,89,15,113,0,12,10,12,0,335,0,195,10,195,0,173,212,219,40,173,213,203,303,192,315,192,305,265,293,220,289,255,284,23,305,17,315,17,305,162,315,77,263,77,262,126,-80,119,-87,126,-133,126,-133,119,-87,112,-91,126,-133,112,-91,105,-93,105,-93,103,-93,126,-133,126,-133,103,-93,100,-147,126,-80,149,-107,134,-72,134,-72,149,-107,141,-62,149,-48,141,-62,149,-107,149,-48,149,-107,171,-69,201,82,123,257,139,84,201,82,139,84,147,66,201,82,147,66,155,49,201,82,155,49,162,34,201,82,162,34,167,21,201,82,167,21,169,13,201,82,169,13,171,-69,201,82,171,-69,192,-16,201,82,192,-16,298,269,201,82,298,269,269,275,169,13,169,12,171,-69,171,-69,169,12,169,13,171,-69,169,13,167,2,139,84,123,257,120,263,139,84,120,263,117,269,139,84,117,269,115,275,139,84,115,275,114,281,139,84,114,281,47,280,47,280,114,281,113,286,113,286,115,293,47,280,47,280,115,293,119,297,47,280,119,297,153,315,153,315,119,297,126,301,153,315,126,301,138,303,271,283,271,281,298,269,298,269,271,281,270,278,298,269,270,278,269,275,333,315,239,315,251,304,333,315,251,304,260,302,333,315,260,302,267,299,333,315,267,299,271,294,333,315,271,294,272,288,333,315,272, -288,316,298,333,315,316,298,323,303,333,315,323,303,333,305,272,288,272,287,298,269,272,288,298,269,303,282,272,288,303,282,309,292,272,288,309,292,316,298,272,286,271,283,298,269,272,286,298,269,272,287,272,286,272,287,272,288,171,-69,167,2,163,-12,171,-69,163,-12,157,-30,171,-69,157,-30,149,-48,100,-147,103,-93,100,-92,100,-147,100,-92,96,-91,100,-147,96,-91,92,-90,100,-147,92,-90,88,-88,100,-147,88,-88,80,-85,100,-147,80,-85,73,-82,100,-147,73,-82,70,-151,73,-82,66,-80,70,-151,70,-151,66,-80,58,-79,70,-151,58,-79,53,-149,53,-149,58,-79,51,-79,53,-149,51,-79,41,-80,53,-149,41,-80,40,-144,40,-144,41,-80,33,-85,40,-144,33,-85,30,-135,30,-135,33,-85,27,-92,30,-135,27,-92,23,-124,23,-124,27,-92,23,-101,23,-124,23,-101,21,-111,138,303,153,305,153,315,153,315,10,315,20,303,153,315,20,303,29,300,153,315,29,300,36,295,153,315,36,295,42,289,153,315,42,289,47,280,92,-90,87,-88,88,-88,20,303,10,315,10,305,126,-80,126,-133,149,-107,251,304,239,315,239,305,94,21,282,305,205,294,205,294,282,305,282,315,205,294,282,315,111,294,88,292,111,294,282,315,88,292,282,315,40,315,40,315,37,232,50,232,40,315,50,232,54,258,40,315,54,258,61,276,40,315,61,276,72,287,40,315,72,287,88,292,205,294,19,10,94,21,94,21,19,10,282,0,94,21,282,0,187,21,187,21,282,0,209,22,273,66,270,55,282,0,282,0,270,55,266,47,282,0,266,47,261,40,261,40,254,33,282,0,282,0,254,33,242,28,282,0,242,28,228,24,282,0,293,95,280,98,282,0,280,98,276,80,282,0,276,80,273,66,282,0,19,10,19,0,209,22,282,0,228,24,149,-99,160,-108,161,154,161,154,160,-108,172,-115,161,154,172,-115,173,137,173,137,172,-115,185,-120,173,137,185,-120,181,-32,181,-32,181,84,179,115,181,-32,179,115,173,137,220,-125,245,-126,245,-118,220,-125,245,-118,220,-109,220,-125,220,-109,202,-97,220,-125,202,-97,201,-123,190,-81,183,-60,185,-120,190,-81,185,-120,201,-123,190,-81,201,-123,202,-97,143,165,116,174,122,140,143,165,122,140,128,121,143,165,128,121,130,95,143,165,130,95,131,-50,143,165,131,-50,135, --70,143,165,135,-70,141,-86,143,165,141,-86,149,-99,143,165,149,-99,161,154,130,95,130,-28,131,-50,111,154,122,140,116,174,111,154,116,174,122,209,111,154,122,209,111,195,111,154,111,195,94,166,220,475,201,473,202,447,220,475,202,447,220,459,220,475,220,459,245,468,220,475,245,468,245,476,181,382,183,410,185,470,185,470,183,410,190,431,185,470,190,431,201,473,201,473,190,431,202,447,160,459,161,195,172,465,172,465,161,195,173,212,172,465,173,212,181,382,181,382,173,212,179,234,181,382,179,234,181,265,149,449,141,437,143,183,149,449,143,183,161,195,149,449,161,195,160,459,143,183,141,437,135,421,143,183,135,421,131,401,143,183,131,401,130,379,143,183,130,379,130,254,143,183,130,254,128,228,143,183,128,228,122,209,143,183,122,209,116,174,94,184,70,175,94,166,94,184,94,166,111,195,172,465,181,382,185,470,181,-32,185,-120,183,-60,93,-9,93,473,47,473,93,-9,47,473,47,-9,155,382,156,234,155,382,155,382,156,234,164,465,155,382,164,465,153,410,153,410,164,465,151,470,153,410,151,470,146,431,146,431,151,470,136,473,146,431,136,473,134,447,134,447,136,473,116,475,134,447,116,475,116,459,116,459,116,475,91,476,116,459,91,476,91,468,206,254,206,378,205,400,206,254,205,400,201,420,206,254,201,420,195,436,206,254,195,436,193,184,206,254,193,184,208,228,241,166,266,175,241,184,241,166,241,184,224,155,224,155,241,184,224,195,224,155,224,195,220,175,220,175,224,195,214,209,220,175,214,209,208,228,156,234,163,211,164,465,164,465,163,211,175,195,164,465,175,195,176,459,176,459,175,195,193,184,176,459,193,184,186,449,186,449,193,184,195,436,220,175,193,166,208,121,220,175,208,121,214,140,220,175,214,140,224,155,206,95,208,121,193,166,206,95,193,166,195,-86,206,95,195,-86,201,-70,206,95,201,-70,205,-51,206,95,205,-51,206,-29,163,138,164,-115,175,154,175,154,164,-115,176,-108,175,154,176,-108,193,166,193,166,176,-108,187,-99,193,166,187,-99,195,-86,164,-115,163,138,156,115,164,-115,156,115,155,84,164,-115,155,84,155,-32,164,-115,155,-32,153,-60,164,-115,153,-60,151,-120,146,-81,134,-97,135,-123,146,-81,135,-123,151,-120,146, --81,151,-120,153,-60,116,-109,91,-118,116,-125,116,-109,116,-125,135,-123,116,-109,135,-123,134,-97,116,-125,91,-118,91,-126,208,228,193,184,220,175,156,234,155,382,155,265,128,224,116,224,129,178,129,178,116,224,112,179,97,177,112,179,116,224,97,177,116,224,96,222,198,200,180,162,201,150,198,200,201,150,207,195,207,195,201,150,217,142,207,195,217,142,220,189,220,189,217,142,232,136,220,189,232,136,235,183,235,183,232,136,247,132,235,183,247,132,250,178,250,178,247,132,264,131,250,178,264,131,265,177,265,177,264,131,283,133,265,177,283,133,282,179,128,224,129,178,141,221,141,221,129,178,145,175,141,221,145,175,155,217,155,217,145,175,159,170,155,217,159,170,173,210,173,210,159,170,171,166,173,210,171,166,180,162,282,179,283,133,296,186,296,186,283,133,300,140,296,186,300,140,307,197,307,197,300,140,317,151,307,197,317,151,317,211,317,211,317,151,334,168,317,211,334,168,327,227,327,227,334,168,352,192,61,146,72,160,78,216,78,216,72,160,84,170,78,216,84,170,96,222,96,222,84,170,97,177,60,205,43,188,53,128,60,205,53,128,61,146,60,205,61,146,78,216,53,128,43,188,28,163,180,162,198,200,173,210,67,292,69,280,69,304,69,304,69,280,74,269,69,304,74,269,74,314,74,314,74,269,82,261,74,314,82,261,82,321,82,321,82,261,92,255,82,321,92,255,92,326,92,326,92,255,104,253,92,326,104,253,105,327,105,327,104,253,116,255,105,327,116,255,116,326,116,326,116,255,126,261,116,326,126,261,126,321,126,321,126,261,134,269,126,321,134,269,134,313,134,313,134,269,139,280,134,313,139,280,140,304,140,304,139,280,141,292,140,-69,109,198,117,-149,140,-69,117,-149,127,-141,140,-69,127,-141,135,-129,140,-69,135,-129,140,-114,140,-69,140,-114,141,-96,140,-69,141,-96,141,-75,81,-142,91,-149,100,198,100,198,91,-149,105,-151,100,198,105,-151,109,198,109,198,105,-151,117,-149,100,198,69,-69,69,-116,100,198,69,-116,73,-131,100,198,73,-131,81,-142,69,-116,69,-69,68,-75,69,-116,68,-75,68,-80,69,-116,68,-80,68,-85,69,-116,68,-85,67,-91,69,-116,67,-91,67,-97,141,-96,141,-90,141,-85,141,-96,141,-85,141,-81,141,-96,141, --81,141,-75,219,295,138,69,141,0,141,0,138,69,120,88,141,0,120,88,118,9,118,9,120,88,107,108,118,9,107,108,103,17,103,17,107,108,98,129,103,17,98,129,92,154,74,42,82,33,91,182,91,182,92,25,92,154,92,154,92,25,103,17,158,-3,166,-4,160,53,160,53,166,-4,169,50,169,50,166,-4,173,-5,169,50,173,-5,178,47,178,47,173,-5,180,-5,178,47,180,-5,186,46,186,46,180,-5,196,-4,186,46,196,-4,193,45,193,45,196,-4,202,45,225,47,202,45,211,-1,225,47,211,-1,226,4,160,53,231,257,219,295,219,295,227,319,218,320,219,295,218,320,212,297,212,297,218,320,210,321,212,297,210,321,205,299,205,299,210,321,203,321,205,299,203,321,199,300,199,300,203,321,197,322,199,300,197,322,193,301,193,301,197,322,191,322,193,301,191,322,186,301,258,405,227,319,231,257,258,405,231,257,239,243,258,405,239,243,249,311,258,405,249,311,282,405,239,243,246,232,249,311,249,311,246,232,253,225,249,311,253,225,268,302,268,302,253,225,262,222,268,302,262,222,272,220,160,53,219,295,141,0,160,53,141,0,150,-1,160,53,150,-1,158,-3,106,-96,141,0,118,9,106,-96,118,9,83,-96,272,220,282,222,282,292,282,292,282,222,290,226,282,292,290,226,293,280,293,280,290,226,296,233,293,280,296,233,299,266,299,266,296,233,300,242,299,266,300,242,302,252,108,255,128,279,142,313,142,313,128,279,154,295,142,313,154,295,191,322,191,322,154,295,186,301,99,290,66,253,66,53,99,290,66,53,74,42,99,290,74,42,91,182,99,290,91,182,95,222,99,290,95,222,108,255,99,290,108,255,142,313,38,132,42,110,44,207,44,207,42,110,48,90,44,207,48,90,66,253,66,253,48,90,56,71,66,253,56,71,66,53,266,33,278,47,284,87,284,87,278,47,289,63,284,87,289,63,305,115,305,115,289,63,300,83,305,115,300,83,313,109,226,4,240,11,245,54,245,54,240,11,252,20,245,54,252,20,264,67,264,67,252,20,266,33,264,67,266,33,284,87,202,45,196,-4,211,-1,225,47,226,4,245,54,38,132,44,207,37,153,268,302,272,220,282,292,219,295,231,257,227,319,92,25,91,182,82,33,83,25,77,20,83, -0,83,0,77,20,71,17,83,0,71,17,70,-3,70,-3,71,17,64,15,70,-3,64,15,56,-4,56,-4,64,15,56,14,97,89,90,90,91,60,91,60,90,90,84,90,91,60,84,90,82,63,82,63,84,90,78,91,82,63,78,91,72,65,72,65,78,91,72,91,72,65,72,91,62,66,28,49,32,56,33,81,33,81,32,56,40,62,33,81,40,62,51,88,51,88,40,62,49,65,51,88,49,65,62,66,28,31,27,40,27,2,27,2,27,40,20,70,20,70,27,40,33,81,33,81,27,40,28,49,99,50,98,46,109,20,109,20,98,46,96,41,109,20,96,41,95,8,95,8,96,41,93,36,95,8,93,36,89,31,89,31,83,25,95,8,95,8,83,25,83,0,106,94,105,91,109,20,109,20,105,91,105,87,109,20,105,87,99,53,99,53,105,87,105,88,99,53,105,88,97,57,97,57,105,88,97,89,97,57,97,89,91,60,109,20,99,53,99,50,124,38,150,21,139,77,139,77,150,21,164,68,164,68,150,21,172,8,164,68,172,8,186,61,186,61,172,8,191,1,186,61,191,1,205,56,205,56,191,1,208,-2,205,56,208,-2,224,54,224,54,208,-2,226,-4,224,54,226,-4,244,53,244,53,226,-4,245,-2,244,53,245,-2,262,54,139,77,148,119,145,359,145,359,148,392,138,444,138,444,148,392,157,418,138,444,157,418,176,466,176,466,157,418,170,438,176,466,170,438,189,450,252,470,223,473,226,453,226,453,223,473,212,455,189,450,212,455,223,473,189,450,223,473,176,466,309,429,296,447,300,378,309,429,300,378,307,386,309,429,307,386,312,396,309,429,312,396,313,408,260,377,268,372,277,461,277,461,268,372,279,371,277,461,279,371,296,447,296,447,279,371,290,373,296,447,290,373,300,378,250,431,252,418,252,470,252,470,252,418,253,399,252,470,253,399,277,461,277,461,253,399,255,385,277,461,255,385,260,377,252,470,226,453,237,449,252,470,237,449,245,441,252,470,245,441,250,431,106,100,109,20,106,102,106,102,109,20,110,410,110,410,109,20,124,38,110,410,124,38,138,444,138,444,124,38,139,77,138,444,139,77,145,359,153,146,156,164,153,261,153,261,156,164,156,230,153,261,156,230,241,261,241,261,156,230,241,230,153, -261,150,287,153,146,153,146,150,287,148,308,153,146,148,308,148,119,148,119,148,308,146,326,148,119,146,326,146,343,157,195,157,204,157,187,157,187,157,204,157,213,157,187,157,213,157,176,157,176,157,213,157,221,157,176,157,221,156,230,321,45,323,87,312,34,312,34,323,87,309,75,312,34,309,75,297,20,297,20,309,75,294,65,297,20,294,65,281,10,281,10,294,65,279,58,281,10,279,58,263,2,263,2,279,58,262,54,263,2,262,54,245,-2,343,97,342,97,343,95,343,95,342,97,341,98,343,95,341,98,341,86,341,86,341,98,340,98,341,86,340,98,339,98,336,73,341,86,339,98,336,73,339,98,336,98,336,73,336,98,333,97,336,73,333,97,330,94,336,73,330,94,329,59,329,59,330,94,327,91,329,59,327,91,323,87,329,59,323,87,321,45,110,410,92,365,95,206,110,410,95,206,99,178,110,410,99,178,102,152,110,410,102,152,104,130,110,410,104,130,106,114,110,410,106,114,106,102,92,365,86,309,86,300,92,365,86,300,87,291,92,365,87,291,88,281,92,365,88,281,89,272,92,365,89,272,91,261,92,365,91,261,91,230,92,365,91,230,95,206,106,97,106,94,109,20,106,97,109,20,106,100,91,230,91,261,16,261,91,230,16,261,16,230,46,15,38,19,40,-3,46,15,40,-3,56,-4,46,15,56,-4,56,14,40,-3,38,19,32,24,40,-3,32,24,28,31,40,-3,28,31,27,2,9,37,11,23,11,56,11,56,11,23,17,11,11,56,17,11,20,70,20,70,17,11,27,2,309,75,323,87,323,88,157,176,156,230,156,164,145,359,148,119,146,343,62,66,72,91,51,88,139,37,157,34,143,83,143,83,157,34,176,77,208,83,176,77,176,33,208,83,176,33,195,34,87,306,20,373,53,272,87,306,53,272,53,95,87,306,53,95,72,184,87,306,72,184,77,217,87,306,77,217,92,246,87,306,92,246,105,317,92,121,77,150,87,62,87,62,77,150,72,184,195,333,176,334,207,284,207,284,176,334,174,289,142,284,174,289,157,333,142,284,157,333,139,330,122,325,105,317,114,269,122,325,114,269,142,284,122,325,142,284,139,330,366,28,298,95,332,-6,332,-6,298,95,273,151,332,-6,273,151,263,62,263,62,273, -151,259,121,263,62,259,121,247,51,247,51,259,121,236,98,247,51,236,98,230,43,230,43,236,98,213,37,208,83,195,34,213,37,208,83,213,37,236,98,273,218,278,185,298,272,273,218,298,272,332,373,332,373,298,272,366,340,231,324,236,269,247,317,247,317,236,269,258,247,247,317,258,247,263,306,263,306,258,247,273,218,263,306,273,218,332,373,214,330,195,333,207,284,214,330,207,284,236,269,214,330,236,269,231,324,298,272,298,95,309,254,309,254,298,95,309,113,309,254,309,113,317,238,317,238,309,113,317,130,317,238,317,130,322,221,322,221,317,130,322,148,322,221,322,148,325,204,325,204,322,148,325,165,325,204,325,165,326,184,298,95,298,272,278,185,298,95,278,185,273,151,176,77,157,34,176,33,176,334,157,333,174,289,139,37,143,83,121,43,121,43,143,83,114,98,121,43,114,98,104,51,104,51,114,98,92,121,104,51,92,121,87,62,53,95,20,-6,87,62,53,95,87,62,72,184,53,95,53,272,42,112,42,112,53,272,42,255,42,112,42,255,34,129,34,129,42,255,34,238,34,129,34,238,29,146,29,146,34,238,29,221,29,146,29,221,25,164,25,164,29,221,25,203,25,164,25,203,24,184,20,-6,53,95,-15,28,105,317,92,246,114,269,53,272,20,373,-15,340,45,367,112,246,45,367,45,367,112,246,88,424,45,367,88,424,88,430,88,430,89,438,45,367,127,35,117,22,248,0,248,0,117,22,101,16,248,0,101,16,77,13,133,463,-36,463,-19,447,133,463,-19,447,-4,440,133,463,-4,440,9,426,133,463,9,426,94,443,133,463,94,443,103,447,133,463,103,447,116,449,133,463,116,449,133,450,25,402,45,367,89,438,25,402,89,438,94,443,25,402,94,443,9,426,258,398,179,244,192,209,258,398,192,209,198,219,258,398,198,219,212,246,258,398,212,246,276,375,258,398,276,375,261,405,359,463,222,463,232,450,359,463,232,450,243,449,359,463,243,449,253,446,359,463,253,446,261,441,359,463,261,441,265,436,359,463,265,436,267,429,359,463,267,429,321,434,359,463,321,434,339,444,359,463,339,444,359,450,276,375,290,401,267,429,276,375,267,429,267,424,276,375,267,424,266,418,276,375,266,418,264,411,276,375,264,411,261, -405,305,420,321,434,267,429,305,420,267,429,290,401,128,219,133,209,179,244,179,244,133,209,194,51,179,244,194,51,192,77,192,155,192,127,313,127,192,155,313,127,313,155,212,246,198,219,313,219,212,246,313,219,313,246,248,0,248,13,225,16,248,0,225,16,209,22,248,0,209,22,132,55,248,0,132,55,127,35,199,33,194,51,133,209,199,33,133,209,133,155,199,33,133,155,133,127,199,33,133,127,133,84,199,33,133,84,209,22,11,155,11,127,133,127,11,155,133,127,133,155,112,246,11,246,128,219,112,246,128,219,179,244,112,246,179,244,97,398,112,246,97,398,93,405,112,246,93,405,91,412,112,246,91,412,89,418,112,246,89,418,88,424,128,219,11,246,11,219,248,0,77,13,77,0,132,55,209,22,133,84,192,209,179,244,192,77,232,450,222,463,222,450,-19,447,-36,463,-36,450,47,473,47,280,93,280,47,473,93,280,93,473,47,184,47,-9,93,-9,47,184,93,-9,93,184,142,469,115,458,119,425,119,425,115,458,116,409,118,308,116,409,115,458,118,308,115,458,98,329,98,329,115,458,95,440,98,329,95,440,86,348,86,348,95,440,82,416,86,348,82,416,79,367,79,367,82,416,77,388,97,186,124,79,106,174,106,174,124,79,118,160,142,138,118,160,124,79,142,138,124,79,169,45,133,268,132,284,129,284,133,268,129,284,118,266,133,268,135,284,132,284,88,237,95,250,103,279,103,279,95,250,105,259,103,279,105,259,129,284,129,284,105,259,118,266,103,279,81,268,88,237,88,237,81,268,86,222,90,111,86,222,81,268,90,111,81,268,67,140,67,140,81,268,64,250,67,140,64,250,53,170,53,170,64,250,53,227,53,170,53,227,49,200,232,63,205,88,210,11,210,11,205,88,197,104,210,11,197,104,192,28,192,28,197,104,181,111,192,28,181,111,169,45,169,45,181,111,162,122,169,45,162,122,142,138,228,-52,220,-67,231,-87,231,-87,220,-67,208,-79,231,-87,208,-79,203,-99,203,-99,208,-79,191,-86,203,-99,191,-86,170,-88,170,-88,155,-87,170,-103,170,-103,155,-87,142,-83,170,-103,142,-83,138,-99,138,-99,142,-83,130,-78,138,-99,130,-78,123,-71,111,4,112,-89,122,2,122,2,112,-89,120,-63,123,-71,120,-63,112,-89,123, --71,112,-89,138,-99,201,454,203,470,190,457,190,457,203,470,176,459,156,456,176,459,174,473,156,456,174,473,142,469,142,469,119,425,127,439,142,469,127,439,139,450,142,469,139,450,156,456,213,102,205,88,213,88,213,102,213,88,242,91,213,102,197,104,205,88,252,122,241,112,242,91,242,91,241,112,228,105,242,91,228,105,213,102,165,258,185,247,236,280,236,280,185,247,205,232,236,280,205,232,225,213,225,213,238,199,236,280,236,280,238,199,258,259,298,172,296,194,295,143,295,143,296,194,288,216,295,143,288,216,283,120,283,120,288,216,275,238,283,120,275,238,265,102,265,102,275,238,262,148,265,102,262,148,259,134,265,102,259,134,252,122,248,185,256,172,258,259,258,259,256,172,260,159,258,259,260,159,275,238,275,238,260,159,262,148,148,265,165,258,236,280,148,265,236,280,147,283,148,265,147,283,143,283,148,265,143,283,139,283,148,265,139,283,135,284,148,265,135,284,133,268,140,359,132,367,147,283,140,359,147,283,236,280,132,367,126,377,147,283,147,283,126,377,121,387,147,283,121,387,118,308,118,308,121,387,117,398,118,308,117,398,116,409,270,-14,269,6,266,-44,266,-44,269,6,262,24,266,-44,262,24,252,-68,252,-68,262,24,250,42,252,-68,250,42,232,63,232,63,210,11,222,-3,232,63,222,-3,229,-18,232,63,229,-18,231,-34,232,63,231,-34,231,-87,232,63,231,-87,252,-68,228,-52,231,-87,231,-34,170,-88,170,-103,203,-99,219,435,218,434,228,367,228,367,218,434,217,432,228,367,217,432,217,369,217,369,217,432,216,430,217,369,216,430,213,428,228,460,219,436,228,367,217,443,219,436,228,460,217,443,228,460,211,449,211,449,228,460,203,470,211,449,203,470,201,454,203,470,174,473,176,459,260,427,247,446,251,374,260,427,251,374,258,381,260,427,258,381,263,392,260,427,263,392,264,405,247,446,228,460,228,367,247,446,228,367,241,369,247,446,241,369,251,374,208,373,217,369,213,428,208,373,213,428,207,423,208,373,207,423,202,417,208,373,202,417,201,380,198,411,196,404,197,388,198,411,197,388,201,380,198,411,201,380,202,417,143,-15,138,-7,139,-42,143,-15,139,-42,142,-36,143,-15,142,-36,144,-30,143,-15,144,-30,145,-24,139,-42,138, --7,134,-47,134,-47,138,-7,131,-1,134,-47,131,-1,128,-53,128,-53,131,-1,126,-55,120,-63,121,-61,122,2,122,2,121,-61,122,-60,122,2,122,-60,131,-1,131,-1,122,-60,123,-57,131,-1,123,-57,126,-55,99,2,88,-2,91,-74,99,2,91,-74,112,-89,99,2,112,-89,111,4,80,-10,75,-20,77,-55,80,-10,77,-55,91,-74,80,-10,91,-74,88,-2,90,197,87,209,90,111,90,197,90,111,124,79,90,197,124,79,97,186,86,222,90,111,87,209,77,-55,75,-20,73,-33,197,388,196,404,195,398,219,435,228,367,219,436,252,122,242,91,265,102,258,259,238,199,248,185,152,401,153,390,153,412,153,412,153,390,158,380,153,412,158,380,158,421,158,421,158,380,165,373,158,421,165,373,166,429,166,429,165,373,174,368,166,429,174,368,175,433,175,433,174,368,185,366,175,433,185,366,186,435,186,435,185,366,197,368,186,435,197,368,197,433,197,433,197,368,207,373,197,433,207,373,207,428,207,428,207,373,214,380,207,428,214,380,214,421,214,421,214,380,219,390,214,421,219,390,219,412,219,412,219,390,221,401,13,401,14,390,14,412,14,412,14,390,19,380,14,412,19,380,19,421,19,421,19,380,26,373,19,421,26,373,27,429,27,429,26,373,35,368,27,429,35,368,36,433,36,433,35,368,46,366,36,433,46,366,47,435,47,435,46,366,57,368,47,435,57,368,58,433,58,433,57,368,67,373,58,433,67,373,67,428,67,428,67,373,75,380,67,428,75,380,75,421,75,421,75,380,80,390,75,421,80,390,80,412,80,412,80,390,82,401,227,133,206,159,222,105,222,105,206,159,192,193,222,105,192,193,184,122,184,122,192,193,187,236,193,347,187,236,191,276,193,347,191,276,204,310,302,372,288,373,309,356,309,356,288,373,287,359,253,353,287,359,288,373,253,353,288,373,236,366,368,353,366,355,372,295,372,295,366,355,363,357,372,295,363,357,360,295,360,295,363,357,354,318,236,366,193,347,204,310,236,366,204,310,225,336,236,366,225,336,253,353,161,318,140,278,156,150,161,318,156,150,184,122,161,318,184,122,187,236,161,318,187,236,193,347,140,278,133,230,139,186,140,278,139,186,156,150,372,173,360,151,363,114,363,114,360,151,346,133,363,114,346,133,346, -109,346,109,346,133,330,122,346,109,330,122,321,103,321,103,330,122,312,115,321,103,312,115,294,100,294,100,312,115,291,113,267,98,294,100,291,113,267,98,291,113,256,118,267,98,256,118,227,133,267,98,227,133,222,105,372,295,372,345,371,348,372,295,371,348,370,351,372,295,370,351,368,353,302,372,309,356,318,370,318,370,309,356,328,348,318,370,328,348,333,367,333,367,328,348,343,336,333,367,343,336,349,362,349,362,343,336,354,318,349,362,354,318,363,357,372,173,363,114,371,120,372,173,371,120,383,173,270,473,264,444,328,433,270,473,328,433,345,461,345,461,328,433,383,403,345,461,383,403,409,427,409,427,383,403,428,358,409,427,428,358,460,374,460,374,428,358,457,300,460,374,457,300,467,234,467,234,493,308,460,374,467,234,494,154,493,308,460,88,494,154,467,234,460,88,467,234,457,166,460,88,457,166,428,108,460,88,428,108,409,36,266,20,266,-9,330,31,330,31,266,-9,343,2,330,31,343,2,385,61,385,61,343,2,409,36,385,61,409,36,428,108,75,298,104,356,125,427,125,427,104,356,148,402,125,427,148,402,192,461,192,461,148,402,202,433,192,461,202,433,270,473,270,473,202,433,264,444,39,155,72,88,39,309,39,309,72,88,65,232,73,375,65,232,75,298,73,375,75,298,125,427,203,30,148,61,190,2,203,30,190,2,266,-9,203,30,266,-9,266,20,124,36,190,2,148,61,124,36,148,61,104,107,124,36,104,107,75,165,124,36,75,165,72,88,65,232,72,88,75,165,39,155,39,309,27,231,39,309,65,232,73,375,493,308,494,154,505,231,54,432,53,434,54,417,54,417,53,434,53,436,54,417,53,436,51,412,51,412,53,436,53,438,62,471,53,438,55,443,62,471,55,443,60,447,55,427,54,430,54,417,55,427,54,417,55,422,55,427,55,422,55,426,55,422,55,423,55,424,55,422,55,424,55,425,55,422,55,425,55,426,65,277,77,280,65,310,65,310,77,280,73,309,79,309,73,309,77,280,79,309,77,280,90,286,113,471,87,473,93,453,93,453,87,473,84,454,75,453,84,454,87,473,75,453,87,473,67,451,67,451,87,473,62,471,67,451,62,471,60,447,110,326,108,322,116,306,116,306,108,322,106,319,116, -306,106,319,103,316,103,316,96,313,103,295,103,295,96,313,90,311,103,295,90,311,90,286,90,286,90,311,84,310,90,286,84,310,79,309,34,405,40,406,41,465,41,465,40,406,46,408,41,465,46,408,53,438,53,438,46,408,51,412,15,413,20,409,25,455,25,455,20,409,26,406,25,455,26,406,41,465,41,465,26,406,34,405,15,442,11,427,12,419,15,442,12,419,15,413,15,442,15,413,25,455,113,471,111,386,116,306,113,471,116,306,134,463,134,463,116,306,119,295,134,463,119,295,124,286,113,471,93,453,101,449,113,471,101,449,106,443,113,471,106,443,109,435,113,471,109,435,110,424,113,471,110,424,111,386,138,277,148,276,148,449,148,449,148,276,157,276,148,449,157,276,157,430,157,430,157,276,160,316,157,430,160,316,160,326,164,278,172,282,166,302,166,302,172,282,170,301,174,301,170,301,172,282,174,301,172,282,180,288,189,309,185,306,189,297,189,297,185,306,181,304,189,297,181,304,180,288,180,288,181,304,177,302,180,288,177,302,174,301,164,278,166,302,163,304,164,278,163,304,161,309,164,278,161,309,160,316,164,278,160,316,157,276,134,463,124,286,130,280,134,463,130,280,138,277,134,463,138,277,148,449,116,306,111,386,111,332,116,306,111,332,111,329,116,306,111,329,110,326,103,316,103,295,116,306,49,350,55,359,55,382,55,382,55,359,67,367,55,382,67,367,78,391,78,391,67,367,85,376,78,391,85,376,110,403,110,403,85,376,111,386,110,403,111,386,110,424,55,382,40,375,49,350,49,350,40,375,47,340,52,276,47,340,40,375,52,276,40,375,36,278,36,278,40,375,29,368,36,278,29,368,23,284,23,284,29,368,18,359,23,284,18,359,13,354,58,315,52,321,52,276,58,315,52,276,65,277,58,315,65,277,65,310,48,330,47,340,52,276,48,330,52,276,52,321,12,295,23,284,13,354,12,295,13,354,9,347,12,295,9,347,6,340,12,295,6,340,5,308,4,332,3,323,5,308,4,332,5,308,6,340,160,326,160,406,157,430,41,465,53,438,62,471,54,432,54,417,54,430,284,84,274,97,284,84,284,84,274,97,285,46,284,84,285,46,296,69,296,69,285,46,302,30,296,69,302,30,306,55,306,55,302, -30,311,23,306,55,311,23,313,44,313,44,311,23,313,24,313,44,313,24,316,25,318,36,313,44,316,25,318,36,316,25,318,26,318,36,318,26,319,28,318,36,319,28,320,30,239,143,240,89,251,127,251,127,240,89,263,67,251,127,263,67,263,112,263,112,263,67,285,46,263,112,285,46,274,97,226,159,241,229,220,210,226,159,220,210,220,108,226,159,220,108,240,89,226,159,240,89,239,143,319,288,317,290,318,279,319,288,318,279,320,284,319,288,320,284,319,286,264,250,284,233,285,270,285,270,284,233,296,249,285,270,296,249,303,285,303,285,296,249,306,261,303,285,306,261,312,291,312,291,306,261,313,271,312,291,313,271,315,291,315,291,313,271,318,279,315,291,318,279,317,290,241,229,226,159,284,233,241,229,284,233,264,250,150,84,140,97,150,46,150,84,150,46,162,69,162,69,150,46,168,30,162,69,168,30,172,55,172,55,168,30,177,23,172,55,177,23,179,44,179,44,177,23,179,24,179,44,179,24,181,25,184,36,179,44,181,25,184,36,181,25,183,26,184,36,183,26,185,28,184,36,185,28,185,30,104,143,106,89,117,127,117,127,106,89,129,67,117,127,129,67,129,112,129,112,129,67,150,46,129,112,150,46,140,97,91,159,106,229,86,210,91,159,86,210,86,108,91,159,86,108,106,89,91,159,106,89,104,143,184,288,183,290,184,279,184,288,184,279,185,284,184,288,185,284,185,286,129,250,150,233,151,270,151,270,150,233,162,249,151,270,162,249,168,285,168,285,162,249,172,261,168,285,172,261,177,291,177,291,172,261,179,271,177,291,179,271,181,291,181,291,179,271,184,279,181,291,184,279,183,290,106,229,91,159,150,233,106,229,150,233,129,250,86,108,86,210,30,159,220,108,220,210,164,159,340,229,340,80,387,80,340,229,387,80,387,275,340,229,387,275,34,275,340,229,34,275,34,229,199,136,199,180,27,180,199,136,27,180,27,136,311,293,311,293,311,293,311,293,323,236,327,352,327,352,323,236,338,248,327,352,338,248,344,338,344,338,338,248,349,263,344,338,349,263,354,319,354,319,349,263,356,279,354,319,356,279,358,295,309,311,311,293,327,352,309,311,327,352,304,361,309,311,304,361,304,327,232,351,259,351,275, -364,275,364,259,351,279,348,275,364,279,348,304,361,304,361,279,348,294,340,304,361,294,340,304,327,188,316,235,129,232,140,188,316,232,140,232,155,232,233,232,220,266,220,232,233,266,220,262,233,262,233,266,220,263,233,262,233,263,233,279,236,279,236,263,233,266,220,279,236,266,220,279,200,232,351,275,364,185,341,232,351,185,341,187,331,232,351,187,331,188,316,232,351,188,316,232,155,275,364,155,364,170,351,275,364,170,351,180,348,275,364,180,348,185,341,298,170,302,227,303,257,303,257,302,227,323,236,303,257,323,236,309,274,309,274,323,236,311,293,298,170,303,257,294,177,294,177,303,257,293,244,294,177,293,244,288,186,288,186,293,244,279,236,288,186,279,236,279,200,325,126,335,115,342,172,342,172,335,115,344,108,342,172,344,108,353,157,353,157,344,108,352,106,353,157,352,106,364,144,364,144,352,106,397,106,364,144,397,106,376,132,376,132,397,106,387,121,342,172,302,227,302,162,342,172,302,162,314,142,342,172,314,142,325,126,266,106,266,117,250,119,266,106,250,119,240,122,266,106,240,122,188,152,266,106,188,152,187,137,266,106,187,137,185,127,266,106,185,127,180,122,266,106,180,122,170,119,266,106,170,119,154,117,266,106,154,117,153,106,188,155,188,152,240,122,188,155,240,122,235,129,188,155,235,129,188,316,270,473,265,444,329,433,270,473,329,433,344,461,344,461,329,433,384,403,344,461,384,403,409,427,409,427,384,403,428,357,409,427,428,357,460,374,460,374,428,357,457,299,460,374,457,299,467,231,467,231,493,307,460,374,467,231,494,154,493,307,460,88,494,154,467,231,460,88,467,231,457,165,460,88,457,165,428,107,460,88,428,107,409,36,266,20,266,-9,329,31,329,31,266,-9,343,2,329,31,343,2,384,61,384,61,343,2,409,36,384,61,409,36,428,107,75,298,104,356,125,427,125,427,104,356,148,402,125,427,148,402,192,461,192,461,148,402,203,433,192,461,203,433,270,473,270,473,203,433,265,444,39,155,72,88,39,309,39,309,72,88,65,232,73,375,65,232,75,298,73,375,75,298,125,427,203,30,148,61,190,2,203,30,190,2,266,-9,203,30,266,-9,266,20,124,36,190,2,148,61,124,36,148,61,104,107,124, -36,104,107,75,165,124,36,75,165,72,88,65,232,72,88,75,165,39,155,39,309,27,232,39,309,65,232,73,375,493,307,494,154,505,230,302,162,302,227,298,170,387,121,397,106,397,112,170,351,155,364,155,353,226,383,226,420,8,420,226,383,8,420,8,383,116,445,138,449,138,449,141,473,138,449,162,445,141,473,162,445,173,468,173,468,162,445,182,434,173,468,182,434,200,454,200,454,182,434,198,418,200,454,198,418,209,397,240,373,235,405,235,341,235,341,235,405,221,432,235,341,221,432,221,314,221,314,221,432,213,373,221,314,213,373,212,373,221,314,212,373,209,350,221,314,209,350,199,292,199,292,209,350,198,329,199,292,198,329,183,312,221,432,200,454,209,397,221,432,209,397,212,373,221,432,212,373,213,373,199,292,183,312,172,278,172,278,183,312,163,301,172,278,163,301,140,273,140,273,163,301,140,297,81,418,97,434,109,468,109,468,97,434,116,445,109,468,116,445,141,473,141,473,116,445,138,449,59,433,67,373,71,397,59,433,71,397,81,454,81,454,71,397,81,418,81,454,81,418,109,468,117,301,97,312,108,278,117,301,108,278,140,273,117,301,140,273,140,297,67,373,59,314,71,349,71,349,59,314,80,292,71,349,80,292,81,328,81,328,80,292,108,278,81,328,108,278,97,312,40,373,45,341,45,405,45,405,45,341,59,314,45,405,59,314,59,433,59,433,59,314,67,373,263,352,216,352,263,23,263,23,216,352,216,216,263,23,216,216,216,170,216,170,216,216,34,216,216,170,34,216,34,170,263,170,446,170,263,216,34,-14,34,-60,446,-60,34,-14,446,-60,446,-14,263,216,446,170,446,216,263,23,216,170,216,23,75,281,4,205,75,234,75,281,75,234,134,291,75,281,134,291,94,304,18,380,28,398,29,444,29,444,28,398,39,412,29,444,39,412,49,461,49,461,39,412,51,423,49,461,51,423,74,470,74,470,51,423,65,429,74,470,65,429,80,431,80,431,96,428,105,473,105,473,96,428,109,421,105,473,109,421,136,470,136,470,109,421,120,409,136,470,120,409,127,395,13,421,1,390,18,380,13,421,18,380,29,444,127,364,134,291,130,378,130,378,134,291,136,470,136,470,134,291,157,316,136,470,157,316,160,459,160,459,157, -316,174,338,160,459,174,338,178,443,178,443,174,338,186,358,178,443,186,358,190,422,190,422,186,358,192,377,190,422,192,377,194,397,136,470,127,395,130,378,105,473,74,470,80,431,134,291,127,364,121,346,134,291,121,346,110,326,134,291,110,326,94,304,181,240,173,237,180,189,180,189,173,237,164,235,180,189,164,235,154,234,180,189,154,234,75,234,180,189,75,234,4,205,207,248,195,253,188,245,207,248,188,245,181,240,207,248,181,240,180,189,180,189,4,205,4,189,92,218,86,219,116,188,116,188,86,219,79,221,116,188,79,221,73,184,73,184,79,221,72,225,73,184,72,225,64,231,79,324,82,324,91,352,91,352,82,324,84,324,84,324,106,322,91,352,91,352,106,322,109,363,91,352,65,342,73,323,91,352,73,323,79,324,32,394,43,410,47,451,47,451,43,410,54,421,47,451,54,421,65,464,65,464,54,421,66,429,65,464,66,429,85,471,85,471,66,429,78,433,85,471,78,433,92,434,92,434,106,433,109,473,109,473,106,433,117,429,109,473,117,429,133,470,133,470,117,429,125,422,133,470,125,422,130,412,30,432,15,407,32,394,30,432,32,394,47,451,145,250,138,237,153,201,153,201,138,237,128,226,153,201,128,226,116,188,116,188,128,226,115,220,116,188,115,220,99,217,99,217,92,218,116,188,133,470,131,401,136,303,133,470,136,303,154,462,154,462,136,303,143,358,154,462,143,358,160,368,109,473,85,471,92,434,181,434,171,450,172,379,181,434,172,379,180,391,181,434,180,391,184,403,181,434,184,403,185,415,171,450,154,462,160,368,171,450,160,368,172,379,143,356,143,358,136,303,143,356,136,303,144,287,143,356,144,287,166,348,129,387,122,374,123,314,129,387,123,314,136,303,129,387,136,303,131,401,109,363,106,322,123,314,109,363,123,314,122,374,198,248,204,280,202,300,198,248,202,300,195,318,198,248,195,318,183,335,198,248,183,335,180,222,145,250,153,201,147,266,147,266,153,201,166,348,166,348,153,201,180,222,166,348,180,222,183,335,147,266,166,348,144,287,56,236,50,240,52,185,56,236,52,185,73,184,56,236,73,184,64,231,52,185,50,240,45,242,52,185,45,242,40,244,52,185,40,244,35,245,52,185,35,245,35, -191,27,244,20,241,21,199,27,244,21,199,35,191,27,244,35,191,35,245,14,237,11,231,12,210,14,237,12,210,21,199,14,237,21,199,20,241,73,323,65,342,65,322,12,210,11,231,9,223,133,470,130,412,131,401,198,474,201,423,206,473,206,473,201,423,208,428,206,473,208,428,213,471,213,471,208,428,214,434,213,471,214,434,218,466,218,466,214,434,219,440,218,466,219,440,221,460,221,460,219,440,221,446,221,460,221,446,222,452,201,423,198,474,192,474,201,423,192,474,186,472,201,423,186,472,181,469,201,423,181,469,175,465,201,423,175,465,168,459,201,423,168,459,93,355,93,355,168,459,65,355,64,45,64,45,64,45,64,45,104,315,42,315,64,45,42,315,45,-149,64,45,45,-149,56,-151,64,45,56,-151,68,-149,106,83,104,109,108,1,108,1,104,109,92,11,92,11,104,109,104,315,92,11,104,315,77,26,77,26,104,315,64,45,42,315,42,38,45,-149,45,-149,42,38,40,20,45,-149,40,20,36,-141,36,-141,40,20,36,-7,36,-141,36,-7,31,-40,25,-97,26,-115,27,-72,27,-72,26,-115,30,-130,27,-72,30,-130,31,-40,31,-40,30,-130,36,-141,239,315,239,80,241,56,241,56,239,80,229,65,241,56,229,65,227,33,227,33,229,65,217,53,227,33,217,53,210,15,210,15,217,53,201,44,210,15,201,44,192,3,192,3,201,44,183,38,192,3,183,38,172,-4,172,-4,183,38,163,37,172,-4,163,37,162,37,172,-4,162,37,150,-6,150,-6,162,37,142,40,150,-6,142,40,127,-4,127,-4,142,40,126,48,127,-4,126,48,114,62,114,62,106,83,108,1,114,62,108,1,127,-4,301,315,239,315,241,56,301,315,241,56,243,56,301,315,243,56,247,34,301,315,247,34,255,16,301,315,255,16,267,3,301,315,267,3,281,-3,301,315,281,-3,296,-6,301,315,296,-6,301,67,349,31,341,25,346,17,346,17,341,25,335,21,346,17,335,21,334,6,334,6,335,21,329,19,334,6,329,19,323,-1,323,-1,329,19,323,19,349,31,346,17,359,33,349,31,359,33,359,39,314,21,308,27,311,-5,314,21,311,-5,323,-1,314,21,323,-1,323,19,301,67,296,-6,301,50,301,50,296,-6,311,-5,301,50,311,-5,304,36,304,36,311,-5,308,27,67, -20,68,-149,73,-9,73,-9,68,-149,77,-143,73,-9,77,-143,81,-41,81,-41,77,-143,84,-132,81,-41,84,-132,87,-72,87,-72,84,-132,88,-117,87,-72,88,-117,90,-97,64,45,68,-149,67,20,163,37,183,38,162,37,172,-69,161,-81,224,-107,224,-107,161,-81,143,-88,224,-107,143,-88,116,-91,188,463,133,458,144,441,188,463,144,441,178,448,188,463,178,448,178,191,188,463,178,191,224,-107,188,463,224,-107,224,448,188,463,224,448,373,463,178,448,178,206,178,191,146,214,123,230,130,199,130,199,123,230,107,254,130,199,107,254,92,215,92,215,107,254,98,288,92,215,98,288,95,331,95,331,97,373,92,442,92,442,97,373,105,404,92,442,105,404,133,458,133,458,105,404,120,426,133,458,120,426,144,441,92,442,64,416,65,241,92,442,65,241,92,215,92,442,92,215,95,331,346,446,373,450,373,463,346,446,373,463,328,438,328,438,373,463,265,448,328,438,265,448,317,425,317,425,265,448,312,406,328,-81,317,-70,265,-107,265,-107,317,-70,312,-53,265,-107,312,-53,265,448,265,448,312,-53,311,-28,265,448,311,-28,311,380,224,-107,178,191,178,-19,224,-107,178,-19,177,-49,224,-107,177,-49,172,-69,373,-107,373,-91,346,-88,373,-107,346,-88,328,-81,373,-107,328,-81,265,-107,146,214,130,199,178,191,146,214,178,191,178,206,48,278,65,241,64,416,48,278,64,416,47,378,48,278,47,378,42,330,224,-107,116,-91,116,-107,373,463,224,448,265,448,312,406,265,448,311,380,49,178,51,166,51,190,51,190,51,166,56,155,51,190,56,155,57,201,57,201,56,155,65,147,57,201,65,147,65,210,65,210,65,147,75,141,65,210,75,141,76,215,76,215,75,141,87,139,76,215,87,139,88,217,88,217,87,139,100,141,88,217,100,141,100,215,100,215,100,141,110,147,100,215,110,147,111,209,111,209,110,147,119,155,111,209,119,155,119,200,119,200,119,155,125,166,119,200,125,166,125,190,125,190,125,166,127,177,83,-149,95,-150,83,-125,83,-125,95,-150,91,-125,105,-123,91,-125,95,-150,105,-123,95,-150,125,-147,80,-70,84,-69,98,0,98,0,84,-69,88,-69,98,0,88,-69,93,-69,93,-69,107,-70,98,0,98,0,107,-70,105,-44,98,0,105,-44,122,0,98,0,69,-69,73,-72,98,0,73, --72,77,-71,98,0,77,-71,80,-70,183,-90,180,-74,179,-111,179,-111,180,-74,172,-60,179,-111,172,-60,168,-127,168,-127,172,-60,160,-51,168,-127,160,-51,149,-139,149,-139,160,-51,143,-45,149,-139,143,-45,130,-94,130,-94,143,-45,129,-85,125,-78,129,-85,143,-45,125,-78,143,-45,123,-43,125,-78,123,-43,119,-43,125,-78,119,-43,118,-73,118,-73,119,-43,115,-43,118,-73,115,-43,112,-43,118,-73,112,-43,108,-44,118,-73,108,-44,107,-70,149,-139,130,-94,129,-105,149,-139,129,-105,125,-147,125,-147,129,-105,124,-113,125,-147,124,-113,116,-119,46,-117,49,-143,57,-120,57,-120,49,-143,60,-146,57,-120,60,-146,66,-122,66,-122,60,-146,71,-148,66,-122,71,-148,75,-124,75,-124,71,-148,83,-149,75,-124,83,-149,83,-125,49,-143,46,-117,37,-138,105,-123,125,-147,116,-119,105,-44,107,-70,108,-44,73,214,66,210,173,189,173,189,66,210,55,207,173,189,55,207,40,205,58,425,63,427,124,473,124,473,63,427,67,427,124,473,67,427,70,427,70,427,73,427,124,473,124,473,73,427,75,425,124,473,75,425,76,421,158,207,147,210,173,189,173,189,147,210,139,215,173,189,139,215,77,229,77,229,139,215,135,223,77,229,135,223,77,407,77,415,77,407,124,473,77,415,124,473,76,421,51,422,58,425,124,473,51,422,124,473,41,434,51,422,41,434,41,418,134,233,134,470,124,473,134,233,124,473,77,407,134,233,77,407,135,223,76,220,73,214,173,189,76,220,173,189,77,229,173,189,40,205,40,189,158,207,173,189,173,205,62,350,72,280,67,336,67,336,72,280,73,323,78,314,73,323,72,280,78,314,72,280,105,276,58,366,56,382,46,456,58,366,46,456,44,294,58,366,44,294,72,280,58,366,72,280,62,350,46,456,55,398,58,416,46,456,58,416,75,469,75,469,58,416,64,430,75,469,64,430,74,441,4,373,9,341,9,407,9,407,9,341,23,314,9,407,23,314,23,435,23,435,23,314,44,294,23,435,44,294,46,456,145,469,111,473,123,446,123,446,111,473,104,450,88,448,104,450,111,473,88,448,111,473,75,469,160,339,154,322,170,295,170,295,154,322,143,309,170,295,143,309,140,281,140,281,143,309,130,302,140,281,130,302,112,299,112,299,102,300,105,276,105,276,102,300,93, -303,105,276,93,303,85,308,212,380,208,410,207,346,207,346,208,410,194,436,207,346,194,436,193,317,193,317,194,436,173,456,193,317,173,456,170,295,170,295,173,456,162,361,123,446,139,434,145,469,145,469,139,434,151,415,145,469,151,415,173,456,173,456,151,415,159,391,173,456,159,391,162,361,112,299,105,276,140,281,75,469,74,441,88,448,160,339,170,295,162,361,78,314,105,276,85,308,46,456,56,382,55,398,129,105,185,155,129,206,129,105,129,206,124,155,129,105,124,155,108,86,75,217,86,203,86,247,86,247,86,203,98,187,86,247,98,187,109,225,109,225,98,187,111,171,109,225,111,171,129,206,129,206,111,171,124,155,75,217,86,247,65,230,65,230,86,247,65,269,65,230,65,269,53,246,53,246,65,269,47,285,53,246,47,285,44,260,44,260,47,285,38,291,44,260,38,291,36,270,36,270,38,291,36,291,36,270,36,291,34,290,32,288,31,286,32,278,32,288,32,278,36,270,32,288,36,270,34,290,264,105,320,155,264,206,264,105,264,206,259,155,264,105,259,155,243,86,210,217,221,203,221,247,221,247,221,203,233,187,221,247,233,187,244,225,244,225,233,187,246,171,244,225,246,171,264,206,264,206,246,171,259,155,210,217,221,247,200,230,200,230,221,247,200,269,200,230,200,269,188,246,188,246,200,269,182,285,188,246,182,285,178,260,178,260,182,285,173,291,178,260,173,291,171,291,171,270,178,260,171,291,171,270,171,291,169,290,171,270,169,290,167,288,171,270,167,288,166,278,165,286,165,284,166,278,165,286,166,278,167,288,167,25,169,24,171,43,171,43,169,24,173,23,171,43,173,23,178,53,178,53,173,23,182,29,178,53,182,29,188,65,188,65,182,29,199,44,188,65,199,44,200,81,200,81,199,44,221,64,200,81,221,64,259,155,259,155,221,64,243,86,166,35,165,30,165,29,166,35,165,29,166,27,166,35,166,27,167,25,166,35,167,25,171,43,32,25,34,24,36,43,36,43,34,24,38,23,36,43,38,23,44,53,44,53,38,23,46,29,44,53,46,29,53,65,53,65,46,29,64,44,53,65,64,44,65,81,65,81,64,44,85,64,65,81,85,64,124,155,124,155,85,64,108,86,32,35,30,30,31,29,32, -35,31,29,31,27,32,35,31,27,32,25,32,35,32,25,36,43,32,278,31,286,30,284,286,63,412,63,286,98,286,98,412,63,317,103,286,98,317,103,427,284,427,284,317,103,412,228,427,284,412,228,461,0,461,0,412,228,412,103,461,0,412,103,412,63,412,63,412,103,317,103,427,284,461,0,461,284,461,103,461,63,499,63,461,103,499,63,499,103,410,473,93,-9,127,-9,410,473,127,-9,442,473,62,214,55,210,156,189,156,189,55,210,45,207,156,189,45,207,30,205,48,425,53,427,106,473,106,473,53,427,57,427,106,473,57,427,60,427,60,427,62,427,106,473,106,473,62,427,64,425,106,473,64,425,65,421,140,207,129,210,156,189,156,189,129,210,122,215,156,189,122,215,66,229,66,229,122,215,118,223,66,229,118,223,66,407,66,415,66,407,106,473,66,415,106,473,65,421,40,422,48,425,106,473,40,422,106,473,30,434,40,422,30,434,30,418,116,233,116,470,106,473,116,233,106,473,66,407,116,233,66,407,118,223,65,220,62,214,156,189,65,220,156,189,66,229,156,189,30,205,30,189,140,207,156,189,156,205,461,0,412,63,412,0,432,157,421,137,445,102,445,102,421,137,406,115,445,102,406,115,387,92,387,92,316,17,387,45,387,45,316,17,491,0,387,45,491,0,466,45,476,46,466,45,491,0,476,46,491,0,485,48,485,48,491,0,493,51,330,191,340,209,341,255,341,255,340,209,351,223,341,255,351,223,360,272,360,272,351,223,363,234,360,272,363,234,385,281,385,281,363,234,377,240,385,281,377,240,391,242,391,242,407,240,417,284,417,284,407,240,421,232,417,284,421,232,447,281,447,281,421,232,431,221,447,281,431,221,438,206,325,232,313,201,330,191,325,232,330,191,341,255,519,59,506,64,500,56,519,59,500,56,493,51,519,59,493,51,491,0,384,473,67,-9,102,-9,384,473,102,-9,416,473,58,214,51,210,152,189,152,189,51,210,41,207,152,189,41,207,25,205,43,425,49,427,102,473,102,473,49,427,53,427,102,473,53,427,56,427,56,427,58,427,102,473,102,473,58,427,60,425,102,473,60,425,61,421,136,207,125,210,152,189,152,189,125,210,117,215,152,189,117,215,63,229,63,229,117,215,113,223,63,229,113, -223,63,407,62,415,63,407,102,473,62,415,102,473,61,421,36,422,43,425,102,473,36,422,102,473,27,434,36,422,27,434,27,418,112,233,112,470,102,473,112,233,102,473,63,407,112,233,63,407,113,223,438,175,445,102,441,189,441,189,445,102,447,281,447,281,445,102,469,127,447,281,469,127,472,270,472,270,469,127,486,148,472,270,486,148,490,254,490,254,486,148,497,168,490,254,497,168,502,233,502,233,497,168,504,188,502,233,504,188,505,208,447,281,438,206,441,189,417,284,385,281,391,242,387,92,387,45,445,102,62,220,58,214,152,189,62,220,152,189,63,229,152,189,25,205,25,189,136,207,152,189,152,205,432,157,445,102,438,175,491,0,316,17,316,0,289,63,415,63,289,98,289,98,415,63,320,103,289,98,320,103,431,284,431,284,320,103,415,228,431,284,415,228,464,0,464,0,415,228,415,103,464,0,415,103,415,63,415,63,415,103,320,103,431,284,464,0,464,284,464,103,464,63,502,63,464,103,502,63,502,103,414,473,97,-9,131,-9,414,473,131,-9,446,473,92,218,86,219,116,188,116,188,86,219,79,221,116,188,79,221,73,184,73,184,79,221,72,225,73,184,72,225,64,231,79,324,82,324,91,352,91,352,82,324,84,324,84,324,106,322,91,352,91,352,106,322,109,363,91,352,65,342,73,323,91,352,73,323,79,324,32,394,43,410,47,451,47,451,43,410,54,421,47,451,54,421,65,464,65,464,54,421,66,429,65,464,66,429,85,471,85,471,66,429,78,433,85,471,78,433,92,434,92,434,106,433,109,473,109,473,106,433,117,429,109,473,117,429,133,470,133,470,117,429,125,422,133,470,125,422,130,412,30,432,15,407,32,394,30,432,32,394,47,451,145,250,138,237,153,201,153,201,138,237,128,226,153,201,128,226,116,188,116,188,128,226,115,220,116,188,115,220,99,217,99,217,92,218,116,188,133,470,131,401,136,303,133,470,136,303,154,462,154,462,136,303,143,358,154,462,143,358,160,368,109,473,85,471,92,434,181,434,171,450,172,379,181,434,172,379,180,391,181,434,180,391,184,403,181,434,184,403,185,415,171,450,154,462,160,368,171,450,160,368,172,379,143,356,143,358,136,303,143,356,136,303,144,287,143,356,144,287,166, -348,129,387,122,374,123,314,129,387,123,314,136,303,129,387,136,303,131,401,109,363,106,322,123,314,109,363,123,314,122,374,198,248,204,280,202,300,198,248,202,300,195,318,198,248,195,318,183,335,198,248,183,335,180,222,145,250,153,201,147,266,147,266,153,201,166,348,166,348,153,201,180,222,166,348,180,222,183,335,147,266,166,348,144,287,56,236,50,240,52,185,56,236,52,185,73,184,56,236,73,184,64,231,52,185,50,240,45,242,52,185,45,242,40,244,52,185,40,244,35,245,52,185,35,245,35,191,27,244,20,241,21,199,27,244,21,199,35,191,27,244,35,191,35,245,14,237,11,231,12,210,14,237,12,210,21,199,14,237,21,199,20,241,73,323,65,342,65,322,12,210,11,231,9,223,133,470,130,412,131,401,464,0,415,63,415,0,145,252,156,254,157,325,157,325,156,254,167,260,157,325,167,260,167,320,167,320,167,260,175,268,167,320,175,268,175,313,175,313,175,268,180,279,175,313,180,279,180,303,180,303,180,279,182,291,110,303,110,279,115,313,115,313,110,279,115,268,115,313,115,268,122,320,122,320,115,268,122,260,122,320,122,260,133,325,133,325,122,260,133,254,133,325,133,254,145,327,145,327,133,254,145,252,145,327,145,252,157,325,101,38,111,62,108,117,101,38,108,117,95,98,95,98,65,59,86,-27,86,-27,65,59,85,-47,89,-74,85,-47,82,-136,89,-74,82,-136,104,-144,95,98,86,-27,89,-6,95,98,89,-6,94,15,95,98,94,15,101,38,46,-111,62,-125,65,59,65,59,62,-125,82,-136,65,59,82,-136,85,-47,44,28,30,3,31,-88,44,28,31,-88,37,-100,44,28,37,-100,46,-111,44,28,46,-111,65,59,21,-43,22,-59,23,-19,23,-19,22,-59,25,-74,23,-19,25,-74,30,3,30,3,25,-74,31,-88,152,205,140,205,141,138,152,205,141,138,148,165,152,205,148,165,151,187,134,179,128,157,130,105,134,179,130,105,141,138,134,179,141,138,140,205,119,136,108,117,111,62,119,136,111,62,130,105,119,136,130,105,128,157,224,-100,214,-112,218,-132,218,-132,214,-112,199,-122,218,-132,199,-122,186,-146,186,-146,199,-122,181,-128,186,-146,181,-128,162,-130,162,-130,137,-126,150,-151,150,-151,137,-126,127,-150,116,-114,100,-96,104,-144,116, --114,104,-144,127,-150,116,-114,127,-150,137,-126,206,-53,210,-59,212,-12,212,-12,210,-59,216,-65,212,-12,216,-65,220,-8,220,-8,216,-65,220,-71,220,-8,220,-71,230,-7,230,-7,220,-71,223,-76,230,-7,223,-76,226,-80,201,-36,201,-42,202,-26,202,-26,201,-42,203,-47,202,-26,203,-47,206,-18,206,-18,203,-47,206,-53,206,-18,206,-53,212,-12,242,-9,242,-111,251,-14,251,-14,242,-111,258,-83,251,-14,258,-83,258,-23,258,-23,258,-83,263,-50,258,-23,263,-50,262,-35,218,-132,242,-111,224,-100,224,-100,242,-111,227,-87,230,-7,227,-87,242,-111,230,-7,242,-111,242,-9,162,-130,150,-151,186,-146,230,-7,226,-80,227,-84,230,-7,227,-84,227,-87,89,-74,104,-144,100,-96,110,279,110,303,108,291,288,530,316,530,214,634,288,530,214,634,207,640,288,530,207,640,201,644,288,530,201,644,196,647,288,530,196,647,190,649,288,530,190,649,184,649,288,530,184,649,180,597,159,627,160,620,160,635,160,635,160,620,162,614,160,635,162,614,163,641,163,641,162,614,167,608,163,641,167,608,169,646,169,646,167,608,172,602,169,646,172,602,176,648,176,648,172,602,180,597,176,648,180,597,184,649,77,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,243,472,107,71,139,152,243,472,139,152,152,180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,257,472,345,15,338,14,495,0,495,0,338,14,329,13,495,0,329,13,316,13,363,29,361,25,495,0,495,0,361,25,358,22,495,0,358,22,355,20,355,20,350,17,495,0,495,0,350,17,345,15,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,243,472,152,180,232,373,243,472,232,373,313,180,243,472,313,180,257,472,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107,71,243,472,476,17,462,24,495,0,476,17,495,0,495,13,364,33,363,29,495,0,364,33,495,0,365,37,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118, -17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,495,0,316,13,316,0,326,649,329,598,334,648,334,648,329,598,337,603,334,648,337,603,341,646,341,646,337,603,342,609,341,646,342,609,346,641,346,641,342,609,347,615,346,641,347,615,349,635,349,635,347,615,349,621,349,635,349,621,350,627,329,598,326,649,320,649,329,598,320,649,314,647,329,598,314,647,309,644,329,598,309,644,303,640,329,598,303,640,296,634,329,598,296,634,221,530,77,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,243,472,107,71,139,152,243,472,139,152,152,180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,257,472,345,15,338,14,495,0,495,0,338,14,329,13,495,0,329,13,316,13,363,29,361,25,495,0,495,0,361,25,358,22,495,0,358,22,355,20,355,20,350,17,495,0,495,0,350,17,345,15,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,243,472,152,180,232,373,243,472,232,373,313,180,243,472,313,180,257,472,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107,71,243,472,476,17,462,24,495,0,476,17,495,0,495,13,364,33,363,29,495,0,364,33,495,0,365,37,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,495,0,316,13,316,0,221,530,296,634,193,530,141,530,165,530,228,647,228,647,165,530,250,602,228,647,250,602,272,647,272,647,250,602,335,530,272,647,335,530,359,530,77,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,243,472,107,71,139,152,243,472,139,152,152, -180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,257,472,345,15,338,14,495,0,495,0,338,14,329,13,495,0,329,13,316,13,363,29,361,25,495,0,495,0,361,25,358,22,495,0,358,22,355,20,355,20,350,17,495,0,495,0,350,17,345,15,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,243,472,152,180,232,373,243,472,232,373,313,180,243,472,313,180,257,472,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107,71,243,472,476,17,462,24,495,0,476,17,495,0,495,13,364,33,363,29,495,0,364,33,495,0,365,37,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,495,0,316,13,316,0,161,559,168,568,170,606,170,606,168,568,175,574,170,606,175,574,187,615,187,615,175,574,183,578,187,615,183,578,192,580,192,580,197,579,206,618,206,618,197,579,203,578,206,618,203,578,208,577,156,548,161,559,170,606,156,548,170,606,155,592,156,548,155,592,144,572,156,548,144,572,136,548,206,618,208,577,216,617,216,617,208,577,214,574,216,617,214,574,220,572,220,572,237,564,226,616,226,616,237,564,236,614,206,618,187,615,192,580,226,616,216,617,220,572,236,614,237,564,246,610,246,610,237,564,252,557,246,610,252,557,255,605,255,605,252,557,264,552,255,605,264,552,273,597,273,597,264,552,274,549,273,597,274,549,281,593,281,593,274,549,283,548,281,593,283,548,288,590,288,590,283,548,293,548,288,590,293,548,296,588,296,588,293,548,314,550,296,588,314,550,303,587,303,587,314,550,309,587,318,588,309,587,314,550,318,588,314,550,332,558,347,622,340,608,346,573,347,622,346,573,358,594,347,622,358,594,367,622,333,598,326,591,332,558,333,598,332,558,346,573,333,598,346,573,340,608,77, -81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,243,472,107,71,139,152,243,472,139,152,152,180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,257,472,345,15,338,14,495,0,495,0,338,14,329,13,495,0,329,13,316,13,363,29,361,25,495,0,495,0,361,25,358,22,495,0,358,22,355,20,355,20,350,17,495,0,495,0,350,17,345,15,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,243,472,152,180,232,373,243,472,232,373,313,180,243,472,313,180,257,472,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107,71,243,472,476,17,462,24,495,0,476,17,495,0,495,13,364,33,363,29,495,0,364,33,495,0,365,37,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,495,0,316,13,316,0,318,588,332,558,326,591,286,576,288,565,288,587,288,587,288,565,292,555,288,587,292,555,293,596,293,596,292,555,300,548,293,596,300,548,300,604,300,604,300,548,309,543,300,604,309,543,310,608,310,608,309,543,320,541,310,608,320,541,320,610,320,610,320,541,331,543,320,610,331,543,331,608,331,608,331,543,341,548,331,608,341,548,341,603,341,603,341,548,349,555,341,603,349,555,349,596,349,596,349,555,354,565,349,596,354,565,354,587,354,587,354,565,355,576,147,576,149,565,149,587,149,587,149,565,153,555,149,587,153,555,154,596,154,596,153,555,161,548,154,596,161,548,161,604,161,604,161,548,170,543,161,604,170,543,170,608,170,608,170,543,180,541,170,608,180,541,181,610,181,610,180,541,192,543,181,610,192,543,192,608,192,608,192,543,202,548,192,608,202,548,202,603,202,603,202,548,209,555,202,603,209,555,209,596,209,596,209,555,215,565,209,596,215, -565,215,587,215,587,215,565,216,576,77,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,243,472,107,71,139,152,243,472,139,152,152,180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,257,472,345,15,338,14,495,0,495,0,338,14,329,13,495,0,329,13,316,13,363,29,361,25,495,0,495,0,361,25,358,22,495,0,358,22,355,20,355,20,350,17,495,0,495,0,350,17,345,15,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,243,472,152,180,232,373,243,472,232,373,313,180,243,472,313,180,257,472,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107,71,243,472,476,17,462,24,495,0,476,17,495,0,495,13,364,33,363,29,495,0,364,33,495,0,365,37,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,495,0,316,13,316,0,295,588,289,576,292,547,292,547,289,576,279,566,292,547,279,566,273,537,273,537,279,566,266,559,273,537,266,559,251,534,251,534,266,559,251,557,252,673,251,649,266,647,252,673,266,647,274,669,274,669,266,647,278,640,274,669,278,640,293,659,293,659,278,640,289,630,293,659,289,630,295,618,321,602,318,624,318,580,318,580,318,624,308,644,318,580,308,644,308,562,308,562,308,644,298,603,295,618,298,603,308,644,295,618,308,644,293,659,295,588,292,547,308,562,295,588,308,562,298,603,214,630,224,640,230,669,230,669,224,640,237,647,230,669,237,647,252,673,252,673,237,647,251,649,211,659,196,644,205,603,211,659,205,603,208,618,211,659,208,618,214,630,211,659,214,630,230,669,214,576,208,588,210,547,210,547,208,588,205,603,236,559,224,566,229,537,236,559,229,537,251,534,236,559,251,534,251,557,214,576,210,547,229, -537,214,576,229,537,224,566,182,603,185,581,186,625,186,625,185,581,195,562,186,625,195,562,196,644,196,644,195,562,210,547,196,644,210,547,205,603,77,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,243,472,107,71,139,152,243,472,139,152,152,180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,257,472,345,15,338,14,495,0,495,0,338,14,329,13,495,0,329,13,316,13,363,29,361,25,495,0,495,0,361,25,358,22,495,0,358,22,355,20,355,20,350,17,495,0,495,0,350,17,345,15,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,243,472,152,180,232,373,243,472,232,373,313,180,243,472,313,180,257,472,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107,71,243,472,476,17,462,24,495,0,476,17,495,0,495,13,364,33,363,29,495,0,364,33,495,0,365,37,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,495,0,316,13,316,0,122,16,108,19,138,0,138,0,108,19,99,23,138,0,99,23,50,47,50,47,99,23,93,28,50,47,93,28,62,68,62,68,93,28,91,34,100,67,112,95,233,407,233,407,112,95,130,133,233,407,130,133,155,182,155,182,279,182,168,209,168,209,279,182,279,209,274,37,265,26,573,0,573,0,265,26,251,19,573,0,251,19,229,15,233,407,155,182,168,209,233,407,168,209,279,433,233,407,279,433,235,411,367,438,571,463,279,433,279,433,571,463,237,435,279,433,237,435,239,427,239,427,239,423,279,433,279,433,239,423,238,420,279,433,238,420,237,416,504,209,513,189,514,296,514,296,513,189,518,160,514,296,518,160,518,325,518,325,518,160,533,160,518,325,533,160,533,325,420,256,447,230,457,258,457, -258,447,230,472,228,457,258,472,228,484,264,484,264,472,228,491,222,484,264,491,222,503,276,503,276,491,222,504,209,503,276,504,209,514,296,279,433,348,48,348,66,348,256,348,230,447,230,348,256,447,230,420,256,571,463,367,438,427,438,571,463,427,438,478,437,571,463,478,437,513,431,571,463,513,431,535,418,571,463,535,418,548,397,571,463,548,397,555,365,571,463,555,365,571,365,279,433,348,66,348,413,279,433,348,413,348,421,279,433,348,421,351,428,279,433,351,428,355,433,279,433,355,433,360,437,279,433,360,437,367,438,571,463,177,463,200,448,571,463,200,448,217,446,571,463,217,446,229,441,571,463,229,441,237,435,545,52,520,36,573,0,573,0,520,36,489,29,573,0,489,29,448,27,573,0,604,118,588,118,573,0,588,118,566,79,573,0,566,79,545,52,279,78,278,54,360,30,360,30,278,54,274,37,360,30,274,37,375,27,375,27,274,37,573,0,375,27,573,0,397,27,397,27,573,0,448,27,279,209,279,182,352,37,279,209,352,37,348,48,279,209,348,48,279,433,279,78,360,30,352,37,279,78,352,37,279,182,217,13,217,0,573,0,217,13,573,0,229,15,62,68,91,34,93,47,62,68,93,47,100,67,62,68,100,67,233,407,138,0,50,47,40,32,138,0,40,32,29,22,138,0,29,22,16,16,138,0,16,16,0,13,138,0,0,13,0,0,122,16,138,0,138,13,235,411,279,433,237,416,200,448,177,463,177,449,118,131,108,166,126,22,126,22,108,166,103,203,126,22,103,203,102,38,102,38,103,203,101,242,83,402,101,242,117,431,221,-44,245,23,217,30,221,-44,217,30,212,-6,212,-6,217,30,191,41,212,-6,191,41,181,0,181,0,191,41,168,56,181,0,168,56,152,9,152,9,168,56,148,76,199,-149,212,-150,200,-125,200,-125,212,-150,209,-125,222,-123,209,-125,212,-150,222,-123,212,-150,242,-147,197,-70,201,-69,212,-6,212,-6,201,-69,205,-69,212,-6,205,-69,210,-69,210,-69,224,-70,212,-6,212,-6,185,-69,191,-72,212,-6,191,-72,194,-71,212,-6,194,-71,197,-70,274,21,249,-9,252,-9,274,21,252,-9,299,-5,274,21,245,23,245,-9,274,21,245,-9,249,-9,245,23,221,-44,235,-8,245,23,235,-8,239,-9,245,23,239, --9,242,-9,245,23,242,-9,245,-9,443,79,430,91,415,47,415,47,430,91,399,65,415,47,399,65,381,23,381,23,399,65,370,45,381,23,370,45,342,5,342,5,370,45,339,32,342,5,339,32,308,24,308,24,274,21,299,-5,308,24,299,-5,342,5,267,445,253,473,225,472,267,445,225,472,211,436,267,445,274,473,253,473,101,242,108,310,117,431,117,431,108,310,130,366,117,431,130,366,142,446,142,446,130,366,165,409,142,446,165,409,169,458,169,458,165,409,211,436,169,458,211,436,196,467,196,467,211,436,225,472,294,471,310,439,315,467,315,467,310,439,349,421,315,467,349,421,336,463,336,463,349,421,356,456,310,439,294,471,274,473,310,439,274,473,267,445,405,459,399,454,405,357,405,357,399,454,392,451,405,357,392,451,384,450,384,450,380,450,381,392,381,392,380,450,375,451,381,392,375,451,369,453,381,392,369,453,363,454,381,392,363,454,356,456,381,392,356,456,349,421,418,315,434,315,427,473,418,315,427,473,413,473,418,315,413,473,410,465,418,315,410,465,405,357,384,450,381,392,405,357,299,-90,297,-74,295,-111,295,-111,297,-74,289,-60,295,-111,289,-60,284,-127,284,-127,289,-60,277,-51,284,-127,277,-51,266,-139,266,-139,277,-51,260,-45,266,-139,260,-45,247,-94,247,-94,260,-45,246,-85,242,-78,246,-85,260,-45,242,-78,260,-45,239,-43,242,-78,239,-43,235,-43,242,-78,235,-43,235,-73,235,-73,235,-43,232,-43,235,-73,232,-43,228,-43,235,-73,228,-43,225,-44,235,-73,225,-44,224,-70,221,-44,212,-6,224,-70,221,-44,224,-70,225,-44,266,-139,247,-94,245,-105,266,-139,245,-105,242,-147,242,-147,245,-105,240,-113,242,-147,240,-113,232,-119,163,-117,165,-143,174,-120,174,-120,165,-143,176,-146,174,-120,176,-146,183,-122,183,-122,176,-146,188,-148,183,-122,188,-148,192,-124,192,-124,188,-148,199,-149,192,-124,199,-149,200,-125,131,101,118,131,126,22,131,101,126,22,152,9,131,101,152,9,148,76,83,402,55,367,60,84,83,402,60,84,81,57,83,402,81,57,102,38,83,402,102,38,101,242,20,230,22,188,24,281,24,281,22,188,30,150,24,281,30,150,36,326,36,326,30,150,43,115,36,326,43,115,55,367,55,367,43,115,60,84,165,-143,163,-117,153,-138,222,-123,242,-147,232, --119,405,459,405,357,410,465,253,530,281,530,180,634,253,530,180,634,173,640,253,530,173,640,167,644,253,530,167,644,161,647,253,530,161,647,156,649,253,530,156,649,150,649,253,530,150,649,145,597,124,627,125,620,125,635,125,635,125,620,128,614,125,635,128,614,129,641,129,641,128,614,132,608,129,641,132,608,134,646,134,646,132,608,138,602,134,646,138,602,141,648,141,648,138,602,145,597,141,648,145,597,150,649,64,34,53,23,386,0,386,0,53,23,36,17,386,0,36,17,9,13,68,411,70,385,148,434,68,411,148,434,63,430,63,430,148,434,155,436,63,430,155,436,380,463,380,463,155,436,165,437,64,34,164,29,68,52,68,52,164,29,151,35,68,52,151,35,70,80,70,80,151,35,143,44,70,80,143,44,70,385,70,385,143,44,141,59,70,385,141,59,141,412,141,258,141,229,246,229,141,258,246,229,246,258,277,259,246,258,277,227,277,259,277,227,298,265,298,265,277,227,298,222,298,265,298,222,311,277,311,277,298,222,311,210,311,277,311,210,320,297,320,297,311,210,320,191,320,297,320,191,326,325,326,325,320,191,326,161,326,325,326,161,341,161,380,463,165,437,257,437,380,463,257,437,298,435,380,463,298,435,327,429,380,463,327,429,346,416,380,463,346,416,357,395,380,463,357,395,365,363,380,463,365,363,382,363,70,385,141,412,141,423,70,385,141,423,144,430,70,385,144,430,148,434,380,463,9,463,35,447,380,463,35,447,53,441,380,463,53,441,63,430,357,53,328,37,386,0,386,0,328,37,289,28,386,0,289,28,237,26,386,0,418,118,398,118,386,0,398,118,379,80,386,0,379,80,357,53,386,0,237,26,212,26,386,0,212,26,184,26,386,0,184,26,164,29,386,0,164,29,64,34,386,0,9,13,9,0,35,447,9,463,9,450,246,258,246,229,277,227,326,325,341,161,341,325,304,649,307,598,312,648,312,648,307,598,315,603,312,648,315,603,319,646,319,646,315,603,321,609,319,646,321,609,324,641,324,641,321,609,325,615,324,641,325,615,327,635,327,635,325,615,327,621,327,635,327,621,328,627,307,598,304,649,298,649,307,598,298,649,292,647,307,598,292,647,287,644,307,598,287,644,281,640,307,598,281,640,274,634,307, -598,274,634,199,530,64,34,53,23,386,0,386,0,53,23,36,17,386,0,36,17,9,13,68,411,70,385,148,434,68,411,148,434,63,430,63,430,148,434,155,436,63,430,155,436,380,463,380,463,155,436,165,437,64,34,164,29,68,52,68,52,164,29,151,35,68,52,151,35,70,80,70,80,151,35,143,44,70,80,143,44,70,385,70,385,143,44,141,59,70,385,141,59,141,412,141,258,141,229,246,229,141,258,246,229,246,258,277,259,246,258,277,227,277,259,277,227,298,265,298,265,277,227,298,222,298,265,298,222,311,277,311,277,298,222,311,210,311,277,311,210,320,297,320,297,311,210,320,191,320,297,320,191,326,325,326,325,320,191,326,161,326,325,326,161,341,161,380,463,165,437,257,437,380,463,257,437,298,435,380,463,298,435,327,429,380,463,327,429,346,416,380,463,346,416,357,395,380,463,357,395,365,363,380,463,365,363,382,363,70,385,141,412,141,423,70,385,141,423,144,430,70,385,144,430,148,434,380,463,9,463,35,447,380,463,35,447,53,441,380,463,53,441,63,430,357,53,328,37,386,0,386,0,328,37,289,28,386,0,289,28,237,26,386,0,418,118,398,118,386,0,398,118,379,80,386,0,379,80,357,53,386,0,237,26,212,26,386,0,212,26,184,26,386,0,184,26,164,29,386,0,164,29,64,34,386,0,9,13,9,0,35,447,9,463,9,450,246,258,246,229,277,227,326,325,341,161,341,325,199,530,274,634,172,530,120,530,145,530,207,647,207,647,145,530,229,602,207,647,229,602,251,647,251,647,229,602,314,530,251,647,314,530,338,530,64,34,53,23,386,0,386,0,53,23,36,17,386,0,36,17,9,13,68,411,70,385,148,434,68,411,148,434,63,430,63,430,148,434,155,436,63,430,155,436,380,463,380,463,155,436,165,437,64,34,164,29,68,52,68,52,164,29,151,35,68,52,151,35,70,80,70,80,151,35,143,44,70,80,143,44,70,385,70,385,143,44,141,59,70,385,141,59,141,412,141,258,141,229,246,229,141,258,246,229,246,258,277,259,246,258,277,227,277,259,277,227,298,265,298,265,277,227,298,222,298,265,298,222,311,277,311,277,298,222,311,210,311,277,311,210,320,297,320,297,311,210,320,191,320,297,320, -191,326,325,326,325,320,191,326,161,326,325,326,161,341,161,380,463,165,437,257,437,380,463,257,437,298,435,380,463,298,435,327,429,380,463,327,429,346,416,380,463,346,416,357,395,380,463,357,395,365,363,380,463,365,363,382,363,70,385,141,412,141,423,70,385,141,423,144,430,70,385,144,430,148,434,380,463,9,463,35,447,380,463,35,447,53,441,380,463,53,441,63,430,357,53,328,37,386,0,386,0,328,37,289,28,386,0,289,28,237,26,386,0,418,118,398,118,386,0,398,118,379,80,386,0,379,80,357,53,386,0,237,26,212,26,386,0,212,26,184,26,386,0,184,26,164,29,386,0,164,29,64,34,386,0,9,13,9,0,35,447,9,463,9,450,246,258,246,229,277,227,326,325,341,161,341,325,158,610,158,541,169,608,169,608,158,541,169,543,169,608,169,543,179,603,179,603,169,543,179,548,179,603,179,548,186,596,186,596,179,548,186,555,186,596,186,555,191,587,191,587,186,555,191,565,191,587,191,565,193,576,124,576,126,565,126,587,126,587,126,565,130,555,126,587,130,555,131,596,131,596,130,555,138,548,131,596,138,548,138,604,138,604,138,548,147,543,138,604,147,543,147,608,147,608,147,543,158,541,147,608,158,541,158,610,64,34,53,23,386,0,386,0,53,23,36,17,386,0,36,17,9,13,68,411,70,385,148,434,68,411,148,434,63,430,63,430,148,434,155,436,63,430,155,436,380,463,380,463,155,436,165,437,263,576,265,565,265,587,265,587,265,565,270,555,265,587,270,555,270,596,270,596,270,555,277,548,270,596,277,548,277,604,277,604,277,548,286,543,277,604,286,543,287,608,287,608,286,543,297,541,287,608,297,541,298,610,298,610,297,541,308,543,298,610,308,543,309,608,309,608,308,543,318,548,309,608,318,548,318,603,318,603,318,548,326,555,318,603,326,555,326,596,326,596,326,555,331,565,326,596,331,565,331,587,331,587,331,565,333,576,64,34,164,29,68,52,68,52,164,29,151,35,68,52,151,35,70,80,70,80,151,35,143,44,70,80,143,44,70,385,70,385,143,44,141,59,70,385,141,59,141,412,141,258,141,229,246,229,141,258,246,229,246,258,277,259,246,258,277,227,277,259,277,227,298,265,298,265,277,227,298, -222,298,265,298,222,311,277,311,277,298,222,311,210,311,277,311,210,320,297,320,297,311,210,320,191,320,297,320,191,326,325,326,325,320,191,326,161,326,325,326,161,341,161,380,463,165,437,257,437,380,463,257,437,298,435,380,463,298,435,327,429,380,463,327,429,346,416,380,463,346,416,357,395,380,463,357,395,365,363,380,463,365,363,382,363,70,385,141,412,141,423,70,385,141,423,144,430,70,385,144,430,148,434,380,463,9,463,35,447,380,463,35,447,53,441,380,463,53,441,63,430,357,53,328,37,386,0,386,0,328,37,289,28,386,0,289,28,237,26,386,0,418,118,398,118,386,0,398,118,379,80,386,0,379,80,357,53,386,0,237,26,212,26,386,0,212,26,184,26,386,0,184,26,164,29,386,0,164,29,64,34,386,0,9,13,9,0,35,447,9,463,9,450,246,258,246,229,277,227,326,325,341,161,341,325,160,530,188,530,87,634,160,530,87,634,80,640,160,530,80,640,74,644,160,530,74,644,68,647,160,530,68,647,63,649,160,530,63,649,57,649,160,530,57,649,52,597,31,627,32,620,32,635,32,635,32,620,35,614,32,635,35,614,36,641,36,641,35,614,39,608,36,641,39,608,41,646,41,646,39,608,45,602,41,646,45,602,48,648,48,648,45,602,52,597,48,648,52,597,57,649,73,32,62,21,220,0,220,0,62,21,42,16,220,0,42,16,13,13,13,13,42,16,12,13,220,463,13,463,42,447,220,463,42,447,62,442,220,463,62,442,74,431,220,463,74,431,79,413,220,463,79,413,171,442,220,463,171,442,191,448,220,463,191,448,220,450,171,22,159,33,80,78,80,78,159,33,153,52,80,78,153,52,80,386,80,386,153,52,152,78,80,386,152,78,152,386,80,386,152,386,153,413,80,386,153,413,159,431,80,386,159,431,171,442,80,386,171,442,79,413,220,0,220,13,191,16,220,0,191,16,171,22,220,0,171,22,79,51,220,0,79,51,73,32,220,0,13,13,13,0,79,51,171,22,80,78,42,447,13,463,13,450,177,649,180,598,186,648,186,648,180,598,188,603,186,648,188,603,192,646,192,646,188,603,194,609,192,646,194,609,197,641,197,641,194,609,198,615,197,641,198,615,200,635,200,635,198,615,201,621,200, -635,201,621,202,627,180,598,177,649,171,649,180,598,171,649,166,647,180,598,166,647,160,644,180,598,160,644,154,640,180,598,154,640,148,634,180,598,148,634,73,530,73,32,62,21,220,0,220,0,62,21,42,16,220,0,42,16,13,13,13,13,42,16,12,13,220,463,13,463,42,447,220,463,42,447,62,442,220,463,62,442,74,431,220,463,74,431,79,413,220,463,79,413,171,442,220,463,171,442,191,448,220,463,191,448,220,450,171,22,159,33,80,78,80,78,159,33,153,52,80,78,153,52,80,386,80,386,153,52,152,78,80,386,152,78,152,386,80,386,152,386,153,413,80,386,153,413,159,431,80,386,159,431,171,442,80,386,171,442,79,413,220,0,220,13,191,16,220,0,191,16,171,22,220,0,171,22,79,51,220,0,79,51,73,32,220,0,13,13,13,0,79,51,171,22,80,78,42,447,13,463,13,450,73,530,148,634,45,530,7,530,30,530,94,647,94,647,30,530,116,602,94,647,116,602,138,647,138,647,116,602,201,530,138,647,201,530,225,530,68,32,56,21,215,0,215,0,56,21,37,16,215,0,37,16,7,13,215,463,7,463,37,447,215,463,37,447,57,442,215,463,57,442,68,431,215,463,68,431,74,413,215,463,74,413,165,442,215,463,165,442,185,448,215,463,185,448,215,450,166,22,154,33,75,78,75,78,154,33,148,52,75,78,148,52,75,386,75,386,148,52,146,78,75,386,146,78,146,386,75,386,146,386,148,413,75,386,148,413,153,431,75,386,153,431,165,442,75,386,165,442,74,413,215,0,215,13,186,16,215,0,186,16,166,22,215,0,166,22,74,51,215,0,74,51,68,32,215,0,7,13,7,0,74,51,166,22,75,78,37,447,7,463,7,450,12,576,13,565,13,587,13,587,13,565,18,555,13,587,18,555,18,596,18,596,18,555,25,548,18,596,25,548,26,604,26,604,25,548,35,543,26,604,35,543,35,608,35,608,35,543,45,541,35,608,45,541,46,610,46,610,45,541,57,543,46,610,57,543,57,608,57,608,57,543,66,548,57,608,66,548,67,603,67,603,66,548,74,555,67,603,74,555,74,596,74,596,74,555,79,565,74,596,79,565,79,587,79,587,79,565,81,576,73,32,61,21,220,0,220,0,61, -21,41,16,220,0,41,16,12,13,220,463,12,463,42,447,220,463,42,447,61,442,220,463,61,442,73,431,220,463,73,431,78,413,220,463,78,413,170,442,220,463,170,442,190,448,220,463,190,448,220,450,171,22,159,33,80,78,80,78,159,33,153,52,80,78,153,52,80,386,80,386,153,52,152,78,80,386,152,78,152,386,80,386,152,386,153,413,80,386,153,413,159,431,80,386,159,431,170,442,80,386,170,442,78,413,185,610,185,541,196,608,196,608,185,541,196,543,196,608,196,543,206,603,206,603,196,543,206,548,206,603,206,548,214,596,214,596,206,548,214,555,214,596,214,555,219,587,219,587,214,555,219,565,219,587,219,565,220,576,152,576,153,565,153,587,153,587,153,565,158,555,153,587,158,555,158,596,158,596,158,555,165,548,158,596,165,548,165,604,165,604,165,548,174,543,165,604,174,543,174,608,174,608,174,543,185,541,174,608,185,541,185,610,220,0,220,13,191,16,220,0,191,16,171,22,220,0,171,22,78,51,220,0,78,51,73,32,220,0,12,13,12,0,78,51,171,22,80,78,42,447,12,463,12,450,66,33,56,23,210,0,210,0,56,23,38,16,210,0,38,16,11,13,57,441,67,430,200,463,200,463,67,430,72,413,200,463,72,413,73,387,146,43,73,387,73,252,146,43,73,252,73,220,73,220,73,252,15,252,73,220,15,252,15,220,145,421,149,429,73,387,73,387,149,429,155,434,73,387,155,434,200,463,200,463,155,434,164,437,200,463,164,437,178,438,178,438,164,437,178,437,178,438,178,437,213,436,178,438,213,436,200,463,200,463,213,436,297,453,245,30,256,3,272,36,272,36,256,3,299,10,272,36,299,10,296,44,296,44,299,10,318,55,348,77,318,55,338,22,348,77,338,22,373,38,180,26,210,0,214,27,214,27,210,0,256,3,214,27,256,3,245,30,245,432,272,426,297,453,297,453,272,426,297,416,297,453,297,416,318,404,318,404,348,379,374,424,374,424,348,379,372,348,374,424,372,348,389,313,467,313,432,377,451,116,467,313,451,116,467,153,467,313,467,153,476,192,467,313,476,192,480,234,451,116,432,377,429,84,429,84,432,377,403,229,402,57,403,229,400,182,402,57,400,182,389,141,374,424,389,313,432, -377,432,377,389,313,400,273,432,377,400,273,403,229,374,424,297,453,318,404,373,38,402,57,389,141,373,38,389,141,372,106,373,38,372,106,348,77,318,55,299,10,338,22,73,387,146,43,145,55,145,252,145,220,246,220,145,252,246,220,246,252,145,410,145,421,73,387,145,410,73,387,145,55,200,463,11,463,39,447,200,463,39,447,57,441,73,77,71,51,155,29,155,29,71,51,210,0,155,29,210,0,166,27,166,27,210,0,180,26,73,77,155,29,149,35,73,77,149,35,146,43,73,77,146,43,73,220,210,0,11,13,11,0,66,33,210,0,71,51,39,447,11,463,11,450,403,229,402,57,429,84,297,453,213,436,245,432,157,559,163,568,165,606,165,606,163,568,170,574,165,606,170,574,182,615,182,615,170,574,179,578,182,615,179,578,188,580,188,580,193,579,202,618,202,618,193,579,198,578,202,618,198,578,204,577,152,548,157,559,165,606,152,548,165,606,151,592,152,548,151,592,139,572,152,548,139,572,131,548,202,618,204,577,212,617,212,617,204,577,210,574,212,617,210,574,216,572,216,572,232,564,221,616,221,616,232,564,231,614,202,618,182,615,188,580,221,616,212,617,216,572,231,614,232,564,241,610,241,610,232,564,247,557,241,610,247,557,252,605,252,605,247,557,260,552,252,605,260,552,268,597,268,597,260,552,270,549,268,597,270,549,276,593,276,593,270,549,279,548,276,593,279,548,284,590,284,590,279,548,289,548,284,590,289,548,291,588,291,588,289,548,310,550,291,588,310,550,299,587,299,587,310,550,305,587,314,588,305,587,310,550,314,588,310,550,327,558,342,622,335,608,341,573,342,622,341,573,353,594,342,622,353,594,363,622,329,598,322,591,327,558,329,598,327,558,341,573,329,598,341,573,335,608,69,42,57,27,172,0,172,0,57,27,38,18,172,0,38,18,9,13,359,446,369,443,495,463,495,463,369,443,377,439,495,463,377,439,384,432,384,432,390,424,495,463,495,463,390,424,393,413,495,463,393,413,454,442,454,442,393,413,448,438,454,442,448,438,448,437,448,437,448,438,441,430,441,430,448,438,397,383,441,430,397,383,398,363,416,-7,398,363,398,125,416,-7,398,125,127,463,495,463,454,442,461,445,495,463,461,445,470,447,495, -463,470,447,480,449,495,463,480,449,495,450,428,-7,428,355,416,-7,416,-7,428,355,429,383,416,-7,429,383,398,363,398,363,429,383,431,404,398,363,431,404,436,419,396,400,397,383,448,438,396,400,448,438,393,413,346,448,359,446,495,463,346,448,495,463,329,463,346,448,329,463,329,450,127,463,9,463,27,449,127,463,27,449,41,445,127,463,41,445,52,438,127,463,52,438,64,428,127,463,64,428,77,413,127,463,77,413,107,377,127,463,107,377,416,-7,77,413,109,68,107,105,75,67,69,42,126,28,126,28,69,42,172,0,126,28,172,0,144,19,144,19,172,0,172,13,77,105,75,67,114,44,77,105,114,44,109,68,77,105,109,68,77,413,172,0,9,13,9,0,75,67,126,28,114,44,27,449,9,463,9,450,107,377,77,413,107,105,441,430,398,363,436,419,314,588,327,558,322,591,287,530,315,530,213,634,287,530,213,634,207,640,287,530,207,640,201,644,287,530,201,644,195,647,287,530,195,647,189,649,287,530,189,649,184,649,287,530,184,649,179,597,158,627,159,620,159,635,159,635,159,620,161,614,159,635,161,614,162,641,162,641,161,614,166,608,162,641,166,608,168,646,168,646,166,608,172,602,168,646,172,602,175,648,175,648,172,602,179,597,175,648,179,597,184,649,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,135,376,152,401,176,462,135,376,176,462,113,430,114,142,113,34,126,105,126,105,113,34,177,1,126,105,177,1,144,73,144,73,177,1,166,47,182,35,166,47,177,1,182,35,177,1,252,-9,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,65,379,65,85,113,430,65,85,104,232,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,114,142,106,185,113,34,113,34,106,185,104,232,34,152,65,85,65,379,34,152,65,379,34,313,34,152,34,313,23,234,312,27,293,21,328,1,328,1,293,21,274,17,328,1,274,17,253,16,253,16,234,17,252,-9,252,-9,234,17,216,20,252,-9,216,20,198,26,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360, -391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,329,462,252,473,252,448,392,144,381,107,391,33,391,33,381,107,364,75,391,33,364,75,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,236,399,282,402,236,440,377,399,282,440,377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,439,84,402,236,399,188,439,84,399,188,392,144,439,84,392,144,391,33,253,16,252,-9,328,1,113,34,104,232,65,85,312,27,328,1,328,37,182,35,252,-9,198,26,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,135,376,152,401,176,462,135,376,176,462,113,430,114,142,113,34,126,105,126,105,113,34,177,1,126,105,177,1,144,73,144,73,177,1,166,47,182,35,166,47,177,1,182,35,177,1,252,-9,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,65,379,65,85,113,430,65,85,104,232,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,114,142,106,185,113,34,113,34,106,185,104,232,34,152,65,85,65,379,34,152,65,379,34,313,34,152,34,313,23,234,312,27,293,21,328,1,328,1,293,21,274,17,328,1,274,17,253,16,253,16,234,17,252,-9,252,-9,234,17,216,20,252,-9,216,20,198,26,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360,391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,329,462,252,473,252,448,392,144,381,107,391,33,391,33,381,107,364,75,391,33,364,75,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,236,399,282,402,236,440,377,399,282,440,377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,439,84,402,236,399,188,439,84,399,188,392,144,439,84,392,144,391,33,253,16,252,-9,328,1,313,649,317,598,322,648,322,648,317,598,325,603,322,648,325,603,329,646,329,646,325,603,331,609,329,646,331,609,334, -641,334,641,331,609,335,615,334,641,335,615,337,635,337,635,335,615,337,621,337,635,337,621,338,627,317,598,313,649,308,649,317,598,308,649,302,647,317,598,302,647,297,644,317,598,297,644,291,640,317,598,291,640,284,634,317,598,284,634,209,530,113,34,104,232,65,85,209,530,284,634,181,530,312,27,328,1,328,37,182,35,252,-9,198,26,139,530,163,530,226,647,226,647,163,530,248,602,226,647,248,602,270,647,270,647,248,602,333,530,270,647,333,530,357,530,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,135,376,152,401,176,462,135,376,176,462,113,430,114,142,113,34,126,105,126,105,113,34,177,1,126,105,177,1,144,73,144,73,177,1,166,47,182,35,166,47,177,1,182,35,177,1,252,-9,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,65,379,65,85,113,430,65,85,104,232,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,114,142,106,185,113,34,113,34,106,185,104,232,34,152,65,85,65,379,34,152,65,379,34,313,34,152,34,313,23,234,312,27,293,21,328,1,328,1,293,21,274,17,328,1,274,17,253,16,253,16,234,17,252,-9,252,-9,234,17,216,20,252,-9,216,20,198,26,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360,391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,329,462,252,473,252,448,392,144,381,107,391,33,391,33,381,107,364,75,391,33,364,75,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,236,399,282,402,236,440,377,399,282,440,377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,439,84,402,236,399,188,439,84,399,188,392,144,439,84,392,144,391,33,253,16,252,-9,328,1,113,34,104,232,65,85,312,27,328,1,328,37,182,35,252,-9,198,26,157,559,163,568,165,606,165,606,163,568,170,574,165,606,170,574,182,615,182,615,170,574,179,578,182,615,179,578,188,580,188,580,193,579,202,618,202, -618,193,579,198,578,202,618,198,578,204,577,152,548,157,559,165,606,152,548,165,606,151,592,152,548,151,592,139,572,152,548,139,572,131,548,202,618,204,577,212,617,212,617,204,577,210,574,212,617,210,574,216,572,216,572,232,564,221,616,221,616,232,564,231,614,202,618,182,615,188,580,221,616,212,617,216,572,231,614,232,564,241,610,241,610,232,564,247,557,241,610,247,557,252,605,252,605,247,557,260,552,252,605,260,552,268,597,268,597,260,552,270,549,268,597,270,549,276,593,276,593,270,549,279,548,276,593,279,548,284,590,284,590,279,548,289,548,284,590,289,548,291,588,291,588,289,548,310,550,291,588,310,550,299,587,299,587,310,550,305,587,314,588,305,587,310,550,314,588,310,550,327,558,342,622,335,608,341,573,342,622,341,573,353,594,342,622,353,594,363,622,329,598,322,591,327,558,329,598,327,558,341,573,329,598,341,573,335,608,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,135,376,152,401,176,462,135,376,176,462,113,430,114,142,113,34,126,105,126,105,113,34,177,1,126,105,177,1,144,73,144,73,177,1,166,47,182,35,166,47,177,1,182,35,177,1,252,-9,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,65,379,65,85,113,430,65,85,104,232,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,114,142,106,185,113,34,113,34,106,185,104,232,34,152,65,85,65,379,34,152,65,379,34,313,34,152,34,313,23,234,312,27,293,21,328,1,328,1,293,21,274,17,328,1,274,17,253,16,253,16,234,17,252,-9,252,-9,234,17,216,20,252,-9,216,20,198,26,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360,391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,329,462,252,473,252,448,392,144,381,107,391,33,391,33,381,107,364,75,391,33,364,75,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,236,399,282,402,236,440,377,399,282,440, -377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,439,84,402,236,399,188,439,84,399,188,392,144,439,84,392,144,391,33,253,16,252,-9,328,1,113,34,104,232,65,85,312,27,328,1,328,37,182,35,252,-9,198,26,314,588,327,558,322,591,144,576,145,565,145,587,145,587,145,565,150,555,145,587,150,555,150,596,150,596,150,555,157,548,150,596,157,548,158,604,158,604,157,548,166,543,158,604,166,543,167,608,167,608,166,543,177,541,167,608,177,541,178,610,178,610,177,541,189,543,178,610,189,543,189,608,189,608,189,543,198,548,189,608,198,548,198,603,198,603,198,548,206,555,198,603,206,555,206,596,206,596,206,555,211,565,206,596,211,565,211,587,211,587,211,565,212,576,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,135,376,152,401,176,462,135,376,176,462,113,430,114,142,113,34,126,105,126,105,113,34,177,1,126,105,177,1,144,73,144,73,177,1,166,47,182,35,166,47,177,1,182,35,177,1,252,-9,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,65,379,65,85,113,430,65,85,104,232,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,114,142,106,185,113,34,113,34,106,185,104,232,34,152,65,85,65,379,34,152,65,379,34,313,34,152,34,313,23,234,312,27,293,21,328,1,328,1,293,21,274,17,328,1,274,17,253,16,253,16,234,17,252,-9,252,-9,234,17,216,20,252,-9,216,20,198,26,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360,391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,329,462,252,473,252,448,392,144,381,107,391,33,391,33,381,107,364,75,391,33,364,75,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,236,399,282,402,236,440,377,399,282,440,377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,439,84,402,236,399,188,439,84,399,188,392,144,439,84,392,144,391,33,253,16,252,-9,328, -1,283,576,285,565,285,587,285,587,285,565,289,555,285,587,289,555,290,596,290,596,289,555,296,548,290,596,296,548,297,604,297,604,296,548,306,543,297,604,306,543,306,608,306,608,306,543,316,541,306,608,316,541,317,610,317,610,316,541,328,543,317,610,328,543,328,608,328,608,328,543,337,548,328,608,337,548,338,603,338,603,337,548,345,555,338,603,345,555,345,596,345,596,345,555,350,565,345,596,350,565,350,587,350,587,350,565,352,576,113,34,104,232,65,85,312,27,328,1,328,37,182,35,252,-9,198,26,257,177,418,339,386,370,257,177,386,370,224,209,257,177,224,209,386,-16,257,177,386,-16,418,16,30,15,63,-16,191,177,191,177,63,-16,224,144,191,177,224,144,224,209,224,209,224,144,386,-16,63,370,30,338,191,177,63,370,191,177,224,209,67,83,77,70,114,429,114,429,77,70,89,57,114,429,89,57,104,231,104,231,105,41,105,197,105,197,105,41,108,166,395,158,376,98,391,34,391,34,376,98,345,53,391,34,345,53,328,1,328,1,345,53,304,25,328,1,304,25,252,16,252,16,229,17,252,-9,252,-9,229,17,225,-8,123,113,129,25,136,86,136,86,129,25,154,11,136,86,154,11,153,62,153,62,154,11,171,44,171,44,154,11,177,1,171,44,177,1,190,31,190,31,177,1,201,-4,190,31,201,-4,209,22,209,22,201,-4,225,-8,209,22,225,-8,229,17,129,25,123,113,114,139,129,25,114,139,108,166,129,25,108,166,105,41,129,25,105,41,73,-55,105,41,39,-55,73,-55,153,62,369,378,352,402,352,402,376,439,350,452,352,402,350,452,333,419,333,419,350,452,327,462,333,419,327,462,315,432,315,432,327,462,303,469,315,432,303,469,295,441,295,441,303,469,279,472,295,441,279,472,275,446,275,446,279,472,253,473,275,446,253,473,252,448,480,258,476,284,481,232,481,232,476,284,470,308,481,232,470,308,470,152,470,152,470,308,463,332,470,152,463,332,455,353,446,368,438,381,440,85,446,368,440,85,470,152,446,368,470,152,455,353,391,34,440,85,395,158,395,158,440,85,402,231,415,407,402,231,440,85,415,407,440,85,428,394,428,394,440,85,438,381,252,16,252,-9,328,1,369,378,381,351,376,439,376,439,381,351,399,423,376, -439,399,423,427,514,427,514,399,423,461,514,399,423,381,351,391,325,399,423,391,325,397,297,399,423,397,297,400,266,399,423,400,266,415,407,352,402,136,86,153,62,130,365,161,410,177,462,177,462,161,410,202,438,177,462,202,438,253,473,253,473,202,438,252,448,114,429,104,231,111,305,114,429,111,305,130,365,114,429,130,365,177,462,65,378,34,311,41,132,65,378,41,132,51,111,65,378,51,111,58,96,65,378,58,96,67,83,65,378,67,83,114,429,34,311,23,231,25,205,34,311,25,205,28,180,34,311,28,180,34,155,34,311,34,155,41,132,415,407,400,266,402,231,376,439,352,402,369,378,105,41,104,231,89,57,289,530,317,530,216,634,289,530,216,634,209,640,289,530,209,640,203,644,289,530,203,644,197,647,289,530,197,647,191,649,289,530,191,649,185,649,289,530,185,649,181,597,160,627,161,620,161,635,161,635,161,620,164,614,161,635,164,614,165,641,165,641,164,614,168,608,165,641,168,608,170,646,170,646,168,608,174,602,170,646,174,602,177,648,177,648,174,602,181,597,177,648,181,597,185,649,147,110,148,11,152,88,152,88,148,11,169,2,152,88,169,2,161,69,161,69,169,2,175,52,188,42,175,52,193,-4,188,42,193,-4,204,33,204,33,193,-4,219,-8,204,33,219,-8,222,26,222,26,219,-8,248,-9,222,26,248,-9,242,22,242,22,248,-9,265,21,291,23,265,21,285,-7,291,23,285,-7,318,-1,145,166,145,384,130,23,145,166,130,23,145,135,145,135,130,23,148,11,145,135,148,11,147,110,175,52,169,2,193,-4,396,144,394,119,405,63,405,63,394,119,390,98,405,63,390,98,390,41,390,41,390,98,382,80,390,41,382,80,371,63,371,62,371,63,356,48,371,62,356,48,370,23,370,23,356,48,346,9,337,37,315,28,318,-1,337,37,318,-1,346,9,337,37,346,9,356,48,494,463,331,463,360,446,494,463,360,446,379,437,494,463,379,437,390,421,494,463,390,421,445,435,494,463,445,435,464,445,494,463,464,445,494,450,427,361,429,395,416,87,427,361,416,87,423,114,427,361,423,114,426,145,427,361,426,145,427,183,405,63,416,87,429,395,405,63,429,395,397,359,405,63,397,359,397,175,405,63,397,175,396,144,434,419,445, -435,395,396,434,419,395,396,397,359,434,419,397,359,429,395,371,62,370,23,390,41,371,62,390,41,371,63,265,21,248,-9,285,-7,180,446,208,450,208,463,180,446,208,463,161,440,161,440,208,463,71,415,161,440,71,415,73,391,75,133,73,391,73,174,81,97,93,67,146,411,146,411,93,67,109,42,146,411,109,42,145,384,145,384,109,42,130,23,146,411,151,429,73,391,146,411,73,391,75,133,146,411,75,133,81,97,208,463,10,463,38,447,208,463,38,447,56,441,208,463,56,441,66,431,208,463,66,431,71,415,38,447,10,463,10,450,161,440,73,391,151,429,360,446,331,463,331,450,445,435,390,421,395,396,291,23,318,-1,315,28,147,110,148,11,152,88,152,88,148,11,169,2,152,88,169,2,161,69,161,69,169,2,175,52,188,42,175,52,193,-4,188,42,193,-4,204,33,204,33,193,-4,219,-8,204,33,219,-8,222,26,222,26,219,-8,248,-9,222,26,248,-9,242,22,242,22,248,-9,265,21,291,23,265,21,285,-7,291,23,285,-7,318,-1,145,166,145,384,130,23,145,166,130,23,145,135,145,135,130,23,148,11,145,135,148,11,147,110,175,52,169,2,193,-4,317,649,320,598,326,648,326,648,320,598,328,603,326,648,328,603,332,646,332,646,328,603,334,609,332,646,334,609,337,641,337,641,334,609,338,615,337,641,338,615,340,635,340,635,338,615,341,621,340,635,341,621,341,627,320,598,317,649,311,649,320,598,311,649,306,647,320,598,306,647,300,644,320,598,300,644,294,640,320,598,294,640,288,634,320,598,288,634,213,530,396,144,394,119,405,63,405,63,394,119,390,98,405,63,390,98,390,41,390,41,390,98,382,80,390,41,382,80,371,63,371,62,371,63,356,48,371,62,356,48,370,23,370,23,356,48,346,9,337,37,315,28,318,-1,337,37,318,-1,346,9,337,37,346,9,356,48,494,463,331,463,360,446,494,463,360,446,379,437,494,463,379,437,390,421,494,463,390,421,445,435,494,463,445,435,464,445,494,463,464,445,494,450,427,361,429,395,416,87,427,361,416,87,423,114,427,361,423,114,426,145,427,361,426,145,427,183,405,63,416,87,429,395,405,63,429,395,397,359,405,63,397,359,397,175,405,63,397,175,396,144,434,419,445,435,395, -396,434,419,395,396,397,359,434,419,397,359,429,395,371,62,370,23,390,41,371,62,390,41,371,63,265,21,248,-9,285,-7,180,446,208,450,208,463,180,446,208,463,161,440,161,440,208,463,71,415,161,440,71,415,73,391,75,133,73,391,73,174,81,97,93,67,146,411,146,411,93,67,109,42,146,411,109,42,145,384,145,384,109,42,130,23,146,411,151,429,73,391,146,411,73,391,75,133,146,411,75,133,81,97,208,463,10,463,38,447,208,463,38,447,56,441,208,463,56,441,66,431,208,463,66,431,71,415,38,447,10,463,10,450,161,440,73,391,151,429,360,446,331,463,331,450,445,435,390,421,395,396,291,23,318,-1,315,28,213,530,288,634,185,530,140,530,164,530,227,647,227,647,164,530,248,602,227,647,248,602,270,647,270,647,248,602,334,530,270,647,334,530,358,530,147,110,148,11,152,88,152,88,148,11,169,2,152,88,169,2,161,69,161,69,169,2,175,52,188,42,175,52,193,-4,188,42,193,-4,204,33,204,33,193,-4,219,-8,204,33,219,-8,222,26,222,26,219,-8,248,-9,222,26,248,-9,242,22,242,22,248,-9,265,21,291,23,265,21,285,-7,291,23,285,-7,318,-1,145,166,145,384,130,23,145,166,130,23,145,135,145,135,130,23,148,11,145,135,148,11,147,110,175,52,169,2,193,-4,396,144,394,119,405,63,405,63,394,119,390,98,405,63,390,98,390,41,390,41,390,98,382,80,390,41,382,80,371,63,371,62,371,63,356,48,371,62,356,48,370,23,370,23,356,48,346,9,337,37,315,28,318,-1,337,37,318,-1,346,9,337,37,346,9,356,48,494,463,331,463,360,446,494,463,360,446,379,437,494,463,379,437,390,421,494,463,390,421,445,435,494,463,445,435,464,445,494,463,464,445,494,450,427,361,429,395,416,87,427,361,416,87,423,114,427,361,423,114,426,145,427,361,426,145,427,183,405,63,416,87,429,395,405,63,429,395,397,359,405,63,397,359,397,175,405,63,397,175,396,144,434,419,445,435,395,396,434,419,395,396,397,359,434,419,397,359,429,395,371,62,370,23,390,41,371,62,390,41,371,63,265,21,248,-9,285,-7,180,446,208,450,208,463,180,446,208,463,161,440,161,440,208,463,71,415,161,440,71,415,73,391,75, -133,73,391,73,174,81,97,93,67,146,411,146,411,93,67,109,42,146,411,109,42,145,384,145,384,109,42,130,23,146,411,151,429,73,391,146,411,73,391,75,133,146,411,75,133,81,97,208,463,10,463,38,447,208,463,38,447,56,441,208,463,56,441,66,431,208,463,66,431,71,415,38,447,10,463,10,450,161,440,73,391,151,429,360,446,331,463,331,450,445,435,390,421,395,396,291,23,318,-1,315,28,283,576,285,565,285,587,285,587,285,565,289,555,285,587,289,555,290,596,290,596,289,555,296,548,290,596,296,548,297,604,297,604,296,548,306,543,297,604,306,543,306,608,306,608,306,543,316,541,306,608,316,541,317,610,317,610,316,541,328,543,317,610,328,543,328,608,328,608,328,543,337,548,328,608,337,548,338,603,338,603,337,548,345,555,338,603,345,555,345,596,345,596,345,555,350,565,345,596,350,565,350,587,350,587,350,565,352,576,144,576,145,565,145,587,145,587,145,565,150,555,145,587,150,555,150,596,150,596,150,555,157,548,150,596,157,548,158,604,158,604,157,548,166,543,158,604,166,543,167,608,167,608,166,543,177,541,167,608,177,541,178,610,178,610,177,541,189,543,178,610,189,543,189,608,189,608,189,543,198,548,189,608,198,548,198,603,198,603,198,548,206,555,198,603,206,555,206,596,206,596,206,555,211,565,206,596,211,565,211,587,211,587,211,565,212,576,147,110,148,11,152,88,152,88,148,11,169,2,152,88,169,2,161,69,161,69,169,2,175,52,188,42,175,52,193,-4,188,42,193,-4,204,33,204,33,193,-4,219,-8,204,33,219,-8,222,26,222,26,219,-8,248,-9,222,26,248,-9,242,22,242,22,248,-9,265,21,291,23,265,21,285,-7,291,23,285,-7,318,-1,145,166,145,384,130,23,145,166,130,23,145,135,145,135,130,23,148,11,145,135,148,11,147,110,175,52,169,2,193,-4,396,144,394,119,405,63,405,63,394,119,390,98,405,63,390,98,390,41,390,41,390,98,382,80,390,41,382,80,371,63,371,62,371,63,356,48,371,62,356,48,370,23,370,23,356,48,346,9,337,37,315,28,318,-1,337,37,318,-1,346,9,337,37,346,9,356,48,494,463,331,463,360,446,494,463,360,446,379,437,494,463,379,437,390,421,494,463,390, -421,445,435,494,463,445,435,464,445,494,463,464,445,494,450,427,361,429,395,416,87,427,361,416,87,423,114,427,361,423,114,426,145,427,361,426,145,427,183,405,63,416,87,429,395,405,63,429,395,397,359,405,63,397,359,397,175,405,63,397,175,396,144,434,419,445,435,395,396,434,419,395,396,397,359,434,419,397,359,429,395,371,62,370,23,390,41,371,62,390,41,371,63,265,21,248,-9,285,-7,180,446,208,450,208,463,180,446,208,463,161,440,161,440,208,463,71,415,161,440,71,415,73,391,75,133,73,391,73,174,81,97,93,67,146,411,146,411,93,67,109,42,146,411,109,42,145,384,145,384,109,42,130,23,146,411,151,429,73,391,146,411,73,391,75,133,146,411,75,133,81,97,208,463,10,463,38,447,208,463,38,447,56,441,208,463,56,441,66,431,208,463,66,431,71,415,38,447,10,463,10,450,161,440,73,391,151,429,360,446,331,463,331,450,445,435,390,421,395,396,291,23,318,-1,315,28,169,405,166,412,220,205,220,205,166,412,163,419,220,205,163,419,129,340,129,340,163,419,161,425,129,340,161,425,161,431,161,431,162,437,129,340,211,463,16,463,34,447,211,463,34,447,51,438,211,463,51,438,71,419,211,463,71,419,173,446,211,463,173,446,182,448,211,463,182,448,194,449,211,463,194,449,211,450,173,446,71,419,166,442,166,442,71,419,95,387,166,442,95,387,162,437,162,437,95,387,129,340,292,77,292,212,276,244,292,77,276,244,294,50,294,50,276,244,220,205,294,50,220,205,301,32,301,32,220,205,220,86,301,32,220,86,313,22,313,22,220,86,219,55,313,22,219,55,364,0,364,0,219,55,213,34,364,0,213,34,201,23,385,417,383,412,395,372,395,372,383,412,381,405,395,372,381,405,377,399,377,399,276,244,292,212,492,463,340,463,359,449,492,463,359,449,372,446,492,463,372,446,381,442,492,463,381,442,385,436,492,463,385,436,387,428,492,463,387,428,451,438,492,463,451,438,470,446,492,463,470,446,492,450,387,428,395,372,416,403,387,428,416,403,434,424,387,428,434,424,451,438,395,372,387,428,386,423,395,372,386,423,385,417,377,399,292,212,395,372,319,649,322,598,327,648,327,648,322,598,329,603,327,648,329,603,334, -646,334,646,329,603,335,609,334,646,335,609,339,641,339,641,335,609,340,615,339,641,340,615,342,635,342,635,340,615,342,621,342,635,342,621,343,627,322,598,319,649,313,649,322,598,313,649,307,647,322,598,307,647,302,644,322,598,302,644,296,640,322,598,296,640,289,634,322,598,289,634,214,530,334,16,313,22,364,0,334,16,364,0,364,13,181,16,150,13,364,0,181,16,364,0,201,23,173,398,169,405,220,205,173,398,220,205,276,244,364,0,150,13,150,0,214,530,289,634,186,530,359,449,340,463,340,450,34,447,16,463,16,450,70,387,143,50,70,387,70,387,143,50,141,77,70,387,141,77,141,380,141,380,142,408,70,387,70,387,142,408,147,428,70,387,147,428,159,440,205,463,11,463,37,446,205,463,37,446,54,440,205,463,54,440,64,429,205,463,64,429,69,412,205,463,69,412,159,440,205,463,159,440,177,446,205,463,177,446,205,450,70,387,159,440,69,412,142,332,144,339,141,373,141,373,144,339,148,343,141,373,148,343,198,373,198,373,148,343,155,345,198,373,155,345,164,346,164,346,215,342,198,373,198,373,215,342,259,367,282,310,298,280,310,350,310,350,298,280,303,241,312,134,303,241,298,205,259,367,215,342,255,330,259,367,255,330,282,310,259,367,282,310,310,350,371,289,348,324,354,170,371,289,354,170,368,193,371,289,368,193,377,218,371,289,377,218,380,245,348,324,310,350,312,134,348,324,312,134,335,150,348,324,335,150,354,170,190,111,221,112,225,142,225,142,221,112,248,114,225,142,248,114,259,155,259,155,248,114,272,119,259,155,272,119,283,176,283,176,272,119,293,126,283,176,293,126,298,205,298,205,293,126,312,134,225,142,181,138,190,111,190,111,181,138,180,111,180,111,181,138,173,138,180,111,173,138,170,111,170,111,173,138,165,139,170,111,165,139,161,111,161,111,165,139,158,139,161,111,158,139,152,112,152,112,158,139,150,140,152,112,150,140,141,141,141,373,141,141,141,323,141,373,141,323,142,332,141,374,141,375,141,77,141,374,141,77,141,141,141,374,141,141,141,373,141,141,141,113,152,112,207,0,207,13,179,16,207,0,179,16,160,22,207,0,160,22,69,55,207,0,69,55,65,35,207,0,65,35,55,23,207, -0,55,23,38,17,207,0,38,17,11,13,207,0,11,13,11,0,141,77,141,375,141,377,141,77,141,377,141,378,141,77,141,378,141,380,70,84,69,55,160,22,70,84,160,22,149,33,70,84,149,33,143,50,70,84,143,50,70,387,303,241,312,134,310,350,37,446,11,463,11,450,46,27,39,18,110,0,110,0,39,18,26,13,110,0,26,13,9,10,222,259,198,264,203,243,203,243,198,264,191,278,203,243,191,278,170,250,170,250,191,278,167,273,170,250,167,273,161,251,161,251,167,273,159,272,161,251,159,272,154,252,154,252,159,272,154,270,154,252,154,270,150,254,150,254,154,270,150,268,150,254,150,268,148,258,148,258,150,268,148,265,148,258,148,265,147,262,113,410,121,431,130,472,130,472,121,431,133,446,130,472,133,446,176,478,176,478,133,446,150,456,176,478,150,456,170,459,170,459,192,455,176,478,176,478,192,455,216,473,231,331,237,284,234,361,234,361,237,284,249,459,249,459,237,284,265,302,249,459,265,302,274,437,274,437,265,302,282,322,274,437,282,322,289,408,289,408,282,322,292,344,289,408,292,344,295,372,192,455,210,442,216,473,216,473,210,442,223,422,216,473,223,422,249,459,249,459,223,422,231,395,249,459,231,395,234,361,210,290,198,264,237,284,210,290,237,284,223,308,223,308,237,284,231,331,321,87,327,130,326,154,321,87,326,154,320,175,321,87,320,175,312,195,321,87,312,195,304,49,312,195,300,213,304,49,304,49,300,213,284,228,304,49,284,228,277,20,277,20,284,228,271,239,277,20,271,239,262,105,262,105,271,239,258,156,277,20,262,105,261,86,277,20,261,86,258,67,277,20,258,67,255,50,277,20,255,50,250,36,277,20,250,36,245,27,277,20,245,27,242,1,197,35,195,51,193,59,197,35,193,59,202,-5,197,35,202,-5,198,27,95,453,70,421,110,0,95,453,110,0,110,384,95,453,110,384,113,410,95,453,113,410,130,472,110,0,70,421,56,376,110,0,56,376,51,318,110,0,51,318,51,59,110,0,51,59,50,40,110,0,50,40,46,27,236,18,230,16,242,1,242,1,230,16,224,14,242,1,224,14,217,14,217,14,210,15,242,1,242,1,210,15,205,17,242,1,205,17,202,-5,202,-5,205, -17,201,21,202,-5,201,21,198,27,236,18,242,1,241,22,241,22,242,1,245,27,193,59,188,67,202,-5,202,-5,188,67,182,73,202,-5,182,73,180,-3,180,-3,182,73,174,77,180,-3,174,77,166,78,161,3,180,-3,166,78,161,3,166,78,155,77,161,3,155,77,147,72,161,3,147,72,147,14,140,65,136,56,138,28,140,65,138,28,147,14,140,65,147,14,147,72,222,259,228,225,241,253,241,253,228,225,247,196,241,253,247,196,257,247,257,247,247,196,258,156,257,247,258,156,271,239,222,259,203,243,228,225,138,28,136,56,134,45,110,0,9,10,9,0,198,264,210,290,191,278,194,355,222,355,120,459,194,355,120,459,114,465,194,355,114,465,108,469,194,355,108,469,102,472,194,355,102,472,96,474,194,355,96,474,91,474,194,355,91,474,86,422,65,452,66,445,66,460,66,460,66,445,68,439,66,460,68,439,69,466,69,466,68,439,73,433,69,466,73,433,75,471,75,471,73,433,79,427,75,471,79,427,82,473,82,473,79,427,86,422,82,473,86,422,91,474,52,218,61,214,62,291,62,291,61,214,70,212,62,291,70,212,75,301,75,301,70,212,80,214,75,301,80,214,88,308,88,308,80,214,89,219,88,308,89,219,103,314,103,314,89,219,98,271,100,233,98,271,95,225,155,322,146,305,164,303,155,322,164,303,177,321,177,321,164,303,179,296,177,321,179,296,197,317,197,317,179,296,191,283,197,317,191,283,198,266,107,291,117,299,119,318,119,318,117,299,130,304,119,318,130,304,137,321,137,321,130,304,146,305,137,321,146,305,155,322,103,314,98,271,100,282,103,314,100,282,107,291,103,314,107,291,119,318,98,271,89,219,95,225,40,257,41,234,45,268,45,268,41,234,46,225,45,268,46,225,52,280,52,280,46,225,52,218,52,280,52,218,62,291,258,79,258,213,257,235,258,79,257,235,256,253,258,79,256,253,252,267,258,79,252,267,260,-5,266,40,273,-2,272,35,272,35,273,-2,280,33,286,33,280,33,285,3,286,33,285,3,297,13,262,49,259,62,260,-5,262,49,260,-5,273,-2,262,49,273,-2,266,40,205,24,212,10,213,310,213,310,212,10,220,0,213,310,220,0,227,302,227,302,220,0,232,-4,227,302,232,-4,238, -291,238,291,232,-4,246,-6,238,291,246,-6,247,279,247,279,246,-6,260,-5,247,279,260,-5,252,267,213,310,197,317,198,266,213,310,198,266,201,242,213,310,201,242,201,188,213,310,201,188,202,44,213,310,202,44,205,24,201,44,202,44,201,188,201,205,201,188,201,242,303,41,297,37,297,13,303,41,297,13,309,27,303,41,309,27,309,46,291,35,286,33,297,13,291,35,297,13,297,37,280,33,273,-2,285,3,201,44,201,188,201,89,201,44,201,89,200,78,201,44,200,78,198,69,201,44,198,69,194,60,201,44,194,60,187,53,201,44,187,53,179,23,179,23,187,53,177,45,177,45,169,40,179,23,179,23,169,40,161,37,179,23,161,37,158,8,158,8,161,37,153,35,158,8,153,35,144,34,138,160,156,169,159,189,159,189,156,169,177,178,159,189,177,178,201,205,201,205,177,178,201,188,91,111,96,122,106,165,106,165,96,122,102,132,106,165,102,132,111,141,111,141,123,151,128,176,128,176,123,151,138,160,128,176,138,160,159,189,128,176,106,165,111,141,100,255,99,260,100,233,100,255,100,233,102,241,100,255,102,241,101,249,98,265,98,271,100,233,98,265,100,233,99,260,89,156,75,148,75,-3,89,156,75,-3,88,88,89,156,88,88,88,100,89,156,88,100,91,111,89,156,91,111,106,165,88,88,75,-3,90,68,90,68,75,-3,99,-6,90,68,99,-6,97,53,97,53,99,-6,107,42,28,87,29,40,35,105,35,105,29,40,39,20,35,105,39,20,46,122,46,122,39,20,55,5,46,122,55,5,59,136,59,136,55,5,75,-3,59,136,75,-3,75,148,118,-5,138,0,120,36,120,36,138,0,136,34,144,34,136,34,138,0,144,34,138,0,158,8,107,42,99,-6,118,-5,107,42,118,-5,120,36,29,40,28,87,26,66,258,79,260,-5,259,62,41,234,40,257,39,245,52,218,61,214,62,291,62,291,61,214,70,212,62,291,70,212,75,301,75,301,70,212,80,214,75,301,80,214,88,308,88,308,80,214,89,219,88,308,89,219,103,314,103,314,89,219,98,271,100,233,98,271,95,225,155,322,146,305,164,303,155,322,164,303,177,321,177,321,164,303,179,296,177,321,179,296,197,317,197,317,179,296,191,283,197,317,191,283,198,266,107, -291,117,299,119,318,119,318,117,299,130,304,119,318,130,304,137,321,137,321,130,304,146,305,137,321,146,305,155,322,103,314,98,271,100,282,103,314,100,282,107,291,103,314,107,291,119,318,98,271,89,219,95,225,40,257,41,234,45,268,45,268,41,234,46,225,45,268,46,225,52,280,52,280,46,225,52,218,52,280,52,218,62,291,258,79,258,213,257,235,258,79,257,235,256,253,258,79,256,253,252,267,258,79,252,267,260,-5,266,40,273,-2,272,35,272,35,273,-2,280,33,286,33,280,33,285,3,286,33,285,3,297,13,262,49,259,62,260,-5,262,49,260,-5,273,-2,262,49,273,-2,266,40,205,24,212,10,213,310,213,310,212,10,220,0,213,310,220,0,227,302,227,302,220,0,232,-4,227,302,232,-4,238,291,238,291,232,-4,246,-6,238,291,246,-6,247,279,247,279,246,-6,260,-5,247,279,260,-5,252,267,213,310,197,317,198,266,213,310,198,266,201,242,213,310,201,242,201,188,213,310,201,188,202,44,213,310,202,44,205,24,201,44,202,44,201,188,201,205,201,188,201,242,303,41,297,37,297,13,303,41,297,13,309,27,303,41,309,27,309,46,291,35,286,33,297,13,291,35,297,13,297,37,280,33,273,-2,285,3,216,474,219,423,224,473,224,473,219,423,226,428,224,473,226,428,231,471,231,471,226,428,232,434,231,471,232,434,236,466,236,466,232,434,236,440,236,466,236,440,239,460,239,460,236,440,239,446,239,460,239,446,240,452,219,423,216,474,210,474,219,423,210,474,204,472,219,423,204,472,199,469,219,423,199,469,193,465,219,423,193,465,186,459,219,423,186,459,111,355,201,44,201,188,201,89,201,44,201,89,200,78,201,44,200,78,198,69,201,44,198,69,194,60,201,44,194,60,187,53,201,44,187,53,179,23,179,23,187,53,177,45,177,45,169,40,179,23,179,23,169,40,161,37,179,23,161,37,158,8,158,8,161,37,153,35,158,8,153,35,144,34,138,160,156,169,159,189,159,189,156,169,177,178,159,189,177,178,201,205,201,205,177,178,201,188,91,111,96,122,106,165,106,165,96,122,102,132,106,165,102,132,111,141,111,141,123,151,128,176,128,176,123,151,138,160,128,176,138,160,159,189,128,176,106,165,111,141,100,255,99, -260,100,233,100,255,100,233,102,241,100,255,102,241,101,249,98,265,98,271,100,233,98,265,100,233,99,260,89,156,75,148,75,-3,89,156,75,-3,88,88,89,156,88,88,88,100,89,156,88,100,91,111,89,156,91,111,106,165,88,88,75,-3,90,68,90,68,75,-3,99,-6,90,68,99,-6,97,53,97,53,99,-6,107,42,28,87,29,40,35,105,35,105,29,40,39,20,35,105,39,20,46,122,46,122,39,20,55,5,46,122,55,5,59,136,59,136,55,5,75,-3,59,136,75,-3,75,148,118,-5,138,0,120,36,120,36,138,0,136,34,144,34,136,34,138,0,144,34,138,0,158,8,107,42,99,-6,118,-5,107,42,118,-5,120,36,29,40,28,87,26,66,111,355,186,459,84,355,258,79,260,-5,259,62,41,234,40,257,39,245,49,355,73,355,136,472,136,472,73,355,158,427,136,472,158,427,179,472,179,472,158,427,243,355,179,472,243,355,266,355,52,218,61,214,62,291,62,291,61,214,70,212,62,291,70,212,75,301,75,301,70,212,80,214,75,301,80,214,88,308,88,308,80,214,89,219,88,308,89,219,103,314,103,314,89,219,98,271,100,233,98,271,95,225,155,322,146,305,164,303,155,322,164,303,177,321,177,321,164,303,179,296,177,321,179,296,197,317,197,317,179,296,191,283,197,317,191,283,198,266,107,291,117,299,119,318,119,318,117,299,130,304,119,318,130,304,137,321,137,321,130,304,146,305,137,321,146,305,155,322,103,314,98,271,100,282,103,314,100,282,107,291,103,314,107,291,119,318,98,271,89,219,95,225,40,257,41,234,45,268,45,268,41,234,46,225,45,268,46,225,52,280,52,280,46,225,52,218,52,280,52,218,62,291,258,79,258,213,257,235,258,79,257,235,256,253,258,79,256,253,252,267,258,79,252,267,260,-5,266,40,273,-2,272,35,272,35,273,-2,280,33,286,33,280,33,285,3,286,33,285,3,297,13,262,49,259,62,260,-5,262,49,260,-5,273,-2,262,49,273,-2,266,40,205,24,212,10,213,310,213,310,212,10,220,0,213,310,220,0,227,302,227,302,220,0,232,-4,227,302,232,-4,238,291,238,291,232,-4,246,-6,238,291,246,-6,247,279,247,279,246,-6,260,-5,247,279,260,-5,252,267,213,310,197,317,198, -266,213,310,198,266,201,242,213,310,201,242,201,188,213,310,201,188,202,44,213,310,202,44,205,24,201,44,202,44,201,188,201,205,201,188,201,242,303,41,297,37,297,13,303,41,297,13,309,27,303,41,309,27,309,46,291,35,286,33,297,13,291,35,297,13,297,37,280,33,273,-2,285,3,201,44,201,188,201,89,201,44,201,89,200,78,201,44,200,78,198,69,201,44,198,69,194,60,201,44,194,60,187,53,201,44,187,53,179,23,179,23,187,53,177,45,177,45,169,40,179,23,179,23,169,40,161,37,179,23,161,37,158,8,158,8,161,37,153,35,158,8,153,35,144,34,138,160,156,169,159,189,159,189,156,169,177,178,159,189,177,178,201,205,201,205,177,178,201,188,91,111,96,122,106,165,106,165,96,122,102,132,106,165,102,132,111,141,111,141,123,151,128,176,128,176,123,151,138,160,128,176,138,160,159,189,128,176,106,165,111,141,100,255,99,260,100,233,100,255,100,233,102,241,100,255,102,241,101,249,98,265,98,271,100,233,98,265,100,233,99,260,89,156,75,148,75,-3,89,156,75,-3,88,88,89,156,88,88,88,100,89,156,88,100,91,111,89,156,91,111,106,165,88,88,75,-3,90,68,90,68,75,-3,99,-6,90,68,99,-6,97,53,97,53,99,-6,107,42,28,87,29,40,35,105,35,105,29,40,39,20,35,105,39,20,46,122,46,122,39,20,55,5,46,122,55,5,59,136,59,136,55,5,75,-3,59,136,75,-3,75,148,118,-5,138,0,120,36,120,36,138,0,136,34,144,34,136,34,138,0,144,34,138,0,158,8,107,42,99,-6,118,-5,107,42,118,-5,120,36,29,40,28,87,26,66,258,79,260,-5,259,62,41,234,40,257,39,245,67,384,73,393,75,431,75,431,73,393,80,399,75,431,80,399,92,440,92,440,80,399,88,403,92,440,88,403,98,405,98,405,103,404,112,443,112,443,103,404,108,403,112,443,108,403,114,402,62,373,67,384,75,431,62,373,75,431,61,417,62,373,61,417,49,397,62,373,49,397,41,373,52,218,61,214,62,291,62,291,61,214,70,212,62,291,70,212,75,301,75,301,70,212,80,214,75,301,80,214,88,308,88,308,80,214,89,219,88,308,89,219,103,314,103,314,89,219,98,271,100, -233,98,271,95,225,112,443,114,402,121,442,121,442,114,402,120,399,121,442,120,399,126,397,126,397,142,389,131,441,131,441,142,389,141,439,112,443,92,440,98,405,131,441,121,442,126,397,141,439,142,389,151,435,151,435,142,389,157,382,151,435,157,382,161,430,161,430,157,382,170,377,161,430,170,377,178,422,178,422,170,377,180,374,178,422,180,374,186,418,186,418,180,374,189,373,186,418,189,373,194,415,194,415,189,373,198,373,194,415,198,373,201,413,201,413,198,373,220,375,201,413,220,375,208,412,208,412,220,375,215,412,224,413,215,412,220,375,224,413,220,375,237,383,258,79,258,213,257,235,258,79,257,235,256,253,258,79,256,253,252,267,258,79,252,267,260,-5,266,40,273,-2,272,35,272,35,273,-2,280,33,286,33,280,33,285,3,286,33,285,3,297,13,262,49,259,62,260,-5,262,49,260,-5,273,-2,262,49,273,-2,266,40,205,24,212,10,213,310,213,310,212,10,220,0,213,310,220,0,227,302,227,302,220,0,232,-4,227,302,232,-4,238,291,238,291,232,-4,246,-6,238,291,246,-6,247,279,247,279,246,-6,260,-5,247,279,260,-5,252,267,213,310,197,317,198,266,213,310,198,266,201,242,213,310,201,242,201,188,213,310,201,188,202,44,213,310,202,44,205,24,201,44,202,44,201,188,201,205,201,188,201,242,155,322,146,305,164,303,155,322,164,303,177,321,177,321,164,303,179,296,177,321,179,296,197,317,197,317,179,296,191,283,197,317,191,283,198,266,303,41,297,37,297,13,303,41,297,13,309,27,303,41,309,27,309,46,291,35,286,33,297,13,291,35,297,13,297,37,280,33,273,-2,285,3,252,447,245,433,251,398,252,447,251,398,263,419,252,447,263,419,273,447,238,423,232,416,237,383,238,423,237,383,251,398,238,423,251,398,245,433,107,291,117,299,119,318,119,318,117,299,130,304,119,318,130,304,137,321,137,321,130,304,146,305,137,321,146,305,155,322,103,314,98,271,100,282,103,314,100,282,107,291,103,314,107,291,119,318,98,271,89,219,95,225,40,257,41,234,45,268,45,268,41,234,46,225,45,268,46,225,52,280,52,280,46,225,52,218,52,280,52,218,62,291,201,44,201,188,201,89,201,44,201,89,200,78,201,44,200, -78,198,69,201,44,198,69,194,60,201,44,194,60,187,53,201,44,187,53,179,23,179,23,187,53,177,45,177,45,169,40,179,23,179,23,169,40,161,37,179,23,161,37,158,8,158,8,161,37,153,35,158,8,153,35,144,34,138,160,156,169,159,189,159,189,156,169,177,178,159,189,177,178,201,205,201,205,177,178,201,188,91,111,96,122,106,165,106,165,96,122,102,132,106,165,102,132,111,141,111,141,123,151,128,176,128,176,123,151,138,160,128,176,138,160,159,189,128,176,106,165,111,141,100,255,99,260,100,233,100,255,100,233,102,241,100,255,102,241,101,249,98,265,98,271,100,233,98,265,100,233,99,260,89,156,75,148,75,-3,89,156,75,-3,88,88,89,156,88,88,88,100,89,156,88,100,91,111,89,156,91,111,106,165,88,88,75,-3,90,68,90,68,75,-3,99,-6,90,68,99,-6,97,53,97,53,99,-6,107,42,28,87,29,40,35,105,35,105,29,40,39,20,35,105,39,20,46,122,46,122,39,20,55,5,46,122,55,5,59,136,59,136,55,5,75,-3,59,136,75,-3,75,148,118,-5,138,0,120,36,120,36,138,0,136,34,144,34,136,34,138,0,144,34,138,0,158,8,107,42,99,-6,118,-5,107,42,118,-5,120,36,29,40,28,87,26,66,41,234,40,257,39,245,224,413,237,383,232,416,258,79,260,-5,259,62,226,435,226,366,237,433,237,433,226,366,237,368,237,433,237,368,247,428,247,428,237,368,247,373,247,428,247,373,254,421,254,421,247,373,254,380,254,421,254,380,259,412,259,412,254,380,259,390,259,412,259,390,261,401,192,401,194,390,194,412,194,412,194,390,198,380,194,412,198,380,199,421,199,421,198,380,206,373,199,421,206,373,206,429,206,429,206,373,215,368,206,429,215,368,215,433,215,433,215,368,226,366,215,433,226,366,226,435,258,79,258,213,257,235,258,79,257,235,256,253,258,79,256,253,252,267,258,79,252,267,260,-5,266,40,273,-2,272,35,272,35,273,-2,280,33,286,33,280,33,285,3,286,33,285,3,297,13,262,49,259,62,260,-5,262,49,260,-5,273,-2,262,49,273,-2,266,40,205,24,212,10,213,310,213,310,212,10,220,0,213,310,220,0,227,302,227,302,220,0,232,-4,227,302,232,-4,238, -291,238,291,232,-4,246,-6,238,291,246,-6,247,279,247,279,246,-6,260,-5,247,279,260,-5,252,267,213,310,197,317,198,266,213,310,198,266,201,242,213,310,201,242,201,188,213,310,201,188,202,44,213,310,202,44,205,24,201,44,202,44,201,188,201,205,201,188,201,242,155,322,146,305,164,303,155,322,164,303,177,321,177,321,164,303,179,296,177,321,179,296,197,317,197,317,179,296,191,283,197,317,191,283,198,266,303,41,297,37,297,13,303,41,297,13,309,27,303,41,309,27,309,46,291,35,286,33,297,13,291,35,297,13,297,37,280,33,273,-2,285,3,52,401,54,390,54,412,54,412,54,390,59,380,54,412,59,380,59,421,59,421,59,380,66,373,59,421,66,373,67,429,67,429,66,373,75,368,67,429,75,368,76,433,76,433,75,368,86,366,76,433,86,366,87,435,87,435,86,366,97,368,87,435,97,368,98,433,98,433,97,368,107,373,98,433,107,373,107,428,107,428,107,373,115,380,107,428,115,380,115,421,115,421,115,380,120,390,115,421,120,390,120,412,120,412,120,390,122,401,52,218,61,214,62,291,62,291,61,214,70,212,62,291,70,212,75,301,75,301,70,212,80,214,75,301,80,214,88,308,88,308,80,214,89,219,88,308,89,219,103,314,103,314,89,219,98,271,100,233,98,271,95,225,107,291,117,299,119,318,119,318,117,299,130,304,119,318,130,304,137,321,137,321,130,304,146,305,137,321,146,305,155,322,103,314,98,271,100,282,103,314,100,282,107,291,103,314,107,291,119,318,98,271,89,219,95,225,40,257,41,234,45,268,45,268,41,234,46,225,45,268,46,225,52,280,52,280,46,225,52,218,52,280,52,218,62,291,201,44,201,188,201,89,201,44,201,89,200,78,201,44,200,78,198,69,201,44,198,69,194,60,201,44,194,60,187,53,201,44,187,53,179,23,179,23,187,53,177,45,177,45,169,40,179,23,179,23,169,40,161,37,179,23,161,37,158,8,158,8,161,37,153,35,158,8,153,35,144,34,138,160,156,169,159,189,159,189,156,169,177,178,159,189,177,178,201,205,201,205,177,178,201,188,91,111,96,122,106,165,106,165,96,122,102,132,106,165,102,132,111,141,111,141,123,151,128,176,128,176,123,151,138,160,128, -176,138,160,159,189,128,176,106,165,111,141,100,255,99,260,100,233,100,255,100,233,102,241,100,255,102,241,101,249,98,265,98,271,100,233,98,265,100,233,99,260,89,156,75,148,75,-3,89,156,75,-3,88,88,89,156,88,88,88,100,89,156,88,100,91,111,89,156,91,111,106,165,88,88,75,-3,90,68,90,68,75,-3,99,-6,90,68,99,-6,97,53,97,53,99,-6,107,42,28,87,29,40,35,105,35,105,29,40,39,20,35,105,39,20,46,122,46,122,39,20,55,5,46,122,55,5,59,136,59,136,55,5,75,-3,59,136,75,-3,75,148,118,-5,138,0,120,36,120,36,138,0,136,34,144,34,136,34,138,0,144,34,138,0,158,8,107,42,99,-6,118,-5,107,42,118,-5,120,36,29,40,28,87,26,66,41,234,40,257,39,245,258,79,260,-5,259,62,201,415,194,402,198,373,198,373,194,402,184,392,198,373,184,392,179,364,179,364,184,392,171,386,179,364,171,386,156,360,156,360,171,386,156,384,88,430,91,407,91,452,91,452,91,407,101,388,91,452,101,388,101,471,101,471,101,388,116,373,101,471,116,373,111,430,111,430,116,486,101,471,52,218,61,214,62,291,62,291,61,214,70,212,62,291,70,212,75,301,75,301,70,212,80,214,75,301,80,214,88,308,88,308,80,214,89,219,88,308,89,219,103,314,103,314,89,219,98,271,100,233,98,271,95,225,155,322,146,305,164,303,155,322,164,303,177,321,177,321,164,303,179,296,177,321,179,296,197,317,197,317,179,296,191,283,197,317,191,283,198,266,107,291,117,299,119,318,119,318,117,299,130,304,119,318,130,304,137,321,137,321,130,304,146,305,137,321,146,305,155,322,103,314,98,271,100,282,103,314,100,282,107,291,103,314,107,291,119,318,98,271,89,219,95,225,40,257,41,234,45,268,45,268,41,234,46,225,45,268,46,225,52,280,52,280,46,225,52,218,52,280,52,218,62,291,158,499,156,475,171,473,158,499,171,473,179,496,179,496,171,473,184,466,179,496,184,466,198,485,198,485,184,466,194,456,198,485,194,456,201,444,258,79,258,213,257,235,258,79,257,235,256,253,258,79,256,253,252,267,258,79,252,267,260,-5,266,40,273,-2,272,35,272,35,273,-2,280,33,286,33,280, -33,285,3,286,33,285,3,297,13,262,49,259,62,260,-5,262,49,260,-5,273,-2,262,49,273,-2,266,40,205,24,212,10,213,310,213,310,212,10,220,0,213,310,220,0,227,302,227,302,220,0,232,-4,227,302,232,-4,238,291,238,291,232,-4,246,-6,238,291,246,-6,247,279,247,279,246,-6,260,-5,247,279,260,-5,252,267,213,310,197,317,198,266,213,310,198,266,201,242,213,310,201,242,201,188,213,310,201,188,202,44,213,310,202,44,205,24,201,44,202,44,201,188,201,205,201,188,201,242,303,41,297,37,297,13,303,41,297,13,309,27,303,41,309,27,309,46,291,35,286,33,297,13,291,35,297,13,297,37,280,33,273,-2,285,3,227,429,223,451,223,407,223,407,223,451,213,470,223,407,213,470,213,388,213,388,213,470,203,430,201,444,203,430,213,470,201,444,213,470,198,485,201,415,198,373,213,388,201,415,213,388,203,430,120,456,130,466,135,496,135,496,130,466,142,473,135,496,142,473,158,499,158,499,142,473,156,475,116,486,111,430,113,444,116,486,113,444,120,456,116,486,120,456,135,496,142,386,129,392,134,364,142,386,134,364,156,360,142,386,156,360,156,384,120,402,113,415,116,373,120,402,116,373,134,364,120,402,134,364,129,392,201,44,201,188,201,89,201,44,201,89,200,78,201,44,200,78,198,69,201,44,198,69,194,60,201,44,194,60,187,53,201,44,187,53,179,23,179,23,187,53,177,45,177,45,169,40,179,23,179,23,169,40,161,37,179,23,161,37,158,8,158,8,161,37,153,35,158,8,153,35,144,34,138,160,156,169,159,189,159,189,156,169,177,178,159,189,177,178,201,205,201,205,177,178,201,188,91,111,96,122,106,165,106,165,96,122,102,132,106,165,102,132,111,141,111,141,123,151,128,176,128,176,123,151,138,160,128,176,138,160,159,189,128,176,106,165,111,141,100,255,99,260,100,233,100,255,100,233,102,241,100,255,102,241,101,249,98,265,98,271,100,233,98,265,100,233,99,260,89,156,75,148,75,-3,89,156,75,-3,88,88,89,156,88,88,88,100,89,156,88,100,91,111,89,156,91,111,106,165,88,88,75,-3,90,68,90,68,75,-3,99,-6,90,68,99,-6,97,53,97,53,99,-6,107,42,28,87,29,40,35, -105,35,105,29,40,39,20,35,105,39,20,46,122,46,122,39,20,55,5,46,122,55,5,59,136,59,136,55,5,75,-3,59,136,75,-3,75,148,118,-5,138,0,120,36,120,36,138,0,136,34,144,34,136,34,138,0,144,34,138,0,158,8,107,42,99,-6,118,-5,107,42,118,-5,120,36,29,40,28,87,26,66,111,430,116,373,113,415,258,79,260,-5,259,62,41,234,40,257,39,245,102,274,102,274,102,274,102,274,104,284,87,308,102,274,87,308,92,218,102,274,92,218,98,225,200,53,188,44,188,23,188,23,188,44,170,35,188,23,170,35,166,9,166,9,170,35,151,29,166,9,151,29,147,1,147,1,151,29,134,27,147,1,134,27,128,-2,128,-2,134,27,116,30,128,-2,116,30,108,-4,108,-4,116,30,104,39,108,-4,104,39,94,52,88,88,81,0,89,69,89,69,81,0,108,-4,89,69,108,-4,94,52,104,284,111,292,118,318,118,318,111,292,121,298,118,318,121,298,153,322,153,322,121,298,134,302,153,322,134,302,149,304,149,304,166,302,153,322,153,322,166,302,173,321,245,11,248,194,236,289,245,11,236,289,229,25,229,25,236,289,220,302,229,25,220,302,214,44,214,44,220,302,205,62,205,63,205,62,205,311,205,311,205,62,220,302,205,311,190,317,191,265,205,311,191,265,192,241,205,311,192,241,192,177,205,311,192,177,193,126,205,311,193,126,194,111,205,311,194,111,197,96,205,311,197,96,200,80,205,311,200,80,205,64,205,311,205,64,205,63,192,197,192,177,192,241,190,317,173,321,178,295,190,317,178,295,186,282,190,317,186,282,191,265,320,322,309,300,329,297,320,322,329,297,358,317,358,317,329,297,345,288,358,317,345,288,355,271,248,215,252,247,253,302,253,302,252,247,260,271,253,302,260,271,269,311,269,311,260,271,272,288,269,311,272,288,285,317,285,317,272,288,288,297,285,317,288,297,301,321,301,321,288,297,309,300,301,321,309,300,320,322,387,303,365,215,431,194,431,194,365,215,248,215,431,194,248,215,248,194,236,289,248,194,248,215,236,289,248,215,253,302,362,247,365,215,387,303,362,247,387,303,358,317,362,247,358,317,355,271,409,278,387,303,431,194,409,278,431,194,423,242,316,41,301,46,305,-4,305, --4,301,46,287,54,305,-4,287,54,282,-2,282,-2,287,54,275,63,282,-2,275,63,266,75,266,75,259,91,263,2,263,2,259,91,254,109,263,2,254,109,251,130,245,11,263,2,251,130,245,11,251,130,249,157,245,11,249,157,248,194,305,-4,323,-3,316,41,316,41,323,-3,333,40,356,42,333,40,340,0,356,42,340,0,356,5,266,75,263,2,282,-2,399,34,410,47,415,82,415,82,410,47,420,62,415,82,420,62,434,108,434,108,420,62,431,81,434,108,431,81,442,105,356,5,372,13,376,49,376,49,372,13,387,23,376,49,387,23,396,62,396,62,387,23,399,34,396,62,399,34,415,82,333,40,323,-3,340,0,200,53,188,23,214,44,200,53,214,44,205,62,90,110,100,128,102,172,102,172,100,128,119,144,102,172,119,144,192,197,192,197,119,144,149,160,192,197,149,160,192,177,59,8,81,0,67,157,67,157,81,0,88,88,67,157,88,88,90,110,28,95,30,45,33,118,33,118,30,45,41,24,33,118,41,24,45,139,45,139,41,24,59,8,45,139,59,8,67,157,54,218,62,214,63,291,63,291,62,214,73,212,63,291,73,212,87,308,87,308,73,212,83,214,87,308,83,214,92,218,48,270,42,246,44,235,48,270,44,235,48,225,48,270,48,225,54,218,48,270,54,218,63,291,103,258,102,263,102,234,103,258,102,234,104,245,103,258,104,245,104,252,102,234,102,263,102,269,102,234,102,269,102,274,102,234,102,274,98,225,87,308,104,284,118,318,30,45,28,95,27,70,67,157,90,110,102,172,193,126,192,177,192,141,356,42,356,5,376,49,173,321,166,302,178,295,114,68,91,97,95,6,95,6,91,97,76,135,95,6,76,135,63,28,63,28,76,135,71,180,77,286,71,180,76,220,77,286,76,220,88,254,122,-149,134,-150,123,-125,123,-125,134,-150,131,-125,144,-123,131,-125,134,-150,144,-123,134,-150,164,-147,134,-4,132,-69,146,-70,134,-4,146,-70,144,-44,134,-4,144,-44,144,50,144,50,144,-44,158,-6,134,-4,108,-69,113,-72,134,-4,113,-72,116,-71,134,-4,116,-71,119,-70,134,-4,119,-70,123,-69,134,-4,123,-69,128,-69,134,-4,128,-69,132,-69,260,84,241,65,243,34,243,34,241,65,222,53,243,34,222,53,218,13,218,13,222, -53,202,46,218,13,202,46,190,0,190,0,202,46,180,44,158,-6,190,0,180,44,158,-6,180,44,144,50,114,68,95,6,134,-4,114,68,134,-4,144,50,190,297,197,291,205,318,205,318,197,291,203,281,205,318,203,281,208,268,208,268,212,252,234,308,234,308,212,252,216,241,234,308,216,241,222,232,171,322,166,302,180,300,171,322,180,300,205,318,205,318,180,300,190,297,273,272,258,292,265,226,273,272,265,226,272,232,273,272,272,232,277,241,273,272,277,241,279,250,258,292,234,308,237,222,258,292,237,222,245,220,258,292,245,220,256,222,258,292,256,222,265,226,234,308,222,232,229,226,234,308,229,226,237,222,234,308,205,318,208,268,266,64,288,103,279,109,266,64,279,109,260,84,266,64,260,84,243,34,135,296,166,302,151,320,135,296,151,320,132,316,135,296,132,316,113,308,135,296,113,308,109,280,94,298,77,286,88,254,94,298,88,254,109,280,94,298,109,280,113,308,63,28,71,180,77,286,63,28,77,286,55,265,63,28,55,265,39,240,63,28,39,240,38,61,27,213,20,182,23,101,27,213,23,101,38,61,27,213,38,61,39,240,222,-90,219,-74,218,-111,218,-111,219,-74,211,-60,218,-111,211,-60,207,-127,207,-127,211,-60,199,-51,207,-127,199,-51,188,-139,188,-139,199,-51,182,-45,188,-139,182,-45,170,-94,170,-94,182,-45,168,-85,164,-78,168,-85,182,-45,164,-78,182,-45,162,-43,164,-78,162,-43,158,-43,164,-78,158,-43,157,-73,157,-73,158,-43,154,-43,157,-73,154,-43,151,-43,157,-73,151,-43,148,-44,157,-73,148,-44,146,-70,188,-139,170,-94,168,-105,188,-139,168,-105,164,-147,164,-147,168,-105,163,-113,164,-147,163,-113,155,-119,85,-117,88,-143,96,-120,96,-120,88,-143,99,-146,96,-120,99,-146,106,-122,106,-122,99,-146,110,-148,106,-122,110,-148,114,-124,114,-124,110,-148,122,-149,114,-124,122,-149,123,-125,88,-143,85,-117,76,-138,144,-123,164,-147,155,-119,144,-44,146,-70,148,-44,166,302,171,322,151,320,23,101,20,182,17,148,79,119,105,0,87,99,87,99,105,0,100,80,112,66,100,80,105,0,112,66,105,0,151,-6,73,140,70,165,68,21,73,140,68,21,105,0,73,140,105,0,79,119,17,152,23,98,24,207,24,207,23,98,40,54,24,207,40,54,43, -254,43,254,40,54,68,21,43,254,68,21,68,194,68,194,68,21,70,165,189,355,217,355,116,459,189,355,116,459,109,465,189,355,109,465,103,469,189,355,103,469,97,472,189,355,97,472,91,474,189,355,91,474,85,474,189,355,85,474,81,422,60,452,61,445,61,460,61,460,61,445,64,439,61,460,64,439,65,466,65,466,64,439,68,433,65,466,68,433,70,471,70,471,68,433,74,427,70,471,74,427,77,473,77,473,74,427,81,422,77,473,81,422,85,474,187,320,163,322,168,294,168,294,163,322,144,297,122,294,144,297,163,322,122,294,163,322,113,314,266,87,247,67,254,36,254,36,247,67,226,52,254,36,226,52,224,12,224,12,226,52,204,44,224,12,204,44,190,-1,190,-1,204,44,178,41,284,194,281,215,278,232,284,194,278,232,273,248,284,194,273,248,267,261,284,194,267,261,259,273,284,194,259,273,245,290,284,194,245,290,228,304,284,194,228,304,212,216,284,194,212,216,70,216,284,194,70,216,68,194,198,269,206,246,209,314,209,314,206,246,212,216,209,314,212,216,228,304,278,69,297,110,286,115,278,69,286,115,266,87,278,69,266,87,254,36,159,43,142,47,151,-6,159,43,151,-6,190,-1,159,43,190,-1,178,41,126,55,112,66,151,-6,126,55,151,-6,142,47,187,320,168,294,186,285,187,320,186,285,198,269,187,320,198,269,209,314,70,216,77,245,73,290,73,290,77,245,88,267,73,290,88,267,113,314,113,314,88,267,103,284,113,314,103,284,122,294,73,290,43,254,68,194,73,290,68,194,70,216,284,194,281,215,278,232,284,194,278,232,273,248,284,194,273,248,267,261,284,194,267,261,259,273,284,194,259,273,245,290,284,194,245,290,228,304,284,194,228,304,212,216,284,194,212,216,70,216,284,194,70,216,68,194,198,269,206,246,209,314,209,314,206,246,212,216,209,314,212,216,228,304,213,474,217,423,222,473,222,473,217,423,225,428,222,473,225,428,229,471,229,471,225,428,231,434,229,471,231,434,234,466,234,466,231,434,235,440,234,466,235,440,237,460,237,460,235,440,237,446,237,460,237,446,238,452,217,423,213,474,208,474,217,423,208,474,202,472,217,423,202,472,197,469,217,423,197,469,191,465,217,423,191,465,184,459,217, -423,184,459,109,355,73,140,70,165,68,21,68,21,70,165,68,194,68,21,68,194,43,254,68,21,43,254,40,54,40,54,43,254,24,207,40,54,24,207,23,98,23,98,24,207,17,152,187,320,163,322,168,294,168,294,163,322,144,297,122,294,144,297,163,322,122,294,163,322,113,314,266,87,247,67,254,36,254,36,247,67,226,52,254,36,226,52,224,12,224,12,226,52,204,44,224,12,204,44,190,-1,190,-1,204,44,178,41,278,69,297,110,286,115,278,69,286,115,266,87,278,69,266,87,254,36,159,43,142,47,151,-6,159,43,151,-6,190,-1,159,43,190,-1,178,41,142,47,126,55,151,-6,151,-6,126,55,112,66,151,-6,112,66,105,0,105,0,112,66,100,80,187,320,168,294,186,285,187,320,186,285,198,269,187,320,198,269,209,314,70,216,77,245,73,290,73,290,77,245,88,267,73,290,88,267,113,314,113,314,88,267,103,284,113,314,103,284,122,294,73,290,43,254,68,194,73,290,68,194,70,216,105,0,100,80,87,99,105,0,87,99,79,119,105,0,79,119,73,140,105,0,73,140,68,21,109,355,184,459,81,355,48,355,72,355,135,472,135,472,72,355,157,427,135,472,157,427,178,472,178,472,157,427,242,355,178,472,242,355,266,355,73,140,70,165,68,21,68,21,70,165,68,194,68,21,68,194,43,254,68,21,43,254,40,54,40,54,43,254,24,207,40,54,24,207,23,98,23,98,24,207,17,152,187,320,163,322,168,294,168,294,163,322,144,297,122,294,144,297,163,322,122,294,163,322,113,314,266,87,247,67,254,36,254,36,247,67,226,52,254,36,226,52,224,12,224,12,226,52,204,44,224,12,204,44,190,-1,190,-1,204,44,178,41,284,194,281,215,278,232,284,194,278,232,273,248,284,194,273,248,267,261,284,194,267,261,259,273,284,194,259,273,245,290,284,194,245,290,228,304,284,194,228,304,212,216,284,194,212,216,70,216,284,194,70,216,68,194,198,269,206,246,209,314,209,314,206,246,212,216,209,314,212,216,228,304,278,69,297,110,286,115,278,69,286,115,266,87,278,69,266,87,254,36,159,43,142,47,151,-6,159,43,151,-6,190,-1,159,43,190,-1,178,41,142,47,126,55,151,-6,151,-6,126,55,112,66,151,-6,112, -66,105,0,105,0,112,66,100,80,187,320,168,294,186,285,187,320,186,285,198,269,187,320,198,269,209,314,70,216,77,245,73,290,73,290,77,245,88,267,73,290,88,267,113,314,113,314,88,267,103,284,113,314,103,284,122,294,73,290,43,254,68,194,73,290,68,194,70,216,105,0,100,80,87,99,105,0,87,99,79,119,105,0,79,119,73,140,105,0,73,140,68,21,284,194,281,215,278,232,284,194,278,232,273,248,284,194,273,248,267,261,284,194,267,261,259,273,284,194,259,273,245,290,284,194,245,290,228,304,284,194,228,304,212,216,284,194,212,216,70,216,284,194,70,216,68,194,198,269,206,246,209,314,209,314,206,246,212,216,209,314,212,216,228,304,191,401,193,390,193,412,193,412,193,390,198,380,193,412,198,380,198,421,198,421,198,380,205,373,198,421,205,373,205,429,205,429,205,373,214,368,205,429,214,368,215,433,215,433,214,368,225,366,215,433,225,366,226,435,226,435,225,366,236,368,226,435,236,368,237,433,237,433,236,368,246,373,237,433,246,373,246,428,246,428,246,373,253,380,246,428,253,380,253,421,253,421,253,380,258,390,253,421,258,390,258,412,258,412,258,390,260,401,52,401,53,390,53,412,53,412,53,390,58,380,53,412,58,380,58,421,58,421,58,380,65,373,58,421,65,373,66,429,66,429,65,373,74,368,66,429,74,368,75,433,75,433,74,368,85,366,75,433,85,366,86,435,86,435,85,366,96,368,86,435,96,368,97,433,97,433,96,368,106,373,97,433,106,373,106,428,106,428,106,373,114,380,106,428,114,380,114,421,114,421,114,380,119,390,114,421,119,390,119,412,119,412,119,390,121,401,73,140,70,165,68,21,68,21,70,165,68,194,68,21,68,194,43,254,68,21,43,254,40,54,40,54,43,254,24,207,40,54,24,207,23,98,23,98,24,207,17,152,187,320,163,322,168,294,168,294,163,322,144,297,122,294,144,297,163,322,122,294,163,322,113,314,266,87,247,67,254,36,254,36,247,67,226,52,254,36,226,52,224,12,224,12,226,52,204,44,224,12,204,44,190,-1,190,-1,204,44,178,41,278,69,297,110,286,115,278,69,286,115,266,87,278,69,266,87,254,36,159,43,142,47,151,-6,159,43,151,-6,190, --1,159,43,190,-1,178,41,142,47,126,55,151,-6,151,-6,126,55,112,66,151,-6,112,66,105,0,105,0,112,66,100,80,187,320,168,294,186,285,187,320,186,285,198,269,187,320,198,269,209,314,70,216,77,245,73,290,73,290,77,245,88,267,73,290,88,267,113,314,113,314,88,267,103,284,113,314,103,284,122,294,73,290,43,254,68,194,73,290,68,194,70,216,105,0,100,80,87,99,105,0,87,99,79,119,105,0,79,119,73,140,105,0,73,140,68,21,133,355,161,355,59,459,133,355,59,459,53,465,133,355,53,465,47,469,133,355,47,469,41,472,133,355,41,472,36,474,133,355,36,474,30,474,133,355,30,474,25,422,4,452,5,445,5,460,5,460,5,445,8,439,5,460,8,439,8,466,8,466,8,439,12,433,8,466,12,433,14,471,14,471,12,433,18,427,14,471,18,427,21,473,21,473,18,427,25,422,21,473,25,422,30,474,54,29,44,18,170,0,170,0,44,18,28,13,170,0,28,13,4,10,21,275,27,276,115,322,115,322,27,276,32,276,115,322,32,276,37,276,37,276,46,274,115,322,115,322,46,274,52,270,115,322,52,270,56,262,54,29,170,0,58,46,58,46,170,0,132,19,58,46,132,19,59,73,59,73,132,19,123,30,59,73,123,30,59,232,59,249,59,232,115,322,59,249,115,322,56,262,14,274,21,275,115,322,14,274,115,322,7,284,14,274,7,284,7,273,118,73,118,320,115,322,118,73,115,322,59,232,118,73,59,232,119,47,147,13,132,19,170,0,147,13,170,0,170,10,170,0,4,10,4,0,59,232,123,30,119,47,166,474,170,423,175,473,175,473,170,423,178,428,175,473,178,428,182,471,182,471,178,428,184,434,182,471,184,434,187,466,187,466,184,434,188,440,187,466,188,440,190,460,190,460,188,440,191,446,190,460,191,446,191,452,170,423,166,474,161,474,170,423,161,474,155,472,170,423,155,472,150,469,170,423,150,469,144,465,170,423,144,465,137,459,170,423,137,459,63,355,61,29,51,18,177,0,177,0,51,18,35,13,177,0,35,13,11,10,28,275,34,276,122,322,122,322,34,276,39,276,122,322,39,276,44,276,44,276,53,274,122,322,122,322,53,274,59,270,122,322,59,270,63,262,61, -29,177,0,65,46,65,46,177,0,139,19,65,46,139,19,66,73,66,73,139,19,130,30,66,73,130,30,66,232,66,249,66,232,122,322,66,249,122,322,63,262,21,274,28,275,122,322,21,274,122,322,14,284,21,274,14,284,14,273,125,73,125,320,122,322,125,73,122,322,66,232,125,73,66,232,126,47,154,13,139,19,177,0,154,13,177,0,177,10,177,0,11,10,11,0,66,232,130,30,126,47,63,355,137,459,34,355,-11,355,12,355,75,472,75,472,12,355,97,427,75,472,97,427,118,472,118,472,97,427,182,355,118,472,182,355,205,355,38,29,29,18,154,0,154,0,29,18,13,13,154,0,13,13,-11,10,5,275,11,276,98,322,98,322,11,276,16,276,98,322,16,276,20,276,20,276,29,274,98,322,98,322,29,274,36,270,98,322,36,270,40,262,44,232,44,73,107,30,44,232,107,30,103,47,44,232,103,47,102,73,44,232,102,73,98,322,44,232,98,322,43,249,-1,274,5,275,98,322,-1,274,98,322,-8,284,-1,274,-8,284,-8,273,102,73,102,320,98,322,154,0,154,10,131,13,154,0,131,13,116,19,154,0,116,19,43,46,154,0,43,46,38,29,44,73,43,46,116,19,44,73,116,19,107,30,154,0,-11,10,-11,0,98,322,40,262,43,249,43,29,159,0,47,46,47,46,159,0,121,19,47,46,121,19,48,73,48,73,121,19,112,30,48,73,112,30,48,232,48,232,112,30,108,47,48,232,108,47,107,73,104,322,-3,284,3,274,104,322,3,274,10,275,104,322,10,275,16,276,104,322,16,276,21,276,104,322,21,276,25,276,104,322,25,276,34,274,104,322,34,274,41,270,104,322,41,270,45,262,104,322,45,262,48,249,104,322,48,249,48,232,104,322,48,232,107,73,104,322,107,73,107,320,132,401,134,390,134,412,134,412,134,390,138,380,134,412,138,380,139,421,139,421,138,380,146,373,139,421,146,373,146,429,146,429,146,373,155,368,146,429,155,368,156,433,156,433,155,368,166,366,156,433,166,366,166,435,166,435,166,366,177,368,166,435,177,368,177,433,177,433,177,368,187,373,177,433,187,373,187,428,187,428,187,373,195,380,187,428,195,380,195,421,195,421,195,380,200,390,195,421,200,390,200,412,200,412,200, -390,202,401,136,13,121,19,159,0,136,13,159,0,159,10,159,0,43,29,33,18,159,0,33,18,17,13,159,0,17,13,-6,10,159,0,-6,10,-6,0,-6,401,-4,390,-4,412,-4,412,-4,390,0,380,-4,412,0,380,0,421,0,421,0,380,7,373,0,421,7,373,7,429,7,429,7,373,16,368,7,429,16,368,17,433,17,433,16,368,27,366,17,433,27,366,27,435,27,435,27,366,38,368,27,435,38,368,38,433,38,433,38,368,48,373,38,433,48,373,48,428,48,428,48,373,55,380,48,428,55,380,56,421,56,421,55,380,61,390,56,421,61,390,61,412,61,412,61,390,62,401,3,274,-3,284,-3,273,190,321,172,322,199,295,199,295,172,322,165,302,138,297,165,302,172,322,138,297,172,322,124,314,170,465,165,423,189,402,170,465,189,402,189,457,189,457,189,402,211,380,189,457,211,380,207,445,207,445,211,380,233,426,207,445,233,426,273,480,273,480,233,426,297,459,149,471,126,476,130,445,149,471,130,445,147,436,149,471,147,436,165,423,149,471,165,423,170,465,70,461,92,457,100,478,100,478,92,457,112,452,100,478,112,452,126,476,126,476,112,452,130,445,262,97,251,61,254,18,254,18,251,61,234,35,254,18,234,35,230,4,230,4,234,35,211,18,230,4,211,18,203,-3,203,-3,211,18,184,13,203,-3,184,13,172,-6,172,-6,184,13,145,25,172,-6,145,25,123,0,123,0,145,25,116,57,123,0,116,57,97,102,123,0,97,102,81,21,81,21,97,102,87,151,81,21,87,151,84,197,84,197,87,230,82,291,82,291,87,230,98,259,82,291,98,259,124,314,124,314,98,259,116,282,124,314,116,282,138,297,20,152,28,98,28,208,28,208,28,98,48,54,28,208,48,54,50,255,50,255,48,54,81,21,50,255,81,21,82,291,82,291,81,21,84,197,211,380,228,358,233,426,233,426,228,358,240,334,233,426,240,334,269,389,269,389,240,334,250,309,269,389,250,309,257,280,165,423,80,378,103,357,165,423,103,357,189,402,257,280,262,195,269,389,269,389,262,195,266,141,275,37,266,141,262,97,326,251,315,301,316,111,326,251,316,111,323,139,326,251,323,139,328,169,326,251,328,169,330,199,275,37,293,61,296,347,296,347,293,61,305, -84,296,347,305,84,315,301,315,301,305,84,316,111,269,389,266,141,275,37,269,389,275,37,296,347,262,195,257,280,248,240,248,240,257,280,238,297,248,240,238,297,227,273,227,273,238,297,222,309,227,273,222,309,207,317,207,317,190,321,199,295,207,317,199,295,227,273,262,97,254,18,275,37,51,29,43,19,160,0,160,0,43,19,31,13,160,0,31,13,13,10,13,10,31,13,12,10,18,280,22,281,33,297,33,297,22,281,27,281,33,297,27,281,31,281,31,281,41,280,33,297,33,297,41,280,52,303,33,297,11,291,14,280,33,297,14,280,18,280,41,280,48,275,52,303,52,303,48,275,53,267,52,303,53,267,70,309,70,309,53,267,56,254,70,309,56,254,56,236,116,36,56,236,56,66,116,36,56,66,120,26,120,26,56,66,129,18,113,320,107,322,113,266,113,266,107,322,115,51,113,266,115,51,115,244,113,266,115,244,135,287,135,287,115,244,132,260,135,287,132,260,147,271,89,384,95,393,97,431,97,431,95,393,102,399,97,431,102,399,115,440,115,440,102,399,111,403,115,440,111,403,120,405,120,405,125,404,134,443,134,443,125,404,130,403,134,443,130,403,136,402,84,373,89,384,97,431,84,373,97,431,83,417,84,373,83,417,72,397,84,373,72,397,64,373,134,443,136,402,144,442,144,442,136,402,142,399,144,442,142,399,148,397,148,397,165,389,153,441,153,441,165,389,163,439,134,443,115,440,120,405,153,441,144,442,148,397,163,439,165,389,173,435,173,435,165,389,180,382,173,435,180,382,184,430,184,430,180,382,192,377,184,430,192,377,200,422,200,422,192,377,202,374,200,422,202,374,208,418,208,418,202,374,211,373,208,418,211,373,216,415,216,415,211,373,221,373,216,415,221,373,223,413,223,413,221,373,242,375,223,413,242,375,231,412,231,412,242,375,237,412,231,412,237,412,238,412,246,413,238,412,242,375,246,413,242,375,259,383,135,287,147,271,155,303,155,303,147,271,161,279,155,303,161,279,175,314,175,314,161,279,174,282,175,314,174,282,187,284,187,284,205,281,195,320,195,320,205,281,214,322,115,51,107,322,88,315,115,51,88,315,116,36,195,320,175,314,187,284,233,32,225,21,340,0,340,0,225,21,213,14,340, -0,213,14,195,10,220,273,230,259,243,317,243,317,230,259,236,239,243,317,236,239,238,213,238,213,236,239,238,212,238,213,238,212,302,27,302,27,238,212,238,73,302,27,238,73,310,18,310,18,238,73,237,49,310,18,237,49,340,0,340,0,237,49,233,32,214,322,205,281,220,273,214,322,220,273,243,317,297,59,297,214,293,252,297,59,293,252,283,282,297,59,283,282,298,40,322,13,310,18,340,0,322,13,340,0,340,10,298,40,283,282,266,304,298,40,266,304,243,317,298,40,243,317,238,213,298,40,238,213,302,27,274,447,267,433,273,398,274,447,273,398,285,419,274,447,285,419,295,447,261,423,254,416,259,383,261,423,259,383,273,398,261,423,273,398,267,433,160,0,160,10,142,13,160,0,142,13,129,18,160,0,129,18,55,44,160,0,55,44,51,29,70,309,56,236,116,36,70,309,116,36,88,315,14,280,11,291,11,279,160,0,13,10,13,0,55,44,129,18,56,66,237,412,242,375,238,412,246,413,259,383,254,416,340,0,195,10,194,0,205,355,232,355,131,459,205,355,131,459,124,465,205,355,124,465,118,469,205,355,118,469,112,472,205,355,112,472,107,474,205,355,107,474,101,474,205,355,101,474,97,422,76,452,77,445,77,460,77,460,77,445,79,439,77,460,79,439,80,466,80,466,79,439,84,433,80,466,84,433,85,471,85,471,84,433,90,427,85,471,90,427,92,473,92,473,90,427,97,422,92,473,97,422,101,474,89,128,82,24,96,98,96,98,82,24,123,1,96,98,123,1,107,72,107,72,123,1,120,48,130,35,120,48,123,1,130,35,123,1,172,-6,227,315,178,322,182,301,182,301,178,322,165,302,138,297,165,302,178,322,138,297,178,322,125,314,262,98,252,62,268,24,268,24,252,62,235,35,268,24,235,35,224,1,224,1,235,35,212,18,224,1,212,18,184,13,184,13,169,14,172,-6,172,-6,169,14,155,18,172,-6,155,18,142,25,196,296,209,289,227,315,227,315,209,289,221,279,227,315,221,279,231,267,231,267,243,248,268,293,268,293,243,248,253,225,268,293,253,225,260,199,321,216,300,260,301,60,321,216,301,60,322,107,321,216,322,107,329,162,262,98,268,24,266,143,266,143,268,24,268,293,268,293,268, -24,301,60,268,293,301,60,300,260,268,293,260,199,264,171,268,293,264,171,266,143,268,293,227,315,231,267,184,13,172,-6,224,1,82,24,85,159,84,191,84,191,87,230,82,293,82,293,87,230,98,260,82,293,98,260,125,314,125,314,98,260,115,283,125,314,115,283,138,297,82,24,84,191,82,293,82,24,82,293,49,59,49,59,82,293,49,259,49,59,49,259,28,105,28,105,49,259,28,214,28,105,28,214,20,159,85,159,82,24,89,128,227,315,182,301,196,296,130,35,172,-6,142,25,240,474,244,423,248,473,248,473,244,423,251,428,248,473,251,428,255,471,255,471,251,428,257,434,255,471,257,434,261,466,261,466,257,434,261,440,261,466,261,440,264,460,264,460,261,440,264,446,264,460,264,446,265,452,244,423,240,474,234,474,244,423,234,474,229,472,244,423,229,472,224,469,244,423,224,469,218,465,244,423,218,465,211,459,244,423,211,459,136,355,89,128,82,24,96,98,96,98,82,24,123,1,96,98,123,1,107,72,107,72,123,1,120,48,130,35,120,48,123,1,130,35,123,1,172,-6,227,315,178,322,182,301,182,301,178,322,165,302,138,297,165,302,178,322,138,297,178,322,125,314,262,98,252,62,268,24,268,24,252,62,235,35,268,24,235,35,224,1,224,1,235,35,212,18,224,1,212,18,184,13,184,13,169,14,172,-6,172,-6,169,14,155,18,172,-6,155,18,142,25,196,296,209,289,227,315,227,315,209,289,221,279,227,315,221,279,231,267,231,267,243,248,268,293,268,293,243,248,253,225,268,293,253,225,260,199,321,216,300,260,301,60,321,216,301,60,322,107,321,216,322,107,329,162,262,98,268,24,266,143,266,143,268,24,268,293,268,293,268,24,301,60,268,293,301,60,300,260,268,293,260,199,264,171,268,293,264,171,266,143,268,293,227,315,231,267,184,13,172,-6,224,1,82,24,85,159,84,191,84,191,87,230,82,293,82,293,87,230,98,260,82,293,98,260,125,314,125,314,98,260,115,283,125,314,115,283,138,297,82,24,84,191,82,293,82,24,82,293,49,59,49,59,82,293,49,259,49,59,49,259,28,105,28,105,49,259,28,214,28,105,28,214,20,159,85,159,82,24,89,128,227,315,182,301,196,296,130,35,172,-6,142, -25,136,355,211,459,108,355,63,355,87,355,150,472,150,472,87,355,172,427,150,472,172,427,193,472,193,472,172,427,257,355,193,472,257,355,280,355,89,128,82,24,96,98,96,98,82,24,123,1,96,98,123,1,107,72,107,72,123,1,120,48,130,35,120,48,123,1,130,35,123,1,172,-6,227,315,178,322,182,301,182,301,178,322,165,302,138,297,165,302,178,322,138,297,178,322,125,314,262,98,252,62,268,24,268,24,252,62,235,35,268,24,235,35,224,1,224,1,235,35,212,18,224,1,212,18,184,13,184,13,169,14,172,-6,172,-6,169,14,155,18,172,-6,155,18,142,25,196,296,209,289,227,315,227,315,209,289,221,279,227,315,221,279,231,267,231,267,243,248,268,293,268,293,243,248,253,225,268,293,253,225,260,199,321,216,300,260,301,60,321,216,301,60,322,107,321,216,322,107,329,162,262,98,268,24,266,143,266,143,268,24,268,293,268,293,268,24,301,60,268,293,301,60,300,260,268,293,260,199,264,171,268,293,264,171,266,143,268,293,227,315,231,267,184,13,172,-6,224,1,82,24,85,159,84,191,84,191,87,230,82,293,82,293,87,230,98,260,82,293,98,260,125,314,125,314,98,260,115,283,125,314,115,283,138,297,82,24,84,191,82,293,82,24,82,293,49,59,49,59,82,293,49,259,49,59,49,259,28,105,28,105,49,259,28,214,28,105,28,214,20,159,85,159,82,24,89,128,227,315,182,301,196,296,130,35,172,-6,142,25,82,384,88,393,90,431,90,431,88,393,95,399,90,431,95,399,107,440,107,440,95,399,103,403,107,440,103,403,112,405,112,405,117,404,127,443,127,443,117,404,123,403,127,443,123,403,129,402,77,373,82,384,90,431,77,373,90,431,75,417,77,373,75,417,64,397,77,373,64,397,56,373,127,443,129,402,136,442,136,442,129,402,135,399,136,442,135,399,141,397,141,397,157,389,146,441,146,441,157,389,156,439,127,443,107,440,112,405,146,441,136,442,141,397,156,439,157,389,166,435,166,435,157,389,172,382,166,435,172,382,176,430,176,430,172,382,184,377,176,430,184,377,192,422,192,422,184,377,194,374,192,422,194,374,200,418,200,418,194,374,204,373,200,418,204,373,208,415,208,415,204,373,213,373,208, -415,213,373,216,413,216,413,213,373,235,375,216,413,235,375,223,412,223,412,235,375,230,412,238,413,230,412,235,375,238,413,235,375,252,383,266,447,260,433,266,398,266,447,266,398,277,419,266,447,277,419,287,447,253,423,246,416,252,383,253,423,252,383,266,398,253,423,266,398,260,433,89,128,82,24,96,98,96,98,82,24,123,1,96,98,123,1,107,72,107,72,123,1,120,48,130,35,120,48,123,1,130,35,123,1,172,-6,227,315,178,322,182,301,182,301,178,322,165,302,138,297,165,302,178,322,138,297,178,322,125,314,262,98,252,62,268,24,268,24,252,62,235,35,268,24,235,35,224,1,224,1,235,35,212,18,224,1,212,18,184,13,184,13,169,14,172,-6,172,-6,169,14,155,18,172,-6,155,18,142,25,196,296,209,289,227,315,227,315,209,289,221,279,227,315,221,279,231,267,231,267,243,248,268,293,268,293,243,248,253,225,268,293,253,225,260,199,321,216,300,260,301,60,321,216,301,60,322,107,321,216,322,107,329,162,262,98,268,24,266,143,266,143,268,24,268,293,268,293,268,24,301,60,268,293,301,60,300,260,268,293,260,199,264,171,268,293,264,171,266,143,268,293,227,315,231,267,184,13,172,-6,224,1,82,24,85,159,84,191,84,191,87,230,82,293,82,293,87,230,98,260,82,293,98,260,125,314,125,314,98,260,115,283,125,314,115,283,138,297,82,24,84,191,82,293,82,24,82,293,49,59,49,59,82,293,49,259,49,59,49,259,28,105,28,105,49,259,28,214,28,105,28,214,20,159,85,159,82,24,89,128,227,315,182,301,196,296,130,35,172,-6,142,25,238,413,252,383,246,416,67,401,69,390,69,412,69,412,69,390,74,380,69,412,74,380,74,421,74,421,74,380,81,373,74,421,81,373,81,429,81,429,81,373,90,368,81,429,90,368,91,433,91,433,90,368,101,366,91,433,101,366,102,435,102,435,101,366,112,368,102,435,112,368,112,433,112,433,112,368,122,373,112,433,122,373,122,428,122,428,122,373,130,380,122,428,130,380,130,421,130,421,130,380,135,390,130,421,135,390,135,412,135,412,135,390,137,401,89,128,82,24,96,98,96,98,82,24,123,1,96,98,123,1,107,72,107,72,123,1,120,48,130,35,120, -48,123,1,130,35,123,1,172,-6,227,315,178,322,182,301,182,301,178,322,165,302,138,297,165,302,178,322,138,297,178,322,125,314,206,401,208,390,208,412,208,412,208,390,213,380,208,412,213,380,213,421,213,421,213,380,220,373,213,421,220,373,220,429,220,429,220,373,229,368,220,429,229,368,230,433,230,433,229,368,240,366,230,433,240,366,241,435,241,435,240,366,251,368,241,435,251,368,251,433,251,433,251,368,261,373,251,433,261,373,261,428,261,428,261,373,269,380,261,428,269,380,269,421,269,421,269,380,274,390,269,421,274,390,274,412,274,412,274,390,276,401,262,98,252,62,268,24,268,24,252,62,235,35,268,24,235,35,224,1,224,1,235,35,212,18,224,1,212,18,184,13,184,13,169,14,172,-6,172,-6,169,14,155,18,172,-6,155,18,142,25,196,296,209,289,227,315,227,315,209,289,221,279,227,315,221,279,231,267,231,267,243,248,268,293,268,293,243,248,253,225,268,293,253,225,260,199,321,216,300,260,301,60,321,216,301,60,322,107,321,216,322,107,329,162,262,98,268,24,266,143,266,143,268,24,268,293,268,293,268,24,301,60,268,293,301,60,300,260,268,293,260,199,264,171,268,293,264,171,266,143,268,293,227,315,231,267,184,13,172,-6,224,1,82,24,85,159,84,191,84,191,87,230,82,293,82,293,87,230,98,260,82,293,98,260,125,314,125,314,98,260,115,283,125,314,115,283,138,297,82,24,84,191,82,293,82,24,82,293,49,59,49,59,82,293,49,259,49,59,49,259,28,105,28,105,49,259,28,214,28,105,28,214,20,159,85,159,82,24,89,128,227,315,182,301,196,296,130,35,172,-6,142,25,159,322,161,309,161,334,161,334,161,309,166,299,161,334,166,299,166,345,166,345,166,299,174,291,166,345,174,291,175,353,175,353,174,291,185,285,175,353,185,285,186,359,186,359,185,285,198,284,186,359,198,284,198,361,198,361,198,284,210,286,198,361,210,286,210,359,210,359,210,286,221,291,210,359,221,291,221,353,221,353,221,291,229,299,221,353,229,299,229,344,229,344,229,299,235,309,229,344,235,309,235,333,235,333,235,309,237,321,21,200,21,154,373,154,21,200,373,154,373,200,159,31,161,19,161,44,161,44,161,19,166, -9,161,44,166,9,166,54,166,54,166,9,174,0,166,54,174,0,175,63,175,63,174,0,185,-4,175,63,185,-4,186,68,186,68,185,-4,198,-6,186,68,198,-6,198,70,198,70,198,-6,210,-4,198,70,210,-4,210,68,210,68,210,-4,221,0,210,68,221,0,221,62,221,62,221,0,229,8,221,62,229,8,229,54,229,54,229,8,235,19,229,54,235,19,235,43,235,43,235,19,237,30,88,20,88,20,63,-77,88,20,63,-77,108,8,88,20,108,8,88,139,88,20,88,139,85,165,88,20,85,165,84,194,88,20,84,194,81,292,88,20,81,292,74,31,81,292,49,257,49,59,81,292,49,59,56,50,81,292,56,50,64,41,81,292,64,41,74,31,49,257,28,212,28,104,49,257,28,104,35,87,49,257,35,87,42,70,49,257,42,70,49,59,28,212,20,159,21,140,28,212,21,140,24,122,28,212,24,122,28,104,174,322,166,302,178,301,174,322,178,301,188,321,188,321,178,301,189,299,188,321,189,299,200,320,200,320,189,299,200,294,200,320,200,294,212,318,212,318,200,294,211,287,212,318,211,287,222,277,262,97,252,61,266,25,266,25,252,61,235,35,266,25,235,35,223,1,223,1,235,35,212,18,223,1,212,18,183,13,183,13,169,14,173,-6,173,-6,169,14,159,-6,157,17,146,23,146,-4,157,17,146,-4,159,-6,157,17,159,-6,169,14,122,2,134,-1,125,42,125,42,134,-1,136,31,136,31,134,-1,146,-4,136,31,146,-4,146,23,225,314,222,277,238,256,225,314,238,256,239,309,239,309,238,256,249,234,239,309,249,234,260,298,260,298,249,234,257,212,260,298,257,212,262,191,279,386,239,309,260,298,279,386,260,298,306,386,222,277,111,64,125,42,222,277,125,42,238,256,111,64,101,88,108,8,111,64,108,8,122,2,111,64,122,2,125,42,93,113,88,139,108,8,93,113,108,8,101,88,321,109,329,164,326,197,321,109,326,197,318,227,321,109,318,227,305,254,321,109,305,254,300,62,262,97,266,25,266,142,266,142,266,25,285,277,285,277,266,25,300,62,285,277,300,62,305,254,260,298,262,191,285,277,285,277,262,191,265,167,285,277,265,167,266,142,183,13,173,-6,223,1,98,260,115,283,124,314,124,314,115,283,138,297,124, -314,138,297,174,322,174,322,138,297,166,302,84,194,87,230,81,292,81,292,87,230,98,260,81,292,98,260,124,314,63,-77,88,20,37,-77,212,318,222,277,225,314,209,355,238,355,136,459,209,355,136,459,129,465,209,355,129,465,123,469,209,355,123,469,118,472,209,355,118,472,112,474,209,355,112,474,105,474,209,355,105,474,102,422,80,452,81,445,82,460,82,460,81,445,84,439,82,460,84,439,85,466,85,466,84,439,88,433,85,466,88,433,90,471,90,471,88,433,94,427,90,471,94,427,97,473,97,473,94,427,102,422,97,473,102,422,105,474,109,315,6,315,24,303,109,315,24,303,36,298,109,315,36,298,44,289,109,315,44,289,49,276,109,315,49,276,50,259,109,315,50,259,54,53,109,315,54,53,64,28,109,315,64,28,82,9,109,315,82,9,106,-2,109,315,106,-2,109,89,230,74,227,67,235,53,235,53,227,67,223,61,235,53,223,61,217,55,217,55,206,47,214,29,214,29,206,47,194,41,214,29,194,41,193,12,193,12,194,41,182,37,193,12,182,37,172,1,172,1,182,37,170,34,172,1,170,34,158,34,158,34,142,36,152,-4,152,-4,142,36,135,-6,135,-6,142,36,129,44,135,-6,129,44,118,56,135,-6,118,56,111,71,135,-6,111,71,106,-2,109,89,106,-2,111,71,158,34,152,-4,172,1,233,258,235,53,292,315,292,315,235,53,237,53,292,315,237,53,240,-5,240,-5,237,53,237,-3,235,53,233,258,233,96,235,53,233,96,232,83,235,53,232,83,230,74,217,55,214,29,235,53,315,36,304,40,316,20,316,20,304,40,297,47,316,20,297,47,297,14,297,14,297,47,293,59,297,14,293,59,279,8,279,8,293,59,292,75,279,8,292,75,292,315,292,315,240,-5,260,2,292,315,260,2,279,8,292,315,181,315,203,301,292,315,203,301,218,296,292,315,218,296,227,289,292,315,227,289,232,276,292,315,232,276,233,258,332,35,315,36,316,20,332,35,316,20,336,25,332,35,336,25,336,35,54,53,50,259,50,83,203,301,181,315,181,303,24,303,6,315,6,305,292,315,181,315,203,301,292,315,203,301,218,296,292,315,218,296,227,289,292,315,227,289,232,276,292,315,232,276,233,258,292,315,233,258,235,53,292,315,235, -53,237,53,292,315,237,53,240,-5,292,315,240,-5,260,2,292,315,260,2,279,8,292,315,279,8,292,75,233,258,233,96,235,53,332,35,315,36,316,20,332,35,316,20,336,25,332,35,336,25,336,35,292,75,279,8,293,59,293,59,279,8,297,14,293,59,297,14,297,47,297,47,297,14,316,20,297,47,316,20,304,40,304,40,316,20,315,36,241,474,245,423,250,473,250,473,245,423,253,428,250,473,253,428,257,471,257,471,253,428,259,434,257,471,259,434,262,466,262,466,259,434,263,440,262,466,263,440,265,460,265,460,263,440,265,446,265,460,265,446,266,452,245,423,241,474,236,474,245,423,236,474,230,472,245,423,230,472,225,469,245,423,225,469,219,465,245,423,219,465,212,459,245,423,212,459,138,355,109,315,6,315,24,303,109,315,24,303,36,298,109,315,36,298,44,289,109,315,44,289,49,276,109,315,49,276,50,259,109,315,50,259,54,53,109,315,54,53,64,28,109,315,64,28,82,9,109,315,82,9,106,-2,109,315,106,-2,109,89,230,74,227,67,235,53,235,53,227,67,223,61,235,53,223,61,217,55,217,55,206,47,214,29,214,29,206,47,194,41,214,29,194,41,193,12,193,12,194,41,182,37,193,12,182,37,172,1,172,1,182,37,170,34,172,1,170,34,158,34,158,34,142,36,152,-4,152,-4,142,36,135,-6,135,-6,142,36,129,44,135,-6,129,44,118,56,135,-6,118,56,111,71,135,-6,111,71,106,-2,109,89,106,-2,111,71,158,34,152,-4,172,1,232,83,230,74,235,53,232,83,235,53,233,96,217,55,214,29,235,53,54,53,50,259,50,83,240,-5,237,53,237,-3,24,303,6,315,6,305,138,355,212,459,109,355,203,301,181,315,181,303,292,315,181,315,203,301,292,315,203,301,218,296,292,315,218,296,227,289,292,315,227,289,232,276,292,315,232,276,233,258,292,315,233,258,235,53,292,315,235,53,237,53,292,315,237,53,240,-5,292,315,240,-5,260,2,292,315,260,2,279,8,292,315,279,8,292,75,233,258,233,96,235,53,332,35,315,36,316,20,332,35,316,20,336,25,332,35,336,25,336,35,292,75,279,8,293,59,293,59,279,8,297,14,293,59,297,14,297,47,297,47,297,14,316,20,297,47,316,20,304, -40,304,40,316,20,315,36,63,355,87,355,150,472,150,472,87,355,172,427,150,472,172,427,193,472,193,472,172,427,257,355,193,472,257,355,280,355,109,315,6,315,24,303,109,315,24,303,36,298,109,315,36,298,44,289,109,315,44,289,49,276,109,315,49,276,50,259,109,315,50,259,54,53,109,315,54,53,64,28,109,315,64,28,82,9,109,315,82,9,106,-2,109,315,106,-2,109,89,230,74,227,67,235,53,235,53,227,67,223,61,235,53,223,61,217,55,217,55,206,47,214,29,214,29,206,47,194,41,214,29,194,41,193,12,193,12,194,41,182,37,193,12,182,37,172,1,172,1,182,37,170,34,172,1,170,34,158,34,158,34,142,36,152,-4,152,-4,142,36,135,-6,135,-6,142,36,129,44,135,-6,129,44,118,56,135,-6,118,56,111,71,135,-6,111,71,106,-2,109,89,106,-2,111,71,158,34,152,-4,172,1,232,83,230,74,235,53,232,83,235,53,233,96,217,55,214,29,235,53,54,53,50,259,50,83,240,-5,237,53,237,-3,24,303,6,315,6,305,203,301,181,315,181,303,292,315,181,315,203,301,292,315,203,301,218,296,292,315,218,296,227,289,292,315,227,289,232,276,292,315,232,276,233,258,292,315,233,258,235,53,292,315,235,53,237,53,292,315,237,53,240,-5,292,315,240,-5,260,2,292,315,260,2,279,8,292,315,279,8,292,75,233,258,233,96,235,53,332,35,315,36,316,20,332,35,316,20,336,25,332,35,336,25,336,35,292,75,279,8,293,59,293,59,279,8,297,14,293,59,297,14,297,47,297,47,297,14,316,20,297,47,316,20,304,40,304,40,316,20,315,36,205,401,207,390,207,412,207,412,207,390,212,380,207,412,212,380,212,421,212,421,212,380,219,373,212,421,219,373,220,429,220,429,219,373,228,368,220,429,228,368,229,433,229,433,228,368,239,366,229,433,239,366,240,435,240,435,239,366,251,368,240,435,251,368,251,433,251,433,251,368,260,373,251,433,260,373,261,428,261,428,260,373,268,380,261,428,268,380,268,421,268,421,268,380,273,390,268,421,273,390,273,412,273,412,273,390,275,401,66,401,68,390,68,412,68,412,68,390,73,380,68,412,73,380,73,421,73,421,73,380,80,373,73,421,80,373,81,429,81, -429,80,373,89,368,81,429,89,368,90,433,90,433,89,368,100,366,90,433,100,366,101,435,101,435,100,366,111,368,101,435,111,368,112,433,112,433,111,368,121,373,112,433,121,373,121,428,121,428,121,373,129,380,121,428,129,380,129,421,129,421,129,380,134,390,129,421,134,390,134,412,134,412,134,390,136,401,109,315,6,315,24,303,109,315,24,303,36,298,109,315,36,298,44,289,109,315,44,289,49,276,109,315,49,276,50,259,109,315,50,259,54,53,109,315,54,53,64,28,109,315,64,28,82,9,109,315,82,9,106,-2,109,315,106,-2,109,89,230,74,227,67,235,53,235,53,227,67,223,61,235,53,223,61,217,55,217,55,206,47,214,29,214,29,206,47,194,41,214,29,194,41,193,12,193,12,194,41,182,37,193,12,182,37,172,1,172,1,182,37,170,34,172,1,170,34,158,34,158,34,142,36,152,-4,152,-4,142,36,135,-6,135,-6,142,36,129,44,135,-6,129,44,118,56,135,-6,118,56,111,71,135,-6,111,71,106,-2,109,89,106,-2,111,71,158,34,152,-4,172,1,232,83,230,74,235,53,232,83,235,53,233,96,217,55,214,29,235,53,54,53,50,259,50,83,240,-5,237,53,237,-3,24,303,6,315,6,305,203,301,181,315,181,303,232,474,236,423,241,473,241,473,236,423,244,428,241,473,244,428,248,471,248,471,244,428,249,434,248,471,249,434,253,466,253,466,249,434,254,440,253,466,254,440,256,460,256,460,254,440,256,446,256,460,256,446,257,452,236,423,232,474,226,474,236,423,226,474,221,472,236,423,221,472,216,469,236,423,216,469,210,465,236,423,210,465,203,459,236,423,203,459,128,355,126,-80,119,-87,126,-133,126,-133,119,-87,112,-91,126,-133,112,-91,105,-93,105,-93,103,-93,126,-133,126,-133,103,-93,100,-147,126,-80,149,-107,134,-72,134,-72,149,-107,141,-62,149,-48,141,-62,149,-107,149,-48,149,-107,171,-69,201,82,123,257,139,84,201,82,139,84,147,66,201,82,147,66,155,49,201,82,155,49,162,34,201,82,162,34,167,21,201,82,167,21,169,13,201,82,169,13,171,-69,201,82,171,-69,192,-16,201,82,192,-16,298,269,201,82,298,269,269,275,169,13,169,12,171,-69,171,-69,169,12,169,13,171,-69,169,13,167,2,139,84,123, -257,120,263,139,84,120,263,117,269,139,84,117,269,115,275,139,84,115,275,114,281,139,84,114,281,47,280,47,280,114,281,113,286,113,286,115,293,47,280,47,280,115,293,119,297,47,280,119,297,153,315,153,315,119,297,126,301,153,315,126,301,138,303,271,283,271,281,298,269,298,269,271,281,270,278,298,269,270,278,269,275,333,315,239,315,251,304,333,315,251,304,260,302,333,315,260,302,267,299,333,315,267,299,271,294,333,315,271,294,272,288,333,315,272,288,316,298,333,315,316,298,323,303,333,315,323,303,333,305,272,288,272,287,298,269,272,288,298,269,303,282,272,288,303,282,309,292,272,288,309,292,316,298,272,286,271,283,298,269,272,286,298,269,272,287,272,286,272,287,272,288,171,-69,167,2,163,-12,171,-69,163,-12,157,-30,171,-69,157,-30,149,-48,100,-147,103,-93,100,-92,100,-147,100,-92,96,-91,100,-147,96,-91,92,-90,100,-147,92,-90,88,-88,100,-147,88,-88,80,-85,100,-147,80,-85,73,-82,100,-147,73,-82,70,-151,73,-82,66,-80,70,-151,70,-151,66,-80,58,-79,70,-151,58,-79,53,-149,53,-149,58,-79,51,-79,53,-149,51,-79,41,-80,53,-149,41,-80,40,-144,40,-144,41,-80,33,-85,40,-144,33,-85,30,-135,30,-135,33,-85,27,-92,30,-135,27,-92,23,-124,23,-124,27,-92,23,-101,23,-124,23,-101,21,-111,138,303,153,305,153,315,153,315,10,315,20,303,153,315,20,303,29,300,153,315,29,300,36,295,153,315,36,295,42,289,153,315,42,289,47,280,92,-90,87,-88,88,-88,20,303,10,315,10,305,126,-80,126,-133,149,-107,251,304,239,315,239,305,128,355,203,459,100,355,47,-121,38,-130,172,-151,172,-151,38,-130,24,-135,172,-151,24,-135,3,-138,11,436,13,436,32,455,32,455,13,436,15,437,32,455,15,437,18,437,18,437,33,436,32,455,32,455,33,436,53,461,32,455,6,448,9,436,32,455,9,436,11,436,43,432,49,424,53,461,53,461,49,424,52,413,53,461,52,413,52,398,112,-106,52,398,52,-89,112,-106,52,-89,117,-122,117,-122,52,-89,127,-131,111,266,111,475,107,478,111,266,107,478,111,-83,111,266,111,-83,111,232,111,266,111,232,129,287,329,173,324,224,322,115,322,115,324,224,309,265,322,115,309,265,301,66,301,66,309,265,285, -296,301,66,285,296,270,27,270,27,285,296,269,149,270,27,269,149,265,106,270,27,265,106,254,69,213,275,237,259,252,315,252,315,237,259,255,233,252,315,255,233,285,296,285,296,255,233,265,196,285,296,265,196,269,149,189,320,183,280,213,275,189,320,213,275,212,322,212,322,213,275,252,315,152,-2,166,-5,163,19,163,19,166,-5,184,16,213,22,184,16,229,2,213,22,229,2,237,40,237,40,229,2,270,27,237,40,270,27,254,69,184,16,166,-5,182,-6,184,16,182,-6,229,2,172,-151,172,-138,145,-136,172,-151,145,-136,127,-131,172,-151,127,-131,51,-107,172,-151,51,-107,47,-121,115,50,111,63,125,11,125,11,111,63,111,23,112,-106,111,-83,71,466,112,-106,71,466,53,461,88,472,71,466,111,-83,88,472,111,-83,107,478,116,245,128,258,129,287,129,287,128,258,145,269,129,287,145,269,148,303,148,303,145,269,164,277,148,303,164,277,168,314,168,314,164,277,183,280,168,314,183,280,189,320,115,50,125,11,127,37,127,37,125,11,139,3,127,37,139,3,144,26,144,26,139,3,152,-2,144,26,152,-2,163,19,129,287,111,232,116,245,9,436,6,448,6,435,172,-151,3,-138,3,-151,51,-107,127,-131,52,-89,52,398,112,-106,53,461,53,461,33,436,43,432,208,401,210,390,210,412,210,412,210,390,214,380,210,412,214,380,215,421,215,421,214,380,221,373,215,421,221,373,222,429,222,429,221,373,231,368,222,429,231,368,231,433,231,433,231,368,241,366,231,433,241,366,242,435,242,435,241,366,253,368,242,435,253,368,253,433,253,433,253,368,262,373,253,433,262,373,263,428,263,428,262,373,270,380,263,428,270,380,270,421,270,421,270,380,275,390,270,421,275,390,275,412,275,412,275,390,277,401,69,401,70,390,71,412,71,412,70,390,75,380,71,412,75,380,75,421,75,421,75,380,82,373,75,421,82,373,83,429,83,429,82,373,92,368,83,429,92,368,92,433,92,433,92,368,102,366,92,433,102,366,103,435,103,435,102,366,114,368,103,435,114,368,114,433,114,433,114,368,123,373,114,433,123,373,124,428,124,428,123,373,131,380,124,428,131,380,131,421,131,421,131,380,136,390,131,421,136,390,136,412,136,412,136,390,138,401,126,-80,119,-87,126,-133,126, --133,119,-87,112,-91,126,-133,112,-91,105,-93,105,-93,103,-93,126,-133,126,-133,103,-93,100,-147,126,-80,149,-107,134,-72,134,-72,149,-107,141,-62,149,-48,141,-62,149,-107,149,-48,149,-107,171,-69,201,82,123,257,139,84,201,82,139,84,147,66,201,82,147,66,155,49,201,82,155,49,162,34,201,82,162,34,167,21,201,82,167,21,169,13,201,82,169,13,171,-69,201,82,171,-69,192,-16,201,82,192,-16,298,269,201,82,298,269,269,275,169,13,169,12,171,-69,171,-69,169,12,169,13,171,-69,169,13,167,2,139,84,123,257,120,263,139,84,120,263,117,269,139,84,117,269,115,275,139,84,115,275,114,281,139,84,114,281,47,280,47,280,114,281,113,286,113,286,115,293,47,280,47,280,115,293,119,297,47,280,119,297,153,315,153,315,119,297,126,301,153,315,126,301,138,303,271,283,271,281,298,269,298,269,271,281,270,278,298,269,270,278,269,275,333,315,239,315,251,304,333,315,251,304,260,302,333,315,260,302,267,299,333,315,267,299,271,294,333,315,271,294,272,288,333,315,272,288,316,298,333,315,316,298,323,303,333,315,323,303,333,305,272,288,272,287,298,269,272,288,298,269,303,282,272,288,303,282,309,292,272,288,309,292,316,298,272,286,271,283,298,269,272,286,298,269,272,287,272,286,272,287,272,288,171,-69,167,2,163,-12,171,-69,163,-12,157,-30,171,-69,157,-30,149,-48,100,-147,103,-93,100,-92,100,-147,100,-92,96,-91,100,-147,96,-91,92,-90,100,-147,92,-90,88,-88,100,-147,88,-88,80,-85,100,-147,80,-85,73,-82,100,-147,73,-82,70,-151,73,-82,66,-80,70,-151,70,-151,66,-80,58,-79,70,-151,58,-79,53,-149,53,-149,58,-79,51,-79,53,-149,51,-79,41,-80,53,-149,41,-80,40,-144,40,-144,41,-80,33,-85,40,-144,33,-85,30,-135,30,-135,33,-85,27,-92,30,-135,27,-92,23,-124,23,-124,27,-92,23,-101,23,-124,23,-101,21,-111,138,303,153,305,153,315,153,315,10,315,20,303,153,315,20,303,29,300,153,315,29,300,36,295,153,315,36,295,42,289,153,315,42,289,47,280,92,-90,87,-88,88,-88,20,303,10,315,10,305,126,-80,126,-133,149,-107,251,304,239,315,239,305,205,355,233,355,131,459,205,355,131,459,125,465,205,355,125,465,119,469,205,355,119, -469,113,472,205,355,113,472,107,474,205,355,107,474,102,474,205,355,102,474,98,422,77,452,77,445,78,460,78,460,77,445,80,439,78,460,80,439,81,466,81,466,80,439,84,433,81,466,84,433,86,471,86,471,84,433,90,427,86,471,90,427,93,473,93,473,90,427,98,422,93,473,98,422,102,474,208,474,212,422,216,473,216,473,212,422,219,427,216,473,219,427,223,471,223,471,219,427,225,433,223,471,225,433,229,466,229,466,225,433,229,439,229,466,229,439,232,460,232,460,229,439,232,446,232,460,232,446,233,452,212,422,208,474,202,474,212,422,202,474,196,472,212,422,196,472,191,469,212,422,191,469,185,465,212,422,185,465,178,459,212,422,178,459,105,355,178,459,77,355,105,355,66,355,90,355,152,472,152,472,90,355,174,427,152,472,174,427,196,472,196,472,174,427,259,355,196,472,259,355,284,355,85,384,91,393,93,431,93,431,91,393,98,399,93,431,98,399,111,440,111,440,98,399,106,403,111,440,106,403,116,405,116,405,123,404,130,443,130,443,123,404,129,403,130,443,129,403,137,400,80,373,85,384,93,431,80,373,93,431,79,417,80,373,79,417,68,397,80,373,68,397,59,373,217,373,238,375,225,411,225,411,238,375,233,411,242,412,233,411,238,375,242,412,238,375,255,383,270,447,263,433,269,398,270,447,269,398,281,419,270,447,281,419,291,447,257,423,250,416,255,383,257,423,255,383,269,398,257,423,269,398,263,433,159,439,160,389,169,435,169,435,160,389,175,382,169,435,175,382,179,430,179,430,175,382,188,377,179,430,188,377,195,422,195,422,188,377,198,374,195,422,198,374,207,417,207,417,198,374,207,373,207,417,207,373,217,413,217,413,207,373,217,373,217,413,217,373,225,411,130,443,137,400,140,442,140,442,137,400,147,395,140,442,147,395,149,441,149,441,147,395,160,389,149,441,160,389,159,439,130,443,111,440,116,405,242,412,255,383,250,416,284,383,284,420,66,420,284,383,66,420,66,383,350,539,350,574,0,574,350,539,0,574,0,539,149,400,130,408,137,360,137,360,130,408,114,422,137,360,114,422,109,374,109,374,114,422,103,441,109,374,103,441,95,465,239,439,226,419,230,372,230,372,226,419,212,406,230,372,212,406,204, -359,204,359,212,406,194,399,204,359,194,399,173,397,173,397,149,400,172,355,172,355,149,400,137,360,95,465,75,465,79,427,95,465,79,427,90,397,95,465,90,397,109,374,252,465,239,439,250,394,252,465,250,394,264,425,252,465,264,425,272,465,173,397,172,355,204,359,239,439,230,372,250,394,174,366,185,368,186,433,186,433,185,368,195,373,186,433,195,373,196,429,196,429,195,373,202,380,196,429,202,380,203,421,203,421,202,380,208,389,203,421,208,389,208,412,208,412,208,389,209,401,141,412,142,390,146,421,146,421,142,390,147,380,146,421,147,380,153,428,153,428,147,380,154,373,153,428,154,373,163,433,163,433,154,373,163,368,163,433,163,368,174,435,174,435,163,368,174,366,174,435,174,366,186,433,142,390,141,412,140,401,105,435,105,366,116,433,116,433,105,366,116,368,116,433,116,368,125,428,125,428,116,368,126,373,125,428,126,373,133,421,133,421,126,373,133,380,133,421,133,380,138,412,138,412,133,380,138,390,138,412,138,390,140,401,70,401,72,390,72,412,72,412,72,390,77,380,72,412,77,380,77,421,77,421,77,380,84,373,77,421,84,373,84,429,84,429,84,373,94,368,84,429,94,368,94,433,94,433,94,368,105,366,94,433,105,366,105,435,210,401,212,390,212,412,212,412,212,390,217,380,212,412,217,380,217,421,217,421,217,380,224,373,217,421,224,373,224,429,224,429,224,373,233,368,224,429,233,368,234,433,234,433,233,368,244,366,234,433,244,366,245,435,245,435,244,366,255,368,245,435,255,368,255,433,255,433,255,368,265,373,255,433,265,373,265,428,265,428,265,373,273,380,265,428,273,380,273,421,273,421,273,380,278,390,273,421,278,390,278,412,278,412,278,390,280,401,184,509,180,526,171,525,184,509,171,525,170,505,184,509,211,522,180,526,170,505,171,525,163,494,163,494,171,525,162,524,163,494,162,524,158,481,158,481,162,524,153,521,158,481,153,521,152,469,152,469,153,521,145,518,152,469,145,518,141,465,141,465,145,518,138,513,141,465,138,513,134,466,134,466,138,513,132,508,134,466,132,508,129,469,129,469,132,508,127,502,129,469,127,502,125,473,125,473,127,502,124,496,125,473,124,496,122,478,122,478,124,496,122,490,122, -478,122,490,121,484,253,450,251,472,249,424,249,424,251,472,244,493,249,424,244,493,239,401,239,401,244,493,231,510,239,401,231,510,224,384,224,384,231,510,215,455,214,471,215,455,231,510,214,471,231,510,211,522,214,471,211,522,210,486,211,522,184,509,195,506,211,522,195,506,204,498,211,522,204,498,210,486,212,440,205,426,205,373,212,440,205,373,224,384,212,440,224,384,215,455,177,345,178,369,179,409,179,409,178,369,184,369,179,409,184,369,194,416,194,416,184,369,205,373,194,416,205,373,205,426,177,345,179,409,162,407,177,345,162,407,153,407,177,345,153,407,153,345,219,413,212,401,216,372,216,372,212,401,202,391,216,372,202,391,197,362,197,362,202,391,189,384,197,362,189,384,174,359,174,359,189,384,174,382,177,498,174,474,189,472,177,498,189,472,198,494,198,494,189,472,202,465,198,494,202,465,217,484,217,484,202,465,212,455,217,484,212,455,219,443,245,427,242,449,242,405,242,405,242,449,232,469,242,405,232,469,232,387,232,387,232,469,221,428,219,443,221,428,232,469,219,443,232,469,217,484,219,413,216,372,232,387,219,413,232,387,221,428,139,455,148,465,154,494,154,494,148,465,161,472,154,494,161,472,177,498,177,498,161,472,174,474,135,484,119,469,130,428,135,484,130,428,132,443,135,484,132,443,139,455,135,484,139,455,154,494,138,401,132,413,133,372,133,372,132,413,130,428,160,384,148,391,152,362,160,384,152,362,174,359,160,384,174,359,174,382,138,401,133,372,152,362,138,401,152,362,148,391,105,428,109,406,109,450,109,450,109,406,119,387,109,450,119,387,119,469,119,469,119,387,133,372,119,469,133,372,130,428,297,474,300,422,305,473,305,473,300,422,308,428,305,473,308,428,311,471,311,471,308,428,313,433,311,471,313,433,316,467,316,467,313,433,317,440,316,467,317,440,319,461,319,461,317,440,320,446,319,461,320,446,320,454,300,422,297,474,291,474,300,422,291,474,286,473,300,422,286,473,281,470,300,422,281,470,274,466,300,422,274,466,266,459,300,422,266,459,192,355,188,474,191,422,195,473,195,473,191,422,199,428,195,473,199,428,202,471,202,471,199,428,205,433,202,471,205,433,207,467,207,467,205,433,209,440,207,467,209, -440,211,461,211,461,209,440,211,446,211,461,211,446,212,454,191,422,188,474,182,474,191,422,182,474,177,473,191,422,177,473,172,470,191,422,172,470,165,466,191,422,165,466,158,459,191,422,158,459,84,355,84,355,158,459,55,355,192,355,266,459,165,355,284,472,259,472,198,355,198,355,259,472,175,400,198,355,175,400,152,355,152,355,175,400,91,472,152,355,91,472,66,472,199,350,199,490,161,490,199,350,161,490,161,350,205,490,205,350,243,350,205,490,243,350,243,490,108,490,108,350,145,350,108,490,145,350,145,490,293,355,320,355,219,459,293,355,219,459,211,466,293,355,211,466,205,470,293,355,205,470,199,473,293,355,199,473,194,474,293,355,194,474,188,474,293,355,188,474,185,422,165,454,166,446,166,461,166,461,166,446,168,440,166,461,168,440,169,467,169,467,168,440,172,433,169,467,172,433,174,471,174,471,172,433,177,428,174,471,177,428,180,473,180,473,177,428,185,422,180,473,185,422,188,474,184,355,212,355,109,459,184,355,109,459,102,466,184,355,102,466,95,470,184,355,95,470,90,473,184,355,90,473,84,474,184,355,84,474,79,474,184,355,79,474,76,422,55,454,56,446,57,461,57,461,56,446,58,440,57,461,58,440,60,467,60,467,58,440,62,433,60,467,62,433,65,471,65,471,62,433,68,428,65,471,68,428,71,473,71,473,68,428,76,422,71,473,76,422,79,474,174,468,185,470,186,535,186,535,185,470,195,474,186,535,195,474,196,530,196,530,195,474,202,481,196,530,202,481,203,523,203,523,202,481,208,490,203,523,208,490,208,513,208,513,208,490,209,502,141,513,142,491,146,522,146,522,142,491,147,482,146,522,147,482,153,530,153,530,147,482,154,474,153,530,154,474,163,535,163,535,154,474,163,470,163,535,163,470,174,537,174,537,163,470,174,468,174,537,174,468,186,535,149,400,130,408,137,360,137,360,130,408,114,422,137,360,114,422,109,374,109,374,114,422,103,441,109,374,103,441,95,465,239,439,226,419,230,372,230,372,226,419,212,406,230,372,212,406,204,359,204,359,212,406,194,399,204,359,194,399,173,397,173,397,149,400,172,355,172,355,149,400,137,360,95,465,75,465,79,427,95,465,79,427,90,397,95,465,90,397,109, -374,252,465,239,439,250,394,252,465,250,394,264,425,252,465,264,425,272,465,173,397,172,355,204,359,239,439,230,372,250,394,142,491,141,513,140,502,226,400,230,447,212,413,212,413,230,447,204,461,212,413,204,461,194,420,194,420,204,461,173,423,149,420,173,423,172,465,149,420,172,465,137,460,95,355,103,379,109,446,109,446,103,379,114,398,109,446,114,398,137,460,137,460,114,398,130,412,137,460,130,412,149,420,95,355,109,446,90,423,95,355,90,423,79,392,95,355,79,392,75,355,272,355,264,395,252,355,252,355,264,395,250,426,252,355,250,426,239,381,239,381,250,426,230,447,239,381,230,447,226,400,204,461,172,465,173,423,169,497,148,474,155,444,155,444,148,474,154,434,156,358,154,434,148,474,156,358,148,474,142,370,142,370,148,474,133,448,142,370,133,448,131,389,131,389,133,448,127,419,189,513,169,497,171,473,189,513,171,473,188,490,189,513,188,490,212,508,189,513,212,508,205,522,169,497,155,444,161,458,169,497,161,458,171,473,172,426,169,425,171,353,171,353,169,425,167,425,171,353,167,425,164,424,164,424,161,425,171,353,171,353,161,425,158,426,171,353,158,426,156,358,156,358,158,426,156,428,156,358,156,428,154,431,180,427,184,352,192,426,192,426,184,352,194,353,192,426,194,353,204,423,204,423,194,353,205,357,204,423,205,357,214,417,214,417,205,357,215,365,214,417,215,365,221,407,221,407,215,365,222,376,221,407,222,376,224,392,184,352,180,427,176,427,184,352,176,427,172,426,184,352,172,426,171,353,154,434,156,358,154,431,175,446,178,447,179,520,179,520,178,447,182,448,179,520,182,448,194,515,194,515,182,448,184,448,194,515,184,448,187,448,187,448,190,448,194,515,194,515,190,448,193,447,194,515,193,447,195,445,224,455,220,484,218,425,218,425,220,484,209,503,218,425,209,503,203,399,203,399,209,503,197,439,203,399,197,439,195,429,203,399,195,429,190,416,194,515,195,445,209,503,209,503,195,445,196,442,209,503,196,442,197,439,175,446,179,520,170,446,170,446,179,520,167,522,170,446,167,522,159,447,159,447,167,522,156,520,159,447,156,520,147,450,147,450,156,520,145,516,147,450,145,516,137,457,137,457,145,516,136,508,137, -457,136,508,129,467,129,467,136,508,129,497,129,467,129,497,127,481,182,377,203,399,190,416,182,377,190,416,179,400,182,377,179,400,163,382,182,377,163,382,162,360,163,382,139,365,145,352,163,382,145,352,162,360,171,400,161,416,169,376,169,376,161,416,155,429,169,376,155,429,148,399,148,399,155,429,154,439,156,515,154,439,154,442,156,515,154,442,156,445,169,448,171,520,167,448,167,448,171,520,164,448,161,448,164,448,171,520,161,448,171,520,158,447,158,447,171,520,156,515,158,447,156,515,156,445,176,446,180,446,184,522,184,522,180,446,192,447,184,522,192,447,194,521,194,521,192,447,204,450,194,521,204,450,205,516,205,516,204,450,214,457,205,516,214,457,215,508,215,508,214,457,221,467,215,508,221,467,222,497,222,497,221,467,224,481,172,447,176,446,184,522,172,447,184,522,171,520,172,447,171,520,169,448,154,439,156,515,148,399,148,399,156,515,142,503,148,399,142,503,133,425,133,425,142,503,131,484,133,425,131,484,127,455,189,360,205,352,212,365,189,360,212,365,188,382,189,360,188,382,171,400,189,360,171,400,169,376,324,446,328,447,329,520,329,520,328,447,331,448,329,520,331,448,344,515,344,515,331,448,334,448,344,515,334,448,337,448,337,448,340,448,344,515,344,515,340,448,342,447,344,515,342,447,345,445,373,455,369,484,367,425,367,425,369,484,358,503,367,425,358,503,352,399,352,399,358,503,347,439,352,399,347,439,345,429,352,399,345,429,340,416,344,515,345,445,358,503,358,503,345,445,346,442,358,503,346,442,347,439,324,446,329,520,320,446,320,446,329,520,317,522,320,446,317,522,308,447,308,447,317,522,306,520,308,447,306,520,297,450,297,450,306,520,295,516,297,450,295,516,287,457,287,457,295,516,286,508,287,457,286,508,279,467,279,467,286,508,279,497,279,467,279,497,277,481,332,377,352,399,340,416,332,377,340,416,329,400,332,377,329,400,313,382,332,377,313,382,312,360,313,382,289,365,295,352,313,382,295,352,312,360,205,-156,233,-156,131,-52,205,-156,131,-52,125,-46,205,-156,125,-46,119,-41,205,-156,119,-41,113,-38,205,-156,113,-38,107,-36,205,-156,107,-36,102,-36,205,-156,102,-36,98,-89,77,-58,77,-65,78,-50,78,-50,77, --65,80,-71,78,-50,80,-71,81,-44,81,-44,80,-71,84,-78,81,-44,84,-78,86,-39,86,-39,84,-78,90,-83,86,-39,90,-83,93,-37,93,-37,90,-83,98,-89,93,-37,98,-89,102,-36,208,-36,212,-89,216,-37,216,-37,212,-89,219,-83,216,-37,219,-83,223,-39,223,-39,219,-83,225,-78,223,-39,225,-78,229,-44,229,-44,225,-78,229,-71,229,-44,229,-71,232,-50,232,-50,229,-71,232,-65,232,-50,232,-65,233,-58,212,-89,208,-36,202,-36,212,-89,202,-36,196,-38,212,-89,196,-38,191,-41,212,-89,191,-41,185,-46,212,-89,185,-46,178,-52,212,-89,178,-52,105,-156,178,-52,77,-156,105,-156,189,-36,161,-36,189,-197,189,-197,161,-36,161,-103,189,-197,161,-103,161,-130,161,-130,161,-103,58,-103,161,-130,58,-103,58,-130,189,-197,161,-130,161,-197,58,-36,86,-197,86,-36,86,-103,86,-130,189,-130,86,-103,189,-130,189,-103,86,-197,58,-36,58,-197,241,476,241,372,280,372,241,476,280,372,280,515,241,476,280,515,70,515,241,476,70,515,70,476,357,259,364,267,364,317,364,317,364,267,368,275,364,317,368,275,370,306,370,306,368,275,371,284,370,306,371,284,372,293,329,266,333,246,330,267,330,267,333,246,337,332,337,332,333,246,341,249,337,332,341,249,347,330,347,330,341,249,348,252,347,330,348,252,357,325,357,325,348,252,357,259,357,325,357,259,364,317,307,311,308,291,311,319,311,319,308,291,314,282,311,319,314,282,318,326,318,326,314,282,321,276,318,326,321,276,327,330,327,330,321,276,327,271,327,330,327,271,337,332,337,332,327,271,330,267,327,264,323,261,325,244,327,264,325,244,333,246,327,264,333,246,329,266,318,259,311,257,317,242,318,259,317,242,325,244,318,259,325,244,323,261,317,242,311,257,311,241,308,291,307,311,305,303,127,-151,118,-142,131,-181,131,-181,118,-142,112,-130,131,-181,112,-130,112,-172,112,-172,112,-130,110,-117,98,-157,110,-117,112,-62,98,-157,112,-62,97,-77,152,-49,131,-52,139,-77,152,-49,139,-77,152,-75,152,-49,152,-75,173,-75,152,-49,173,-75,173,-49,131,-52,112,-62,112,-103,131,-52,112,-103,118,-92,131,-52,118,-92,127,-83,131,-52,127,-83,139,-77,112,-62,110,-117,112,-103,88,-138,98,-157,97,-77,88,-138,97,-77,88,-95,88,-138,88,-95,84,-117,152,-185,173,-185,173, --159,152,-185,173,-159,152,-159,152,-185,152,-159,139,-157,152,-185,139,-157,131,-181,112,-172,110,-117,98,-157,127,-151,131,-181,139,-157,189,-36,161,-36,189,-139,189,-139,161,-36,161,-139,189,-139,161,-139,255,-167,255,-167,161,-139,95,-139,255,-167,95,-139,95,-167,189,-139,255,-167,255,-139,161,-167,189,-167,161,-64,161,-64,189,-167,189,-64,161,-64,189,-64,255,-36,255,-36,189,-64,255,-64,95,-36,95,-64,161,-64,95,-36,161,-64,255,-36,188,-36,162,-36,188,-174,188,-174,162,-36,162,-86,188,-174,162,-86,162,-117,162,-117,162,-86,108,-86,162,-117,108,-86,108,-117,188,-117,242,-117,188,-86,188,-86,242,-117,242,-86,188,-174,162,-117,162,-174,242,-117,242,-86,108,-86,242,-117,108,-86,108,-117,250,-185,242,-182,261,-200,261,-200,242,-182,234,-177,261,-200,234,-177,233,-198,233,-198,234,-177,227,-171,233,-198,227,-171,221,-165,221,-165,216,-158,233,-198,233,-198,216,-158,211,-152,233,-198,211,-152,208,-193,208,-193,211,-152,205,-147,208,-193,205,-147,199,-144,297,-142,293,-159,306,-181,306,-181,293,-159,286,-173,306,-181,286,-173,285,-195,285,-195,286,-173,275,-183,285,-195,275,-183,261,-200,261,-200,275,-183,259,-187,261,-200,259,-187,259,-186,337,52,298,52,306,-181,337,52,306,-181,322,-160,337,52,322,-160,333,-134,337,52,333,-134,337,-103,298,-123,297,-142,306,-181,298,-123,306,-181,298,52,191,-143,185,-144,189,-185,191,-143,189,-185,208,-193,191,-143,208,-193,199,-144,179,-146,175,-150,176,-174,179,-146,176,-174,189,-185,179,-146,189,-185,185,-144,173,-155,172,-162,176,-174,173,-155,176,-174,175,-150,250,-185,261,-200,259,-186,259,-187,275,-183,259,-186,349,-173,342,-159,349,-195,349,-195,342,-159,338,-141,349,-195,338,-141,329,-181,329,-181,338,-141,337,-123,329,-181,337,-123,337,52,337,52,298,52,302,-134,337,52,302,-134,313,-160,337,52,313,-160,329,-181,401,-177,393,-182,402,-198,402,-198,393,-182,385,-185,402,-198,385,-185,376,-187,376,-187,360,-183,373,-200,373,-200,360,-183,349,-195,430,-147,424,-152,426,-193,426,-193,424,-152,419,-158,426,-193,419,-158,414,-165,414,-165,408,-171,426,-193,426,-193,408,-171,402,-198,460,-150,455,-146,459,-174,460,-150,459,-174,463,-162,460,-150,463,-162,462,-155,450,-144,444,-143,446,-185,450,-144,446,-185,459,-174,450,-144,459,-174,455,-146,446,-185,444,-143,436,-144,446, --185,436,-144,430,-147,446,-185,430,-147,426,-193,376,-187,373,-200,402,-198,401,-177,402,-198,408,-171,349,-173,349,-195,360,-183,302,-134,298,52,298,-103,174,-151,185,-149,186,-84,186,-84,185,-149,195,-145,186,-84,195,-145,196,-88,196,-88,195,-145,202,-138,196,-88,202,-138,203,-96,203,-96,202,-138,208,-128,203,-96,208,-128,208,-106,208,-106,208,-128,209,-117,141,-106,142,-128,146,-96,146,-96,142,-128,147,-137,146,-96,147,-137,153,-89,153,-89,147,-137,154,-144,153,-89,154,-144,163,-84,163,-84,154,-144,163,-149,163,-84,163,-149,174,-82,174,-82,163,-149,174,-151,174,-82,174,-151,186,-84,142,-128,141,-106,140,-117,105,-83,105,-151,116,-84,116,-84,105,-151,116,-150,116,-84,116,-150,125,-89,125,-89,116,-150,126,-145,125,-89,126,-145,133,-96,133,-96,126,-145,133,-138,133,-96,133,-138,138,-106,138,-106,133,-138,138,-128,138,-106,138,-128,140,-117,70,-117,72,-128,72,-106,72,-106,72,-128,77,-138,72,-106,77,-138,77,-96,77,-96,77,-138,84,-145,77,-96,84,-145,84,-89,84,-89,84,-145,94,-150,84,-89,94,-150,94,-84,94,-84,94,-150,105,-151,94,-84,105,-151,105,-83,210,-117,212,-128,212,-106,212,-106,212,-128,217,-138,212,-106,217,-138,217,-96,217,-96,217,-138,224,-145,217,-96,224,-145,224,-89,224,-89,224,-145,233,-150,224,-89,233,-150,234,-84,234,-84,233,-150,244,-151,234,-84,244,-151,245,-83,245,-83,244,-151,255,-150,245,-83,255,-150,255,-84,255,-84,255,-150,265,-145,255,-84,265,-145,265,-89,265,-89,265,-145,273,-138,265,-89,273,-138,273,-96,273,-96,273,-138,278,-128,273,-96,278,-128,278,-106,278,-106,278,-128,280,-117,219,-132,212,-144,216,-173,216,-173,212,-144,202,-154,216,-173,202,-154,197,-183,197,-183,202,-154,189,-161,197,-183,189,-161,174,-186,174,-186,189,-161,174,-163,177,-47,174,-71,189,-73,177,-47,189,-73,198,-51,198,-51,189,-73,202,-80,198,-51,202,-80,217,-61,217,-61,202,-80,212,-90,217,-61,212,-90,219,-102,245,-117,242,-95,242,-139,242,-139,242,-95,232,-76,242,-139,232,-76,232,-158,232,-158,232,-76,221,-117,219,-102,221,-117,232,-76,219,-102,232,-76,217,-61,219,-132,216,-173,232,-158,219,-132,232,-158,221,-117,139,-90,148,-80,154,-51,154,-51,148,-80,161,-73,154,-51,161,-73,177,-47,177,-47,161,-73,174,-71,135,-61,119,-76,130,-117,135,-61,130, --117,132,-103,135,-61,132,-103,139,-90,135,-61,139,-90,154,-51,138,-144,132,-132,133,-173,133,-173,132,-132,130,-117,160,-161,148,-154,152,-183,160,-161,152,-183,174,-186,160,-161,174,-186,174,-163,138,-144,133,-173,152,-183,138,-144,152,-183,148,-154,105,-117,109,-139,109,-95,109,-95,109,-139,119,-158,109,-95,119,-158,119,-76,119,-76,119,-158,133,-173,119,-76,133,-173,130,-117,175,-151,178,-151,179,-78,179,-78,178,-151,182,-150,179,-78,182,-150,194,-83,194,-83,182,-150,184,-149,194,-83,184,-149,187,-149,187,-149,190,-149,194,-83,194,-83,190,-149,193,-151,194,-83,193,-151,195,-152,224,-144,220,-114,218,-172,218,-172,220,-114,209,-95,218,-172,209,-95,203,-199,203,-199,209,-95,197,-158,203,-199,197,-158,195,-168,203,-199,195,-168,190,-182,194,-83,195,-152,209,-95,209,-95,195,-152,196,-155,209,-95,196,-155,197,-158,175,-151,179,-78,170,-151,170,-151,179,-78,167,-76,170,-151,167,-76,159,-150,159,-150,167,-76,156,-78,159,-150,156,-78,147,-147,147,-147,156,-78,145,-82,147,-147,145,-82,137,-141,137,-141,145,-82,136,-90,137,-141,136,-90,129,-131,129,-131,136,-90,129,-101,129,-131,129,-101,127,-117,182,-221,203,-199,190,-182,182,-221,190,-182,179,-198,182,-221,179,-198,163,-215,182,-221,163,-215,162,-237,163,-215,139,-233,145,-246,163,-215,145,-246,162,-237,148,-149,161,-150,149,-125,149,-125,161,-150,158,-125,171,-123,158,-125,161,-150,171,-123,161,-150,191,-147,146,-70,150,-69,163,0,163,0,150,-69,154,-69,163,0,154,-69,159,-69,159,-69,173,-70,163,0,163,0,173,-70,170,-44,163,0,170,-44,188,0,163,0,134,-69,139,-72,163,0,139,-72,142,-71,163,0,142,-71,146,-70,248,-90,246,-74,245,-111,245,-111,246,-74,238,-60,245,-111,238,-60,233,-127,233,-127,238,-60,226,-51,233,-127,226,-51,215,-139,215,-139,226,-51,209,-45,215,-139,209,-45,196,-94,196,-94,209,-45,195,-85,191,-78,195,-85,209,-45,191,-78,209,-45,188,-43,191,-78,188,-43,184,-43,191,-78,184,-43,183,-73,183,-73,184,-43,181,-43,183,-73,181,-43,178,-43,183,-73,178,-43,174,-44,183,-73,174,-44,173,-70,215,-139,196,-94,194,-105,215,-139,194,-105,191,-147,191,-147,194,-105,189,-113,191,-147,189,-113,181,-119,112,-117,114,-143,123,-120,123,-120,114,-143,125,-146,123,-120,125,-146,132,-122,132,-122,125,-146,137, --148,132,-122,137,-148,141,-124,141,-124,137,-148,148,-149,141,-124,148,-149,149,-125,114,-143,112,-117,102,-138,171,-123,191,-147,181,-119,170,-44,173,-70,174,-44,150,-48,150,-48,150,-48,150,-48,148,0,145,-112,145,-112,148,0,134,-10,145,-112,134,-10,131,-106,131,-106,134,-10,124,-22,131,-106,124,-22,120,-95,120,-95,124,-22,116,-35,120,-95,116,-35,113,-81,113,-81,116,-35,112,-48,113,-81,112,-48,111,-63,154,-29,160,-19,148,0,148,0,160,-19,169,-9,148,0,169,-9,180,0,151,-38,154,-29,148,0,151,-38,148,0,150,-48,162,-115,180,-113,168,-75,168,-75,180,-113,177,-76,185,-75,177,-76,180,-113,185,-75,180,-113,196,-107,240,-62,226,-50,225,-81,225,-81,226,-50,214,-60,225,-81,214,-60,211,-96,211,-96,214,-60,204,-67,211,-96,204,-67,196,-107,196,-107,204,-67,194,-72,196,-107,194,-72,185,-75,162,-115,168,-75,160,-72,162,-115,160,-72,155,-66,162,-115,155,-66,151,-59,162,-115,151,-59,145,-112,150,-48,145,-112,151,-59,189,-163,189,-70,161,-70,189,-163,161,-70,161,-163,246,-164,285,-164,246,-106,246,-106,285,-164,285,-68,246,-106,285,-68,105,-106,105,-106,285,-68,66,-68,105,-106,66,-68,105,-164,105,-164,66,-68,66,-164,161,-101,160,-112,164,-148,164,-148,160,-112,157,-120,164,-148,157,-120,155,-153,155,-153,157,-120,151,-126,155,-153,151,-126,145,-156,145,-156,151,-126,143,-129,145,-156,143,-129,132,-158,132,-158,143,-129,131,-130,191,-111,189,-101,188,-148,188,-148,189,-101,189,-76,188,-148,189,-76,180,-141,180,-141,189,-76,175,-134,189,-76,161,-76,164,-148,189,-76,164,-148,171,-141,189,-76,171,-141,175,-134,254,-111,250,-119,260,-148,260,-148,250,-119,244,-125,260,-148,244,-125,243,-155,243,-155,244,-125,234,-129,243,-155,234,-129,223,-158,223,-158,234,-129,221,-130,284,-76,255,-76,260,-148,284,-76,260,-148,273,-136,284,-76,273,-136,281,-120,284,-76,281,-120,284,-101,255,-101,254,-111,260,-148,255,-101,260,-148,255,-76,195,-119,198,-153,202,-125,202,-125,198,-153,210,-156,202,-125,210,-156,211,-129,211,-129,210,-156,223,-158,211,-129,223,-158,221,-130,191,-111,188,-148,198,-153,191,-111,198,-153,195,-119,120,-129,111,-126,111,-155,120,-129,111,-155,132,-158,120,-129,132,-158,131,-130,111,-126,104,-120,111,-155,111,-155,104,-120,99,-112,111,-155,99,-112,94,-148,94, --148,99,-112,98,-101,94,-148,98,-101,98,-76,98,-76,70,-76,73,-120,98,-76,73,-120,81,-136,98,-76,81,-136,94,-148,73,-120,70,-76,70,-101,161,-101,164,-148,161,-76,284,-50,259,-50,198,-167,198,-167,259,-50,175,-122,198,-167,175,-122,152,-167,152,-167,175,-122,91,-50,152,-167,91,-50,66,-50,66,-167,91,-167,153,-50,153,-50,91,-167,175,-95,153,-50,175,-95,197,-50,197,-50,175,-95,260,-167,197,-50,260,-167,284,-167,151,-112,132,-103,139,-152,139,-152,132,-103,116,-89,139,-152,116,-89,112,-138,112,-138,116,-89,105,-71,112,-138,105,-71,98,-47,241,-73,228,-92,232,-139,232,-139,228,-92,213,-105,232,-139,213,-105,206,-152,206,-152,213,-105,196,-112,206,-152,196,-112,176,-115,176,-115,151,-112,174,-157,174,-157,151,-112,139,-152,98,-47,77,-47,81,-84,98,-47,81,-84,93,-115,98,-47,93,-115,112,-138,253,-47,241,-73,252,-117,253,-47,252,-117,266,-87,253,-47,266,-87,273,-47,176,-115,174,-157,206,-152,241,-73,232,-139,252,-117,228,-105,232,-58,213,-92,213,-92,232,-58,206,-45,213,-92,206,-45,196,-85,196,-85,206,-45,176,-83,151,-85,176,-83,174,-40,151,-85,174,-40,139,-45,98,-151,105,-126,112,-60,112,-60,105,-126,116,-107,112,-60,116,-107,139,-45,139,-45,116,-107,132,-94,139,-45,132,-94,151,-85,98,-151,112,-60,93,-82,98,-151,93,-82,81,-113,98,-151,81,-113,77,-151,273,-151,266,-111,253,-151,253,-151,266,-111,252,-80,253,-151,252,-80,241,-124,241,-124,252,-80,232,-58,241,-124,232,-58,228,-105,206,-45,174,-40,176,-83,85,-140,91,-131,93,-94,93,-94,91,-131,98,-125,93,-94,98,-125,111,-85,111,-85,98,-125,106,-121,111,-85,106,-121,116,-120,116,-120,123,-121,130,-82,130,-82,123,-121,129,-122,130,-82,129,-122,137,-125,80,-152,85,-140,93,-94,80,-152,93,-94,79,-108,80,-152,79,-108,68,-127,80,-152,68,-127,59,-152,217,-152,238,-150,225,-113,225,-113,238,-150,233,-114,242,-113,233,-114,238,-150,242,-113,238,-150,255,-141,270,-78,263,-92,269,-127,270,-78,269,-127,281,-106,270,-78,281,-106,291,-78,257,-102,250,-109,255,-141,257,-102,255,-141,269,-127,257,-102,269,-127,263,-92,159,-86,160,-136,169,-90,169,-90,160,-136,175,-143,169,-90,175,-143,179,-94,179,-94,175,-143,188,-148,179,-94,188,-148,195,-102,195,-102,188,-148,198,-150,195,-102,198, --150,207,-108,207,-108,198,-150,207,-152,207,-108,207,-152,217,-111,217,-111,207,-152,217,-152,217,-111,217,-152,225,-113,130,-82,137,-125,140,-82,140,-82,137,-125,147,-129,140,-82,147,-129,149,-84,149,-84,147,-129,160,-136,149,-84,160,-136,159,-86,130,-82,111,-85,116,-120,242,-113,255,-141,250,-109,284,-136,284,-97,66,-97,284,-136,66,-97,66,-136,350,-133,350,-97,0,-97,350,-133,0,-97,0,-133,0,-97,0,-133,350,-133,0,-97,350,-133,350,-97,0,-174,0,-209,350,-209,0,-174,350,-209,350,-174,81,162,87,171,89,209,89,209,87,171,94,177,89,209,94,177,106,217,106,217,94,177,102,181,106,217,102,181,111,182,111,182,118,182,126,220,126,220,118,182,125,180,126,220,125,180,133,177,76,150,81,162,89,209,76,150,89,209,74,194,76,150,74,194,63,175,76,150,63,175,55,150,194,152,203,150,203,194,203,194,203,150,213,150,203,194,213,150,213,191,213,191,213,150,234,153,213,191,234,153,221,189,221,189,234,153,229,188,238,190,229,188,234,153,238,190,234,153,251,161,266,224,259,211,265,175,266,224,265,175,277,196,266,224,277,196,286,224,252,200,246,194,251,161,252,200,251,161,265,175,252,200,265,175,259,211,155,216,156,166,165,212,165,212,156,166,172,159,165,212,172,159,175,208,175,208,172,159,184,155,175,208,184,155,191,200,191,200,184,155,194,152,191,200,194,152,203,194,126,220,133,177,135,220,135,220,133,177,143,173,135,220,143,173,145,218,145,218,143,173,156,166,145,218,156,166,155,216,126,220,106,217,111,182,238,190,251,161,246,194,281,161,281,192,67,192,281,161,67,192,67,161,350,161,350,192,0,192,350,161,0,192,0,161,307,406,270,406,70,-51,307,406,70,-51,108,-51,358,463,320,463,70,-108,358,463,70,-108,108,-108,105,-49,84,-49,105,-49,105,-49,84,-49,105,-75,105,-49,105,-75,127,-52,127,-52,105,-75,118,-77,127,-52,118,-77,130,-83,146,-130,140,-142,145,-172,145,-172,140,-142,130,-151,145,-172,130,-151,127,-181,127,-181,130,-151,118,-157,127,-181,118,-157,105,-159,145,-172,160,-157,146,-130,146,-130,160,-157,148,-117,146,-103,148,-117,160,-77,146,-103,160,-77,145,-62,145,-62,127,-52,130,-83,145,-62,130,-83,140,-92,145,-62,140,-92,146,-103,170,-95,160,-77,160, --157,170,-95,160,-157,170,-138,170,-95,170,-138,173,-117,148,-117,160,-157,160,-77,105,-185,127,-181,105,-159,105,-185,105,-159,84,-159,105,-185,84,-159,84,-185,105,-75,84,-49,84,-75,105,-94,105,-36,66,-36,105,-94,66,-36,66,-132,105,-94,66,-132,285,-132,105,-94,285,-132,246,-94,246,-36,246,-94,285,-132,246,-36,285,-132,285,-36,117,-158,145,-130,117,-36,117,-36,145,-130,145,-64,117,-36,145,-64,233,-36,233,-36,145,-64,205,-64,233,-36,205,-64,233,-158,233,-158,205,-64,205,-130,233,-158,205,-130,145,-130,145,-130,117,-158,233,-158,129,-46,116,-44,128,-86,128,-86,116,-44,111,-83,107,-84,111,-83,108,-45,107,-84,108,-45,101,-85,101,-85,108,-45,100,-47,101,-85,100,-47,92,-87,92,-87,100,-47,91,-50,92,-87,91,-50,82,-91,82,-91,91,-50,82,-56,82,-91,82,-56,70,-63,141,-93,152,-103,153,-56,153,-56,152,-103,160,-116,153,-56,160,-116,164,-67,164,-67,160,-116,169,-131,164,-67,169,-131,175,-82,175,-82,169,-131,183,-131,175,-82,183,-131,187,-67,187,-67,183,-131,191,-115,187,-67,191,-115,199,-56,199,-56,191,-115,200,-102,199,-56,200,-102,211,-49,211,-49,200,-102,209,-92,211,-49,209,-92,220,-86,235,-44,232,-83,238,-83,235,-44,238,-83,245,-45,245,-45,238,-83,246,-84,245,-45,246,-84,253,-47,253,-47,246,-84,255,-87,253,-47,255,-87,261,-51,261,-51,255,-87,267,-91,261,-51,267,-91,270,-56,270,-56,267,-91,280,-98,270,-56,280,-98,280,-63,223,-46,211,-49,220,-86,223,-46,220,-86,232,-83,223,-46,232,-83,235,-44,141,-93,153,-56,141,-49,141,-93,141,-49,129,-46,141,-93,129,-46,128,-86,116,-44,108,-45,111,-83,82,-91,70,-63,70,-98,195,434,241,481,223,501,195,434,223,501,175,454,195,434,175,454,222,367,195,434,222,367,240,388,111,388,129,369,155,434,155,434,129,369,175,414,155,434,175,414,175,454,175,454,175,414,222,367,128,501,108,481,155,434,128,501,155,434,175,454,168,390,162,383,166,359,166,359,162,383,152,376,166,359,152,376,138,370,182,511,180,517,187,370,187,370,180,517,180,524,173,407,172,398,187,370,187,370,172,398,168,390,187,370,168,390,166,359,200,555,212,560,212,580,200,555,212,580,191,549,191,549,212,580,187,572,191,549,187,572,185,542,185,542,187,572,181,534,180, -524,181,534,167,561,180,524,167,561,171,423,180,524,171,423,173,415,180,524,173,415,173,407,167,561,153,546,154,461,167,561,154,461,162,445,167,561,162,445,167,432,167,561,167,432,171,423,142,500,143,491,144,529,144,529,143,491,146,481,144,529,146,481,153,546,153,546,146,481,149,471,153,546,149,471,154,461,210,442,207,452,209,402,209,402,207,452,202,464,209,402,202,464,201,385,201,385,202,464,195,480,201,385,195,480,189,493,210,442,209,402,212,423,210,442,212,423,211,433,187,370,201,385,189,493,187,370,189,493,184,503,187,370,184,503,182,511,173,407,187,370,180,524,166,359,138,370,138,349,142,500,144,529,141,509,167,561,181,534,187,572,0,649,0,615,350,615,0,649,350,615,350,649,0,574,0,539,350,539,0,574,350,539,350,574,159,377,198,377,159,439,159,439,198,377,198,477,159,439,198,477,38,439,38,439,198,477,0,477,38,439,0,477,38,377,38,377,0,477,0,377,91,481,97,490,100,529,100,529,97,490,104,497,100,529,104,497,117,538,117,538,104,497,113,500,117,538,113,500,122,502,122,502,127,501,137,541,137,541,127,501,133,500,137,541,133,500,138,499,86,470,91,481,100,529,86,470,100,529,85,514,86,470,85,514,74,494,86,470,74,494,66,470,91,384,97,393,100,431,100,431,97,393,104,399,100,431,104,399,117,440,117,440,104,399,113,403,117,440,113,403,122,405,122,405,127,404,137,443,137,443,127,404,133,403,137,443,133,403,138,402,86,373,91,384,100,431,86,373,100,431,85,417,86,373,85,417,74,397,86,373,74,397,66,373,137,443,138,402,146,442,146,442,138,402,144,399,146,442,144,399,151,397,151,397,166,389,155,441,155,441,166,389,165,439,137,443,117,440,122,405,137,541,138,499,146,540,146,540,138,499,144,497,146,540,144,497,151,495,151,495,166,487,155,538,155,538,166,487,165,536,137,541,117,538,122,502,155,441,146,442,151,397,165,439,166,389,175,435,175,435,166,389,182,382,175,435,182,382,185,430,185,430,182,382,194,377,185,430,194,377,202,422,202,422,194,377,204,374,202,422,204,374,210,418,210,418,204,374,213,373,210,418,213,373,218,415,218,415,213,373,223,373,218,415,223,373,226,413,226,413,223, -373,244,375,226,413,244,375,233,412,233,412,244,375,239,412,248,413,239,412,244,375,248,413,244,375,262,383,155,538,146,540,151,495,165,536,166,487,175,532,175,532,166,487,182,480,175,532,182,480,185,528,185,528,182,480,194,475,185,528,194,475,202,520,202,520,194,475,204,472,202,520,204,472,210,516,210,516,204,472,213,470,210,516,213,470,218,513,218,513,213,470,223,470,218,513,223,470,226,510,226,510,223,470,244,472,226,510,244,472,233,509,233,509,244,472,239,509,248,510,239,509,244,472,248,510,244,472,262,480,277,544,270,530,276,495,277,544,276,495,287,516,277,544,287,516,297,544,263,520,256,514,262,480,263,520,262,480,276,495,263,520,276,495,270,530,277,447,270,433,276,398,277,447,276,398,287,419,277,447,287,419,297,447,263,423,256,416,262,383,263,423,262,383,276,398,263,423,276,398,270,433,248,413,262,383,256,416,248,510,262,480,256,514,190,-196,187,-177,187,-255,187,-255,187,-177,185,-158,185,-144,185,-158,189,-151,185,-144,189,-151,204,-131,204,-131,189,-151,210,-141,172,-151,177,-158,177,-144,177,-144,177,-158,182,-44,182,-44,177,-158,182,-256,182,-44,182,-256,187,-45,187,-45,182,-256,185,-144,185,-144,187,-124,187,-45,187,-45,187,-124,190,-105,187,-45,190,-105,192,-48,192,-48,190,-105,195,-88,192,-48,195,-88,196,-52,196,-52,195,-88,198,-74,196,-52,198,-74,199,-58,199,-58,198,-74,200,-63,177,-158,176,-177,176,-255,177,-158,176,-255,182,-256,163,-237,164,-242,165,-226,165,-226,164,-242,167,-247,165,-226,167,-247,168,-212,168,-212,167,-247,171,-252,168,-212,171,-252,172,-196,172,-196,171,-252,176,-255,172,-196,176,-255,176,-177,185,-158,205,-171,189,-151,189,-151,205,-171,208,-160,208,-160,205,-171,221,-186,208,-160,221,-186,225,-166,225,-166,221,-186,233,-199,225,-166,233,-199,241,-171,241,-171,233,-199,244,-209,241,-171,244,-209,254,-174,254,-174,244,-209,255,-212,254,-174,255,-212,263,-178,263,-178,255,-212,261,-211,263,-178,261,-211,267,-209,247,-91,239,-98,243,-131,247,-91,243,-131,255,-128,247,-91,255,-128,250,-90,258,-88,263,-124,263,-89,263,-89,263,-124,268,-122,263,-89,268,-122,268,-93,268,-93,268,-122,271,-119,268,-93,271,-119,272,-97,272,-97,271,-119,273,-116,272,-97,273,-116,274,-103,274,-103,273,-116,275, --113,274,-103,275,-113,275,-109,256,-88,254,-89,255,-128,256,-88,255,-128,263,-124,256,-88,263,-124,258,-88,252,-89,250,-90,255,-128,252,-89,255,-128,254,-89,204,-131,210,-141,218,-119,218,-119,210,-141,228,-135,218,-119,228,-135,229,-108,229,-108,228,-135,243,-131,229,-108,243,-131,239,-98,185,-158,185,-144,182,-256,185,-158,182,-256,187,-255,273,-194,273,-191,273,-200,273,-200,273,-191,272,-187,273,-200,272,-187,270,-205,270,-205,272,-187,270,-184,270,-205,270,-184,267,-181,267,-181,263,-178,267,-209,267,-181,267,-209,270,-205,190,-196,192,-252,195,-212,195,-212,192,-252,196,-247,195,-212,196,-247,198,-226,198,-226,196,-247,199,-242,198,-226,199,-242,200,-237,172,-105,176,-124,176,-45,176,-45,176,-124,177,-144,176,-45,177,-144,182,-44,164,-58,165,-74,167,-52,167,-52,165,-74,168,-89,167,-52,168,-89,171,-48,171,-48,168,-89,172,-105,171,-48,172,-105,176,-45,126,-202,137,-192,139,-165,139,-165,137,-192,149,-180,139,-165,149,-180,156,-159,156,-159,149,-180,162,-168,156,-159,162,-168,172,-151,172,-151,162,-168,177,-158,122,-170,108,-174,110,-212,122,-170,110,-212,113,-211,122,-170,113,-211,116,-210,122,-170,116,-210,118,-208,122,-170,118,-208,126,-202,122,-170,126,-202,139,-165,108,-174,98,-178,99,-211,108,-174,99,-211,105,-212,108,-174,105,-212,108,-212,108,-174,108,-212,110,-212,94,-209,99,-211,98,-178,94,-209,98,-178,94,-181,94,-209,94,-181,91,-185,94,-209,91,-185,90,-206,89,-189,88,-193,88,-202,89,-189,88,-202,90,-206,89,-189,90,-206,91,-185,135,-110,138,-138,148,-122,148,-122,138,-138,156,-144,148,-122,156,-144,162,-134,162,-134,156,-144,172,-151,162,-134,172,-151,177,-144,124,-99,114,-91,121,-133,124,-99,121,-133,138,-138,124,-99,138,-138,135,-110,121,-133,114,-91,112,-90,121,-133,112,-90,109,-89,121,-133,109,-89,107,-89,121,-133,107,-89,106,-128,106,-128,107,-89,105,-88,106,-128,105,-88,104,-88,106,-128,104,-88,98,-89,106,-128,98,-89,95,-123,93,-93,89,-97,90,-119,93,-93,90,-119,92,-121,93,-93,92,-121,95,-123,93,-93,95,-123,98,-89,86,-109,86,-113,87,-103,87,-103,86,-113,88,-116,87,-103,88,-116,89,-97,89,-97,88,-116,90,-119,88,-202,88,-193,88,-197,165,-74,164,-58,163,-63,190,-196,187,-255,192,-252,542,-52,522,-52,525,-101,525,-101,522,-52,500,-82,525, --101,500,-82,480,-133,480,-133,500,-82,455,-101,480,-133,455,-101,422,-152,422,-152,455,-101,401,-113,422,-152,401,-113,360,-160,360,-160,401,-113,348,-119,360,-160,348,-119,309,-162,309,-162,348,-119,309,-120,118,-82,95,-52,137,-133,118,-82,137,-133,162,-101,162,-101,137,-133,196,-152,162,-101,196,-152,216,-113,216,-113,196,-152,257,-160,216,-113,257,-160,269,-119,269,-119,257,-160,309,-162,269,-119,309,-162,309,-120,95,-52,75,-52,93,-101,95,-52,93,-101,137,-133,80,373,89,387,92,422,92,422,89,387,104,397,92,422,104,397,119,435,119,435,104,397,124,402,119,435,124,402,149,441,149,441,124,402,144,404,149,441,144,404,164,405,180,443,164,405,167,405,180,443,167,405,169,405,71,402,59,373,80,373,71,402,80,373,92,422,439,402,401,407,434,363,439,402,434,363,471,362,439,402,471,362,474,401,434,363,401,407,396,367,396,367,401,407,363,413,396,367,363,413,359,373,359,373,363,413,325,420,359,373,325,420,322,381,322,381,325,420,291,428,322,381,291,428,286,389,286,389,291,428,269,433,286,389,269,433,265,394,265,394,269,433,247,437,265,394,247,437,243,398,243,398,247,437,224,440,243,398,224,440,221,402,221,402,224,440,202,442,221,402,202,442,199,404,199,404,202,442,180,443,199,404,180,443,177,405,481,400,502,363,484,400,484,400,502,363,487,400,506,400,487,400,502,363,506,400,502,363,532,370,591,433,571,433,580,403,580,403,571,433,562,417,580,403,562,417,559,382,559,382,562,417,546,408,559,382,546,408,532,370,532,370,546,408,527,403,532,370,527,403,506,400,502,363,481,400,478,401,502,363,478,401,476,401,502,363,476,401,474,401,502,363,474,401,471,362,180,443,169,405,172,405,180,443,172,405,175,405,180,443,175,405,177,405,164,405,180,443,149,441,522,355,525,404,500,385,500,385,525,404,480,436,500,385,480,436,455,404,455,404,480,436,422,454,455,404,422,454,401,416,401,416,422,454,360,463,401,416,360,463,348,421,348,421,360,463,309,423,269,421,309,423,309,465,269,421,309,465,257,463,95,355,118,385,137,436,137,436,118,385,162,404,137,436,162,404,196,454,196,454,162,404,216,416,196,454,216,416,257,463,257,463,216,416,269,421,93,404,75,355,95,355,93,404,95, -355,137,436,360,463,309,465,309,423,525,404,522,355,542,355,514,-145,519,-173,515,-144,515,-144,519,-173,515,-142,515,-92,515,-142,519,-173,515,-92,519,-173,516,-90,516,-90,519,-173,520,-60,520,-60,519,-173,534,-158,520,-60,534,-158,534,-75,534,-75,534,-158,550,-144,534,-75,550,-144,550,-89,550,-89,550,-144,566,-131,550,-89,566,-131,566,-101,566,-101,566,-131,584,-122,566,-101,584,-122,584,-111,520,-60,506,-44,511,-81,520,-60,511,-81,513,-83,520,-60,513,-83,514,-85,520,-60,514,-85,515,-86,520,-60,515,-86,515,-88,520,-60,515,-88,516,-90,507,-136,510,-136,508,-97,510,-96,508,-97,510,-136,510,-96,510,-136,512,-95,512,-95,510,-136,512,-137,512,-95,512,-137,514,-93,514,-93,512,-137,514,-138,514,-93,514,-138,515,-92,515,-92,514,-138,515,-140,515,-92,515,-140,515,-142,511,-151,492,-175,505,-188,511,-151,505,-188,519,-173,511,-151,519,-173,513,-149,59,-97,59,-136,507,-136,59,-97,507,-136,508,-97,514,-147,513,-149,519,-173,514,-147,519,-173,514,-145,511,-81,506,-44,492,-58,58,295,58,270,63,306,63,306,58,270,64,259,63,306,64,259,72,314,72,314,64,259,72,251,72,314,72,251,83,319,83,319,72,251,83,246,83,319,83,246,95,321,95,321,83,246,95,244,95,321,95,244,107,319,107,319,95,244,107,246,107,319,107,246,118,313,118,313,107,246,118,251,118,313,118,251,126,305,126,305,118,251,126,259,126,305,126,259,132,294,132,294,126,259,132,270,132,294,132,270,134,282,105,-2,109,-1,115,68,115,68,109,-1,113,-1,115,68,113,-1,116,-1,116,-1,119,-1,131,60,131,60,119,-1,122,-3,131,60,122,-3,124,-5,56,32,58,20,58,45,58,45,58,20,63,10,58,45,63,10,64,56,64,56,63,10,71,2,64,56,71,2,73,64,73,64,71,2,82,-1,73,64,82,-1,84,69,84,69,82,-1,97,-3,84,69,97,-3,98,71,98,71,97,-3,101,-3,98,71,101,-3,115,68,115,68,101,-3,105,-2,153,9,150,30,150,-16,150,-16,150,30,143,47,150,-16,143,47,140,-40,140,-40,143,47,131,60,140,-40,131,60,126,-10,126,-10,124,-63,140,-40,131,60,124,-5,125,-7,131,60,125,-7,126,-10,131,60,115,68,116,-1,124,-63,126,-10,123,-24,124,-63,123,-24,116,-39,124,-63,116,-39,105, --54,124,-63,105,-54,102,-82,89,-69,68,-84,75,-97,89,-69,75,-97,102,-82,89,-69,102,-82,105,-54,58,270,58,295,56,282,147,463,149,412,153,463,153,463,149,412,155,419,153,463,155,419,158,460,158,460,155,419,161,426,158,460,161,426,163,456,163,456,161,426,165,432,163,456,165,432,167,450,167,450,165,432,167,438,167,450,167,438,168,443,149,412,147,463,139,463,149,412,139,463,132,461,149,412,132,461,127,458,149,412,127,458,123,453,149,412,123,453,120,448,149,412,120,448,103,355,103,355,120,448,79,355,14,400,14,379,19,410,19,410,14,379,19,369,19,410,19,369,27,417,27,417,19,369,27,362,27,417,27,362,36,422,36,422,27,362,36,357,36,422,36,357,47,424,47,424,36,357,47,355,47,424,47,355,58,422,58,422,47,355,58,357,58,422,58,357,67,417,67,417,58,357,67,362,67,417,67,362,75,410,75,410,67,362,75,369,75,410,75,369,80,400,80,400,75,369,80,379,80,400,80,379,82,390,153,400,153,379,158,410,158,410,153,379,158,369,158,410,158,369,166,417,166,417,158,369,166,362,166,417,166,362,175,422,175,422,166,362,175,357,175,422,175,357,186,424,186,424,175,357,186,355,186,424,186,355,197,422,197,422,186,355,197,357,197,422,197,357,207,417,207,417,197,357,207,362,207,417,207,362,214,410,214,410,207,362,214,369,214,410,214,369,219,400,219,400,214,369,219,379,219,400,219,379,221,390,147,463,149,412,153,463,153,463,149,412,155,419,153,463,155,419,158,460,158,460,155,419,161,426,158,460,161,426,163,456,163,456,161,426,165,432,163,456,165,432,167,450,167,450,165,432,167,438,167,450,167,438,168,443,149,412,147,463,139,463,149,412,139,463,132,461,149,412,132,461,127,458,149,412,127,458,123,453,149,412,123,453,120,448,149,412,120,448,103,355,103,355,120,448,79,355,153,379,153,400,152,390,14,379,14,400,13,390,147,478,149,427,153,477,153,477,149,427,155,434,153,477,155,434,158,475,158,475,155,434,161,441,158,475,161,441,163,471,163,471,161,441,165,447,163,471,165,447,167,465,167,465,165,447,167,453,167,465,167,453,168,458,149,427,147,478,139,477,149,427,139,477,132,475,149,427,132,475,127,472,149, -427,127,472,123,468,149,427,123,468,120,462,149,427,120,462,103,370,120,462,79,370,103,370,77,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,243,472,107,71,139,152,243,472,139,152,152,180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,257,472,362,25,358,21,495,0,495,0,358,21,353,18,495,0,353,18,348,16,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,243,472,152,180,232,373,243,472,232,373,313,180,243,472,313,180,257,472,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107,71,243,472,476,17,462,24,495,0,476,17,495,0,495,13,364,31,362,25,495,0,364,31,495,0,365,37,316,13,316,0,495,0,316,13,495,0,348,16,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,59,295,59,270,64,306,64,306,59,270,65,259,64,306,65,259,73,314,73,314,65,259,73,251,73,314,73,251,83,319,83,319,73,251,84,246,83,319,84,246,96,321,96,321,84,246,96,244,96,321,96,244,108,319,108,319,96,244,108,246,108,319,108,246,119,313,119,313,108,246,119,251,119,313,119,251,127,305,127,305,119,251,127,259,127,305,127,259,132,294,132,294,127,259,132,270,132,294,132,270,134,282,59,270,59,295,57,282,150,441,161,430,477,463,477,463,161,430,253,436,477,463,253,436,263,437,263,437,349,435,477,463,477,463,349,435,405,429,477,463,405,429,438,416,477,463,438,416,454,395,477,463,454,395,463,363,477,463,463,363,480,363,167,385,241,44,239,59,239,258,239,229,345,229,239,258,345,229,345,258,375,259,345,258,375,227,375,259,375,227,396,265,396,265,375,227,396,222,396,265,396,222,409,277,409,277,396,222,409,210,409,277,409, -210,418,297,418,297,409,210,418,191,418,297,418,191,423,325,423,325,418,191,423,161,423,325,423,161,440,161,167,385,239,59,239,412,167,385,239,412,240,423,167,385,240,423,242,430,167,385,242,430,246,434,167,385,246,434,166,411,246,434,253,436,161,430,246,434,161,430,166,411,133,447,150,441,477,463,133,447,477,463,106,463,133,447,106,463,106,450,453,53,420,37,484,0,484,0,420,37,374,28,484,0,374,28,309,26,309,26,282,26,484,0,484,0,282,26,262,29,484,0,262,29,161,34,161,34,262,29,166,52,484,0,516,118,496,118,484,0,496,118,477,80,484,0,477,80,453,53,167,80,166,52,249,35,167,80,249,35,241,44,167,80,241,44,167,385,484,0,161,34,151,23,484,0,151,23,133,17,484,0,133,17,106,13,484,0,106,13,106,0,73,478,76,427,79,477,79,477,76,427,82,434,79,477,82,434,85,475,85,475,82,434,87,441,85,475,87,441,90,471,90,471,87,441,91,447,90,471,91,447,93,465,93,465,91,447,94,453,93,465,94,453,95,458,76,427,73,478,65,477,76,427,65,477,59,475,76,427,59,475,54,472,76,427,54,472,50,468,76,427,50,468,47,462,76,427,47,462,30,370,47,462,5,370,30,370,345,258,345,229,375,227,423,325,440,161,440,325,166,52,262,29,249,35,302,450,302,450,276,447,276,447,302,450,302,463,276,447,302,463,258,441,258,441,302,463,167,411,258,441,167,411,168,384,240,53,168,384,168,85,240,53,168,85,246,35,246,35,168,85,256,23,168,384,240,53,239,79,239,252,239,220,452,220,239,252,452,220,452,252,452,252,452,220,530,35,452,252,530,35,524,52,168,384,239,79,239,384,168,384,239,384,241,411,168,384,241,411,246,429,168,384,246,429,258,441,302,463,105,463,133,447,302,463,133,447,151,441,302,463,151,441,161,429,302,463,161,429,167,411,446,37,435,24,585,0,585,0,435,24,417,17,585,0,417,17,390,13,559,447,585,450,585,463,559,447,585,463,541,440,541,440,585,463,450,411,541,440,450,411,452,384,524,52,452,384,452,252,523,77,523,384,452,384,452,384,523,384,524,411,452,384,524,411,530,429,585,463,389,463,416,447,585,463,416,447,434,441,585,463,434,441,445, -430,585,463,445,430,450,411,585,0,585,13,559,17,585,0,559,17,541,23,585,0,541,23,450,57,585,0,450,57,446,37,452,87,450,57,541,23,452,87,541,23,530,35,452,87,530,35,452,220,301,0,300,13,274,16,301,0,274,16,256,23,301,0,256,23,167,55,301,0,167,55,162,35,301,0,162,35,151,23,301,0,151,23,133,16,301,0,133,16,105,13,301,0,105,13,105,0,73,478,76,427,79,477,79,477,76,427,82,434,79,477,82,434,85,475,85,475,82,434,87,441,85,475,87,441,90,471,90,471,87,441,91,447,90,471,91,447,93,465,93,465,91,447,94,453,93,465,94,453,95,458,76,427,73,478,65,477,76,427,65,477,59,475,76,427,59,475,54,472,76,427,54,472,50,468,76,427,50,468,47,462,76,427,47,462,30,370,47,462,5,370,30,370,167,55,256,23,168,85,585,0,390,13,390,0,452,384,524,52,523,77,416,447,389,463,389,450,541,440,452,384,530,429,133,447,105,463,105,450,73,478,76,427,79,477,79,477,76,427,82,434,79,477,82,434,85,475,85,475,82,434,87,441,85,475,87,441,90,471,90,471,87,441,91,447,90,471,91,447,93,465,93,465,91,447,94,453,93,465,94,453,95,458,76,427,73,478,65,477,76,427,65,477,59,475,76,427,59,475,54,472,76,427,54,472,50,468,76,427,50,468,47,462,76,427,47,462,30,370,47,462,5,370,30,370,284,448,314,450,314,463,284,448,314,463,265,442,265,442,314,463,173,413,265,442,173,413,174,386,247,52,174,386,174,78,247,52,174,78,253,33,253,33,174,78,265,22,245,78,245,386,174,386,174,386,245,386,247,413,174,386,247,413,253,431,314,463,106,463,136,447,314,463,136,447,156,442,314,463,156,442,167,431,314,463,167,431,173,413,314,0,314,13,285,16,314,0,285,16,265,22,314,0,265,22,173,51,314,0,173,51,167,32,314,0,167,32,155,21,314,0,155,21,136,16,314,0,136,16,106,13,314,0,106,13,106,0,173,51,265,22,174,78,174,386,247,52,245,78,136,447,106,463,106,450,265,442,174,386,253,431,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,135,376,152,401,176,462,135, -376,176,462,113,430,114,142,113,34,126,105,126,105,113,34,177,1,126,105,177,1,144,73,144,73,177,1,166,47,182,35,166,47,177,1,182,35,177,1,252,-9,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,65,379,65,85,113,430,65,85,104,232,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,114,142,106,185,113,34,113,34,106,185,104,232,34,152,65,85,65,379,34,152,65,379,34,313,34,152,34,313,23,234,312,27,293,21,328,1,328,1,293,21,274,17,328,1,274,17,253,16,253,16,234,17,252,-9,252,-9,234,17,216,20,252,-9,216,20,198,26,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360,391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,329,462,252,473,252,448,392,144,381,107,391,33,391,33,381,107,364,75,391,33,364,75,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,236,399,282,402,236,440,377,399,282,440,377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,439,84,402,236,399,188,439,84,399,188,392,144,439,84,392,144,391,33,253,16,252,-9,328,1,73,478,76,427,79,477,79,477,76,427,82,434,79,477,82,434,85,475,85,475,82,434,87,441,85,475,87,441,90,471,90,471,87,441,91,447,90,471,91,447,93,465,93,465,91,447,94,453,93,465,94,453,95,458,76,427,73,478,65,477,76,427,65,477,59,475,76,427,59,475,54,472,76,427,54,472,50,468,76,427,50,468,47,462,76,427,47,462,30,370,47,462,5,370,30,370,113,34,104,232,65,85,312,27,328,1,328,37,182,35,252,-9,198,26,106,424,115,427,116,447,116,447,115,427,126,431,116,447,126,431,135,457,135,457,126,431,138,434,135,457,138,434,154,465,154,465,138,434,149,436,154,465,149,436,158,437,158,437,198,429,175,470,175,470,198,429,195,472,175,470,154,465,158,437,357,305,355,305,375,50,357,305,375,50,373,77,357,305,373,77,373,213,357,305,373,213,376,361,545,469,537, -469,550,451,550,451,537,469,528,470,550,451,528,470,494,438,494,438,528,470,485,462,494,438,485,462,446,403,446,403,485,462,443,441,446,403,443,441,407,351,407,351,443,441,405,406,407,351,405,406,382,286,382,286,405,406,376,361,382,286,376,361,373,213,554,467,550,451,555,451,554,467,555,451,563,465,563,465,555,451,559,450,563,465,559,450,564,449,568,449,573,448,573,461,568,449,573,461,564,449,564,449,573,461,563,465,445,0,445,13,415,16,445,0,415,16,394,22,445,0,394,22,299,55,445,0,299,55,294,34,445,0,294,34,282,23,445,0,282,23,262,16,445,0,262,16,230,13,445,0,230,13,230,0,317,411,301,206,375,50,317,411,375,50,341,364,341,364,375,50,355,305,299,55,394,22,301,86,301,86,394,22,381,32,301,86,381,32,301,206,301,206,381,32,375,50,198,429,233,404,244,465,244,465,233,404,262,360,244,465,262,360,285,445,285,445,262,360,285,295,285,445,285,295,317,411,317,411,285,295,301,206,73,478,76,427,79,477,79,477,76,427,82,434,79,477,82,434,85,475,85,475,82,434,87,441,85,475,87,441,90,471,90,471,87,441,91,447,90,471,91,447,93,465,93,465,91,447,94,453,93,465,94,453,95,458,76,427,73,478,65,477,76,427,65,477,59,475,76,427,59,475,54,472,76,427,54,472,50,468,76,427,50,468,47,462,76,427,47,462,30,370,47,462,5,370,30,370,195,472,198,429,244,465,550,451,554,467,545,469,106,424,116,447,101,435,81,66,65,68,221,0,221,0,65,68,53,73,221,0,53,73,20,0,20,0,53,73,44,83,20,0,44,83,20,120,20,120,44,83,39,98,20,120,39,98,38,120,38,120,39,98,37,120,37,278,43,222,46,335,46,335,43,222,61,177,46,335,61,177,75,388,75,388,61,177,91,140,75,388,91,140,120,432,120,432,91,140,117,280,133,112,117,280,91,140,260,473,209,438,260,448,260,448,311,440,337,463,337,463,311,440,351,417,337,463,351,417,399,435,399,435,351,417,380,382,399,435,380,382,398,335,404,280,427,140,445,392,445,392,427,140,458,176,445,392,458,176,474,338,474,338,458,176,477,222,474,338,477,222,484,278,399,435,398,335,404,280,399,435,404,280,445, -392,337,463,260,473,260,448,366,156,385,112,386,193,386,193,385,112,427,140,386,193,427,140,399,235,399,235,427,140,404,280,300,0,332,66,305,113,305,113,332,66,333,92,305,113,333,92,339,128,339,128,333,92,385,112,339,128,385,112,366,156,475,85,467,75,501,0,501,0,467,75,455,68,501,0,455,68,440,66,501,0,501,118,483,118,501,0,483,118,480,99,501,0,480,99,475,85,332,66,300,0,501,0,332,66,501,0,440,66,183,462,120,432,140,375,183,462,140,375,169,413,183,462,169,413,209,438,183,462,209,438,260,473,120,432,117,280,123,329,120,432,123,329,140,375,185,92,187,66,215,113,185,92,215,113,181,130,185,92,181,130,154,159,185,92,154,159,134,196,185,92,134,196,133,112,121,238,117,280,133,112,121,238,133,112,134,196,187,66,81,66,221,0,187,66,221,0,215,113,73,478,76,427,79,477,79,477,76,427,82,434,79,477,82,434,85,475,85,475,82,434,87,441,85,475,87,441,90,471,90,471,87,441,91,447,90,471,91,447,93,465,93,465,91,447,94,453,93,465,94,453,95,458,76,427,73,478,65,477,76,427,65,477,59,475,76,427,59,475,54,472,76,427,54,472,50,468,76,427,50,468,47,462,76,427,47,462,30,370,47,462,5,370,30,370,305,113,339,128,305,112,14,400,14,379,19,410,19,410,14,379,19,369,19,410,19,369,27,417,27,417,19,369,27,362,27,417,27,362,36,422,36,422,27,362,36,357,36,422,36,357,47,424,47,424,36,357,47,355,47,424,47,355,58,422,58,422,47,355,58,357,58,422,58,357,67,417,67,417,58,357,67,362,67,417,67,362,75,410,75,410,67,362,75,369,75,410,75,369,80,400,80,400,75,369,80,379,80,400,80,379,82,390,147,463,149,412,153,463,153,463,149,412,155,419,153,463,155,419,158,460,158,460,155,419,161,426,158,460,161,426,163,456,163,456,161,426,165,432,163,456,165,432,167,450,167,450,165,432,167,438,167,450,167,438,168,443,149,412,147,463,139,463,149,412,139,463,132,461,149,412,132,461,127,458,149,412,127,458,123,453,149,412,123,453,120,448,149,412,120,448,103,355,87,264,103,306,82,270,82,270,103,306,81,299,82,270,81,299,76,274,76, -274,81,299,67,275,63,275,67,275,81,299,63,275,81,299,59,292,103,6,115,-3,125,314,125,314,115,-3,131,-6,125,314,131,-6,146,322,146,322,131,-6,149,55,146,322,149,55,149,320,151,47,152,-1,154,43,154,43,152,-1,170,10,154,43,170,10,158,40,158,40,170,10,163,39,171,40,163,39,170,10,171,40,170,10,186,28,153,400,153,379,158,410,158,410,153,379,158,369,158,410,158,369,166,417,166,417,158,369,166,362,166,417,166,362,175,422,175,422,166,362,175,357,175,422,175,357,186,424,186,424,175,357,186,355,186,424,186,355,197,422,197,422,186,355,197,357,197,422,197,357,207,417,207,417,197,357,207,362,207,417,207,362,214,410,214,410,207,362,214,369,214,410,214,369,219,400,219,400,214,369,219,379,219,400,219,379,221,390,211,70,200,75,200,49,200,49,200,75,192,60,200,49,192,60,186,28,186,28,192,60,185,50,186,28,185,50,178,43,152,-1,151,47,150,51,152,-1,150,51,149,55,152,-1,149,55,131,-6,103,306,87,264,90,254,103,306,90,254,91,241,103,306,91,241,92,37,103,306,92,37,96,20,103,306,96,20,103,6,103,306,103,6,125,314,91,241,91,55,92,37,59,292,37,285,38,285,59,292,38,285,45,274,59,292,45,274,52,274,59,292,52,274,58,275,59,292,58,275,63,275,45,274,38,285,38,273,171,40,186,28,178,43,153,379,153,400,152,390,103,355,120,448,79,355,14,379,14,400,13,390,77,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,243,472,107,71,139,152,243,472,139,152,152,180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,257,472,362,25,358,21,495,0,495,0,358,21,353,18,495,0,353,18,348,16,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,243,472,152,180,232,373,243,472,232,373,313,180,243,472,313,180,257,472,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107, -71,243,472,476,17,462,24,495,0,476,17,495,0,495,13,364,31,362,25,495,0,364,31,495,0,365,37,316,13,316,0,495,0,316,13,495,0,348,16,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,71,33,59,22,248,0,248,0,59,22,40,16,248,0,40,16,12,13,77,413,79,385,156,434,77,413,156,434,208,463,208,463,156,434,161,437,208,463,161,437,167,438,167,438,226,434,208,463,208,463,226,434,273,458,334,125,327,83,350,21,350,21,327,83,308,54,350,21,308,54,304,5,304,5,308,54,277,37,304,5,277,37,248,0,248,0,277,37,239,28,248,0,239,28,194,26,194,26,177,27,248,0,248,0,177,27,165,30,248,0,165,30,77,52,77,52,165,30,79,79,298,405,314,378,325,443,325,443,314,378,320,343,328,254,320,343,315,312,273,458,226,434,269,423,273,458,269,423,298,405,273,458,298,405,325,443,328,254,355,268,362,420,362,420,355,268,375,287,362,420,375,287,384,387,384,387,375,287,387,313,384,387,387,313,391,347,325,443,320,343,328,254,325,443,328,254,362,420,327,169,335,233,308,199,308,199,335,233,295,244,308,199,295,244,278,217,278,217,295,244,295,245,278,217,295,245,300,287,300,287,295,245,328,254,300,287,328,254,315,312,196,228,240,226,240,260,240,260,240,226,278,217,240,260,278,217,275,270,275,270,278,217,300,287,196,228,240,260,195,256,196,228,195,256,151,256,196,228,151,256,151,228,152,45,151,57,79,385,152,45,79,385,79,79,415,124,409,162,407,82,407,82,409,162,393,193,407,82,393,193,385,47,385,47,393,193,368,216,385,47,368,216,350,21,350,21,368,216,335,233,350,21,335,233,334,125,79,79,165,30,157,36,79,79,157,36,152,45,79,385,151,57,151,415,79,385,151,415,151,424,79,385,151,424,153,430,79,385,153,430,156,434,208,463,12,463,41,447,208,463,41,447,60,442,208,463,60,442,72,431,208,463,72,431,77,413,41,447,12,463,12,450,248,0,12,13,12,0,71,33,248,0,77, -52,335,233,327,169,334,125,53,440,64,429,401,463,401,463,64,429,156,436,401,463,156,436,166,437,401,463,166,437,288,437,401,463,288,437,325,434,401,463,325,434,352,425,401,463,352,425,370,408,401,463,370,408,381,382,401,463,381,382,387,346,401,463,387,346,404,346,141,79,141,409,70,386,70,386,141,409,141,420,70,386,141,420,144,428,70,386,144,428,148,433,70,386,148,433,68,412,70,386,142,51,141,79,156,436,64,429,68,412,156,436,68,412,148,433,36,447,53,440,401,463,36,447,401,463,9,463,36,447,9,463,9,450,205,0,205,13,177,16,205,0,177,16,159,22,205,0,159,22,68,56,205,0,68,56,63,35,205,0,63,35,52,23,205,0,52,23,35,16,205,0,35,16,8,13,205,0,8,13,8,0,70,87,68,56,159,22,70,87,159,22,147,33,70,87,147,33,142,51,70,87,142,51,70,386,243,472,34,0,95,64,95,64,34,0,473,0,95,64,473,0,367,64,367,64,473,0,257,472,367,64,257,472,243,472,243,472,95,64,232,373,243,472,232,373,367,64,64,34,53,23,386,0,386,0,53,23,36,17,386,0,36,17,9,13,53,441,63,430,380,463,380,463,63,430,155,436,380,463,155,436,165,437,165,437,251,435,380,463,380,463,251,435,307,429,380,463,307,429,340,416,380,463,340,416,356,395,380,463,356,395,365,363,380,463,365,363,382,363,64,34,164,29,68,52,68,52,164,29,151,35,68,52,151,35,70,80,70,80,151,35,143,44,70,80,143,44,70,385,70,385,143,44,141,59,70,385,141,59,141,412,141,258,141,229,246,229,141,258,246,229,246,258,277,259,246,258,277,227,277,259,277,227,298,265,298,265,277,227,298,222,298,265,298,222,311,277,311,277,298,222,311,210,311,277,311,210,320,297,320,297,311,210,320,191,320,297,320,191,326,325,326,325,320,191,326,161,326,325,326,161,341,161,70,385,141,412,141,423,70,385,141,423,144,430,70,385,144,430,148,434,70,385,148,434,68,411,148,434,155,436,63,430,148,434,63,430,68,411,35,447,53,441,380,463,35,447,380,463,9,463,35,447,9,463,9,450,355,53,322,37,386,0,386,0,322,37,276,28,386,0,276,28,212,26,212,26,184,26,386,0,386, -0,184,26,164,29,386,0,164,29,64,34,386,0,418,118,398,118,386,0,398,118,379,80,386,0,379,80,355,53,246,258,246,229,277,227,326,325,341,161,341,325,386,0,9,13,9,0,49,379,54,391,37,463,37,463,54,391,60,402,37,463,60,402,70,413,70,413,81,421,37,463,37,463,81,421,95,428,37,463,95,428,113,433,102,27,405,453,313,437,313,437,405,453,405,463,313,437,405,463,163,437,136,436,163,437,405,463,136,436,405,463,37,463,37,463,23,344,41,344,37,463,41,344,45,364,37,463,45,364,49,379,313,437,7,10,102,27,102,27,7,10,401,0,102,27,401,0,279,27,279,27,401,0,301,27,389,83,382,68,401,0,401,0,382,68,372,56,401,0,372,56,360,46,360,46,349,39,401,0,401,0,349,39,335,34,401,0,335,34,319,30,401,0,419,123,402,123,401,0,402,123,395,101,401,0,395,101,389,83,401,0,7,10,7,0,301,27,401,0,319,30,37,463,113,433,136,436,69,35,58,23,208,0,208,0,58,23,40,16,208,0,40,16,13,13,13,13,40,16,12,13,209,463,13,463,40,447,209,463,40,447,58,441,209,463,58,441,69,429,209,463,69,429,74,411,209,463,74,411,165,441,209,463,165,441,183,447,209,463,183,447,209,450,75,384,147,53,146,79,146,252,146,220,359,220,146,252,359,220,359,252,359,252,359,220,437,35,359,252,437,35,431,52,75,384,146,79,146,384,75,384,146,384,148,411,75,384,148,411,153,429,75,384,153,429,165,441,75,384,165,441,74,411,353,37,342,24,492,0,492,0,342,24,324,17,492,0,324,17,297,13,466,447,492,450,492,463,466,447,492,463,448,440,448,440,492,463,357,411,448,440,357,411,359,384,431,52,359,384,359,252,430,77,430,384,359,384,359,384,430,384,431,411,359,384,431,411,437,429,492,463,296,463,323,447,492,463,323,447,341,441,492,463,341,441,352,430,492,463,352,430,357,411,492,0,492,13,466,17,492,0,466,17,448,23,492,0,448,23,357,57,492,0,357,57,353,37,359,87,357,57,448,23,359,87,448,23,437,35,359,87,437,35,359,220,208,0,207,13,181,16,208,0,181,16,163,23,208,0,163,23,74,55,208,0,74,55,69,35,75,85,74, -55,163,23,75,85,163,23,153,35,75,85,153,35,147,53,75,85,147,53,75,384,208,0,13,13,13,0,492,0,297,13,297,0,359,384,431,52,430,77,323,447,296,463,296,450,448,440,359,384,437,429,40,447,13,463,13,450,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360,391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,188,431,208,440,252,473,252,473,208,440,230,446,252,473,230,446,252,448,252,448,271,446,329,462,329,462,271,446,290,442,329,462,252,473,252,448,346,199,344,219,333,309,333,309,344,219,343,238,333,309,343,238,343,252,343,252,343,264,333,309,333,309,343,264,344,275,333,309,344,275,346,286,348,297,351,309,333,309,348,297,333,309,346,286,392,144,381,107,391,33,391,33,381,107,364,75,391,33,364,75,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,236,399,282,402,236,440,377,399,282,440,377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,439,84,402,236,399,188,439,84,399,188,392,144,439,84,392,144,391,33,328,1,328,37,312,27,328,1,312,27,293,21,328,1,293,21,274,17,328,1,274,17,253,16,328,1,253,16,252,-9,316,201,323,192,324,284,324,284,323,192,329,180,324,284,329,180,329,295,329,295,329,180,333,165,329,295,333,165,333,309,333,309,333,165,348,180,333,309,348,180,346,199,219,209,293,209,293,268,306,270,293,268,306,207,306,270,306,207,316,276,316,276,306,207,316,201,316,276,316,201,324,284,293,268,219,268,219,209,205,207,219,209,219,268,205,207,219,268,205,269,205,207,205,269,195,202,195,202,205,269,194,274,195,202,194,274,187,193,187,193,194,274,186,282,187,193,186,282,181,180,181,180,186,282,180,293,181,180,180,293,175,165,175,165,180,293,174,309,175,165,174,309,165,226,165,226,174,309,164,240,174,309,157,309,160,293,174,309,160,293,162,276,174,309,162,276,163,258,174,309,163,258,164,240,175,165,165,226,165,214,175,165,165,214,164,201,175,165,164,201,162,189,175,165,162,189,160,177,175,165,160,177,158,165,188,431,176,462,169, -418,169,418,176,462,152,401,135,376,152,401,176,462,135,376,176,462,113,430,114,142,113,34,126,105,126,105,113,34,177,1,126,105,177,1,144,73,144,73,177,1,166,47,182,35,166,47,177,1,182,35,177,1,252,-9,113,430,65,379,65,85,113,430,65,85,104,232,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,114,142,106,185,113,34,113,34,106,185,104,232,34,152,65,85,65,379,34,152,65,379,34,313,34,152,34,313,23,234,216,20,252,-9,234,17,234,17,252,-9,253,16,198,26,182,35,252,-9,198,26,252,-9,216,20,113,34,104,232,65,85,176,462,188,431,252,473,293,268,293,209,306,207,348,180,333,165,351,165,73,32,62,21,220,0,220,0,62,21,42,16,220,0,42,16,13,13,13,13,42,16,12,13,220,463,13,463,42,447,220,463,42,447,62,442,220,463,62,442,74,431,220,463,74,431,79,413,220,463,79,413,171,442,220,463,171,442,191,448,220,463,191,448,220,450,171,22,159,33,80,78,80,78,159,33,153,52,80,78,153,52,80,386,80,386,153,52,152,78,80,386,152,78,152,386,80,386,152,386,153,413,80,386,153,413,159,431,80,386,159,431,171,442,80,386,171,442,79,413,220,0,220,13,191,16,220,0,191,16,171,22,220,0,171,22,79,51,220,0,79,51,73,32,220,0,13,13,13,0,79,51,171,22,80,78,42,447,13,463,13,450,221,450,221,450,192,447,192,447,221,450,221,463,192,447,221,463,174,440,174,440,221,463,85,411,174,440,85,411,87,384,159,50,87,384,87,88,159,50,87,88,165,33,165,33,87,88,176,22,87,384,159,50,158,77,158,244,158,207,177,222,158,244,177,222,283,359,283,359,177,222,233,269,283,359,233,269,363,394,87,384,158,77,158,384,87,384,158,384,159,411,87,384,159,411,163,429,87,384,163,429,174,440,221,463,23,463,51,447,221,463,51,447,70,440,221,463,70,440,80,429,221,463,80,429,85,411,328,405,317,391,363,394,363,394,317,391,301,376,363,394,301,376,283,359,473,463,291,463,309,449,473,463,309,449,320,448,473,463,320,448,329,445,473,463,329,445,334,441,473,463,334,441,337,435,473,463,337,435,338,427,473, -463,338,427,428,442,473,463,428,442,448,447,473,463,448,447,473,450,338,427,363,394,389,417,338,427,389,417,409,433,338,427,409,433,428,442,335,417,328,405,363,394,335,417,363,394,338,427,338,21,332,17,506,0,506,0,332,17,324,15,506,0,324,15,313,14,342,30,506,0,471,22,342,30,471,22,451,35,342,30,451,35,427,57,342,30,427,57,397,90,342,30,397,90,338,45,397,90,233,269,246,150,397,90,246,150,277,117,397,90,277,117,304,89,397,90,304,89,324,64,397,90,324,64,338,45,488,15,471,22,506,0,488,15,506,0,506,13,341,25,338,21,506,0,341,25,506,0,342,30,294,13,294,0,506,0,294,13,506,0,313,14,220,0,220,13,194,16,220,0,194,16,176,22,220,0,176,22,85,57,220,0,85,57,80,36,220,0,80,36,69,23,220,0,69,23,51,16,220,0,51,16,23,13,220,0,23,13,23,0,85,57,176,22,87,88,246,150,233,269,177,222,309,449,291,463,291,450,51,447,23,463,23,450,78,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,226,373,236,472,224,373,224,373,236,472,107,71,105,66,107,71,236,472,105,66,236,472,98,130,351,37,481,0,448,24,351,37,448,24,436,36,351,37,436,36,426,54,351,37,426,54,415,77,351,37,415,77,350,43,415,77,250,472,338,85,415,77,338,85,342,72,415,77,342,72,346,61,415,77,346,61,349,51,415,77,349,51,350,43,236,472,226,373,338,85,236,472,338,85,250,472,98,130,78,81,101,42,462,17,448,24,481,0,462,17,481,0,481,13,348,25,341,18,481,0,348,25,481,0,351,37,481,0,341,18,331,15,481,0,331,15,318,14,481,0,318,14,302,13,481,0,302,13,302,0,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,62,48,47,28,118,17,62,48,118,17,108,23,62,48,108,23,103,31,62,48,103,31,78,81,105,66,98,130,103,60,69,40,57,25,172,0,172,0,57,25,38,17,172,0,38,17,9,13,466,37,455,24,605,0,605,0,455,24,436,17,605,0,436,17,409,13,578,448,604, -450,604,463,578,448,604,463,561,442,561,442,604,463,472,401,561,442,472,401,550,430,550,430,472,401,545,412,561,24,550,35,472,86,472,86,550,35,545,53,472,86,545,53,472,401,472,401,545,53,543,78,472,401,543,78,543,385,284,0,293,0,310,112,310,112,293,0,472,401,310,112,472,401,465,463,465,463,472,401,604,463,148,463,10,463,39,447,148,463,39,447,58,441,148,463,58,441,70,430,148,463,70,430,75,411,148,463,75,411,77,384,148,463,77,384,107,384,148,463,107,384,284,0,148,463,284,0,310,112,107,105,107,384,77,384,107,105,77,384,109,67,109,67,77,384,77,105,109,67,77,105,114,41,114,41,77,105,75,66,114,41,75,66,126,25,126,25,75,66,69,40,126,25,69,40,172,0,605,0,605,13,579,17,605,0,579,17,561,24,605,0,561,24,471,57,605,0,471,57,466,37,144,17,126,25,172,0,144,17,172,0,172,13,172,0,9,13,9,0,605,0,409,13,409,0,471,57,561,24,472,86,39,447,10,463,10,450,545,412,472,401,543,385,69,42,57,27,172,0,172,0,57,27,38,18,172,0,38,18,9,13,359,446,369,443,495,463,495,463,369,443,377,439,495,463,377,439,384,432,384,432,390,424,495,463,495,463,390,424,393,413,495,463,393,413,454,442,454,442,393,413,448,438,454,442,448,438,448,437,448,437,448,438,441,430,441,430,448,438,397,383,441,430,397,383,398,363,416,-7,398,363,398,125,416,-7,398,125,127,463,495,463,454,442,461,445,495,463,461,445,470,447,495,463,470,447,480,449,495,463,480,449,495,450,428,-7,428,355,416,-7,416,-7,428,355,429,383,416,-7,429,383,398,363,398,363,429,383,431,404,398,363,431,404,436,419,396,400,397,383,448,438,396,400,448,438,393,413,346,448,359,446,495,463,346,448,495,463,329,463,346,448,329,463,329,450,127,463,9,463,27,449,127,463,27,449,41,445,127,463,41,445,52,438,127,463,52,438,64,428,127,463,64,428,77,413,127,463,77,413,107,377,127,463,107,377,416,-7,77,413,109,68,107,105,75,67,69,42,126,28,126,28,69,42,172,0,126,28,172,0,144,19,144,19,172,0,172,13,77,105,75,67,114,44,77,105,114,44,109,68,77,105,109,68,77, -413,172,0,9,13,9,0,75,67,126,28,114,44,27,449,9,463,9,450,107,377,77,413,107,105,441,430,398,363,436,419,413,463,37,463,92,404,413,463,92,404,111,406,413,463,111,406,339,406,413,463,339,406,358,404,413,463,358,404,373,398,413,463,373,398,383,386,413,463,383,386,390,369,413,463,390,369,395,345,413,463,395,345,413,345,37,463,37,344,55,344,37,463,55,344,60,369,37,463,60,369,67,387,37,463,67,387,78,398,37,463,78,398,92,404,307,264,290,263,305,204,305,204,290,263,288,206,288,206,290,263,159,263,288,206,159,263,158,206,141,204,158,206,143,264,141,204,143,264,131,270,116,295,117,170,121,280,121,280,117,170,122,185,121,280,122,185,131,270,131,270,122,185,130,197,131,270,130,197,141,204,116,295,114,316,117,170,117,170,114,316,114,152,114,152,114,316,98,316,114,152,98,316,98,152,336,316,334,295,336,152,336,316,336,152,352,152,336,316,352,152,352,316,336,152,334,295,334,172,334,172,334,295,329,280,334,172,329,280,328,187,328,187,329,280,320,270,328,187,320,270,318,198,318,198,320,270,307,264,318,198,307,264,305,204,402,80,389,69,430,0,430,0,389,69,371,62,430,0,371,62,348,59,430,0,430,120,413,120,430,0,413,120,410,97,430,0,410,97,402,80,348,59,98,59,430,0,430,0,98,59,78,62,430,0,78,62,20,0,20,0,78,62,61,68,20,0,61,68,49,80,20,0,49,80,20,120,20,120,49,80,40,97,20,120,40,97,38,120,158,206,159,263,143,264,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,135,376,152,401,176,462,135,376,176,462,113,430,114,142,113,34,126,105,126,105,113,34,177,1,126,105,177,1,144,73,144,73,177,1,166,47,182,35,166,47,177,1,182,35,177,1,252,-9,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,65,379,65,85,113,430,65,85,104,232,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,114,142,106,185,113,34,113,34,106,185,104,232,34,152,65,85,65,379,34,152,65,379,34,313,34, -152,34,313,23,234,312,27,293,21,328,1,328,1,293,21,274,17,328,1,274,17,253,16,253,16,234,17,252,-9,252,-9,234,17,216,20,252,-9,216,20,198,26,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360,391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,329,462,252,473,252,448,392,144,381,107,391,33,391,33,381,107,364,75,391,33,364,75,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,236,399,282,402,236,440,377,399,282,440,377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,439,84,402,236,399,188,439,84,399,188,392,144,439,84,392,144,391,33,253,16,252,-9,328,1,113,34,104,232,65,85,312,27,328,1,328,37,182,35,252,-9,198,26,69,35,58,23,208,0,208,0,58,23,40,16,208,0,40,16,13,13,13,13,40,16,12,13,74,411,75,384,155,434,74,411,155,434,69,429,69,429,155,434,162,436,69,429,162,436,492,463,492,463,162,436,172,437,353,37,342,24,492,0,492,0,342,24,324,17,492,0,324,17,297,13,492,463,172,437,333,437,492,463,333,437,344,436,492,463,344,436,351,433,492,463,351,433,356,429,492,463,356,429,358,422,492,463,358,422,359,412,492,463,359,412,448,440,492,463,448,440,466,447,492,463,466,447,492,450,430,77,430,384,359,412,359,412,430,384,431,411,359,412,431,411,437,429,448,23,437,35,359,87,359,87,437,35,431,52,359,87,431,52,359,412,163,23,153,35,75,85,75,85,153,35,147,53,75,85,147,53,75,384,75,384,147,53,146,79,75,384,146,79,146,414,75,384,146,414,147,424,75,384,147,424,150,430,75,384,150,430,155,434,492,463,13,463,40,447,492,463,40,447,58,441,492,463,58,441,69,429,492,0,492,13,466,17,492,0,466,17,448,23,492,0,448,23,357,57,492,0,357,57,353,37,208,0,207,13,181,16,208,0,181,16,163,23,208,0,163,23,74,55,208,0,74,55,69,35,208,0,13,13,13,0,74,55,163,23,75,85,492,0,297,13,297,0,357,57,448,23,359,87,359,412,431,52,430,77,40,447,13, -463,13,450,448,440,359,412,437,429,155,437,166,437,166,438,192,463,166,438,217,434,192,463,217,434,232,461,232,461,217,434,255,423,232,461,255,423,267,456,267,456,255,423,282,403,267,456,282,403,298,446,298,446,282,403,298,373,298,446,298,373,323,434,323,434,298,373,303,333,323,434,303,333,316,226,316,226,298,298,291,214,291,214,298,298,283,269,291,214,283,269,263,206,263,206,283,269,259,248,263,206,259,248,230,203,230,203,259,248,226,234,230,203,226,234,190,202,190,202,226,234,184,230,190,202,184,230,180,202,180,202,184,230,176,230,180,202,176,230,170,202,170,202,176,230,168,230,170,202,168,230,161,202,161,202,168,230,160,231,161,202,160,231,152,203,152,203,160,231,151,231,152,203,151,231,141,232,141,78,141,232,70,386,141,78,70,386,143,51,143,51,70,386,70,85,141,232,141,204,152,203,380,336,378,356,378,315,378,315,378,356,374,375,378,315,374,375,373,294,373,294,374,375,367,392,373,294,367,392,365,276,365,276,367,392,357,407,365,276,357,407,354,259,354,259,357,407,345,420,354,259,345,420,340,245,340,245,345,420,323,434,340,245,323,434,316,226,192,463,11,463,37,447,192,463,37,447,54,441,192,463,54,441,64,430,192,463,64,430,69,412,192,463,69,412,70,386,192,463,70,386,148,434,192,463,148,434,155,437,192,463,155,437,166,438,141,413,142,422,70,386,141,413,70,386,141,232,144,429,148,434,70,386,144,429,70,386,142,422,207,0,207,13,179,16,207,0,179,16,160,22,207,0,160,22,69,55,207,0,69,55,65,35,207,0,65,35,55,23,207,0,55,23,38,16,207,0,38,16,11,13,207,0,11,13,11,0,70,85,69,55,160,22,70,85,160,22,148,33,70,85,148,33,143,51,37,447,11,463,11,450,298,298,316,226,303,333,217,434,166,438,166,437,389,463,21,463,121,437,389,463,121,437,266,437,389,463,266,437,300,435,389,463,300,435,327,427,389,463,327,427,348,412,389,463,348,412,363,387,389,463,363,387,372,351,389,463,372,351,389,351,208,227,21,10,104,66,208,227,104,66,270,257,208,227,270,257,121,437,208,227,121,437,21,463,208,227,21,463,21,453,386,93,370,78,401,0,401,0,370,78,349, -69,401,0,349,69,320,66,401,0,420,143,404,143,401,0,404,143,396,115,401,0,396,115,386,93,401,0,320,66,104,66,401,0,104,66,21,10,401,0,21,10,21,0,410,463,17,463,98,432,410,463,98,432,136,434,410,463,136,434,178,434,410,463,178,434,249,434,410,463,249,434,291,434,410,463,291,434,329,432,410,463,329,432,356,425,410,463,356,425,375,409,410,463,375,409,388,383,410,463,388,383,398,345,410,463,398,345,415,345,268,22,256,33,178,86,178,86,256,33,251,51,178,86,251,51,178,434,178,434,251,51,249,77,178,434,249,77,249,434,17,463,12,345,30,345,17,463,30,345,39,383,17,463,39,383,52,409,17,463,52,409,71,425,17,463,71,425,98,432,316,0,316,13,288,16,316,0,288,16,268,22,316,0,268,22,177,55,316,0,177,55,172,35,316,0,172,35,160,23,316,0,160,23,141,16,316,0,141,16,112,13,316,0,112,13,112,0,177,55,268,22,178,86,26,424,35,427,36,447,36,447,35,427,46,431,36,447,46,431,54,457,54,457,46,431,57,434,54,457,57,434,74,465,74,465,57,434,68,436,74,465,68,436,77,437,77,437,118,429,94,470,94,470,118,429,114,472,94,470,74,465,77,437,277,305,275,305,294,50,277,305,294,50,292,77,277,305,292,77,292,213,277,305,292,213,295,361,465,469,456,469,470,451,470,451,456,469,448,470,470,451,448,470,414,438,414,438,448,470,404,462,414,438,404,462,365,403,365,403,404,462,362,441,365,403,362,441,327,351,327,351,362,441,325,406,327,351,325,406,301,286,301,286,325,406,295,361,301,286,295,361,292,213,474,467,470,451,474,451,474,467,474,451,483,465,483,465,474,451,479,450,483,465,479,450,483,449,488,449,492,448,492,461,488,449,492,461,483,449,483,449,492,461,483,465,364,0,364,13,334,16,364,0,334,16,313,22,364,0,313,22,219,55,364,0,219,55,214,34,364,0,214,34,202,23,364,0,202,23,181,16,364,0,181,16,150,13,364,0,150,13,150,0,237,411,220,206,294,50,237,411,294,50,260,364,260,364,294,50,275,305,219,55,313,22,220,86,220,86,313,22,301,32,220,86,301,32,220,206,220,206,301,32,294,50,118,429,153,404,163,465,163, -465,153,404,182,360,163,465,182,360,204,445,204,445,182,360,204,295,204,445,204,295,237,411,237,411,204,295,220,206,114,472,118,429,163,465,470,451,474,467,465,469,26,424,36,447,20,435,374,450,374,450,343,448,343,448,374,450,374,463,343,448,374,463,323,443,323,443,374,463,230,423,323,443,230,423,231,406,232,366,231,406,231,392,232,366,231,392,189,358,189,358,231,392,171,387,189,358,171,387,152,336,152,336,171,387,125,303,302,60,301,98,232,366,232,366,301,98,301,366,232,366,301,366,302,406,302,406,301,366,302,392,232,366,302,406,304,422,232,366,304,422,310,434,232,366,305,41,302,60,231,406,232,366,310,434,231,406,310,434,323,443,374,463,160,463,191,448,374,463,191,448,211,444,374,463,211,444,224,435,374,463,224,435,230,423,115,369,68,338,101,223,115,369,101,223,107,264,115,369,107,264,125,303,115,369,125,303,171,387,24,231,32,179,36,292,36,292,32,179,55,135,36,292,55,135,68,338,68,338,55,135,94,101,68,338,94,101,101,223,465,127,434,223,426,179,465,127,426,179,420,96,420,96,426,179,406,145,420,96,406,145,376,119,428,264,434,223,465,338,465,338,434,223,465,127,465,338,465,127,497,292,497,292,465,127,497,172,497,292,497,172,509,231,417,369,361,387,387,335,417,369,387,335,413,303,417,369,413,303,428,264,417,369,428,264,465,338,349,358,387,335,361,387,349,358,361,387,302,392,349,358,302,392,301,366,302,72,320,72,340,103,340,103,320,72,369,78,340,103,369,78,376,119,376,119,369,78,420,96,302,60,302,72,301,98,301,98,302,72,340,103,374,0,374,13,348,16,374,0,348,16,328,20,374,0,328,20,231,59,374,0,231,59,228,41,374,0,228,41,219,28,374,0,219,28,205,19,374,0,205,19,185,15,374,0,185,15,160,13,374,0,160,13,160,0,232,98,186,104,219,72,232,98,219,72,231,72,232,98,231,72,313,28,232,98,313,28,305,41,232,98,305,41,232,366,231,72,231,59,328,20,231,72,328,20,313,28,149,123,123,150,148,80,149,123,148,80,219,72,149,123,219,72,186,104,106,184,101,223,94,101,106,184,94,101,148,80,106,184,148,80,123,150,191,448,160,463,160,450,43,23,170, -0,60,37,60,37,170,0,123,23,60,37,123,23,81,59,81,59,123,23,118,29,81,59,118,29,116,36,116,36,118,43,109,93,109,93,118,43,122,53,109,93,122,53,218,230,218,230,122,53,129,65,218,230,129,65,139,80,144,338,218,230,176,416,144,338,176,416,173,429,173,429,175,437,144,338,218,230,139,80,153,98,153,98,237,202,218,230,218,230,237,202,232,327,218,230,232,327,212,357,109,93,81,59,116,36,144,338,175,437,109,387,109,387,175,437,179,443,109,387,179,443,83,418,83,418,179,443,186,446,83,418,186,446,226,463,226,463,186,446,195,448,226,463,195,448,205,449,205,449,226,450,226,463,226,463,16,463,40,446,226,463,40,446,61,437,226,463,61,437,83,418,365,414,359,406,380,380,380,380,359,406,351,395,380,380,351,395,341,380,341,380,263,283,280,257,280,257,263,283,303,104,280,257,303,104,415,65,415,65,303,104,316,84,415,65,316,84,326,67,488,463,321,463,341,449,488,463,341,449,354,446,488,463,354,446,363,442,488,463,363,442,367,436,488,463,367,436,369,427,488,463,369,427,443,440,488,463,443,440,463,447,488,463,463,447,488,450,369,427,380,380,404,408,369,427,404,408,424,428,369,427,424,428,443,440,368,421,365,414,380,380,368,421,380,380,369,427,341,380,280,257,380,380,333,23,326,19,493,0,493,0,326,19,316,16,493,0,316,16,304,15,339,35,493,0,457,22,339,35,457,22,443,31,339,35,443,31,430,45,339,35,430,45,415,65,339,35,415,65,338,43,415,65,326,67,333,54,415,65,333,54,338,43,263,283,232,327,237,202,263,283,237,202,303,104,473,16,457,22,493,0,473,16,493,0,493,13,338,28,333,23,493,0,338,28,493,0,339,35,286,13,286,0,493,0,286,13,493,0,304,15,218,230,212,357,195,381,218,230,195,381,183,400,218,230,183,400,176,416,170,0,170,13,148,16,170,0,148,16,133,19,170,0,133,19,123,23,26,17,7,13,170,0,26,17,170,0,43,23,170,0,7,13,7,0,341,449,321,463,321,450,40,446,16,463,16,450,369,450,369,450,344,449,344,449,369,450,369,463,344,449,369,463,325,445,325,445,369,463,223,418,325,445,223,418,226,394,226,189,226,394,226, -215,226,189,226,215,218,215,226,189,307,31,299,49,226,189,299,49,297,77,297,215,297,189,351,194,297,215,351,194,305,215,305,215,351,194,347,223,297,77,297,394,226,189,226,189,297,394,300,419,226,189,300,419,226,394,226,394,300,419,310,435,226,394,310,435,325,445,369,463,155,463,179,449,369,463,179,449,198,444,369,463,198,444,213,434,369,463,213,434,223,418,433,460,413,433,440,238,440,238,413,433,402,398,440,238,402,398,400,210,400,210,402,398,398,356,400,210,398,356,397,316,433,460,440,238,464,477,464,477,440,238,467,279,464,477,467,279,475,413,475,413,467,279,474,397,474,384,474,397,467,279,474,384,467,279,477,334,493,462,507,470,507,483,493,462,507,483,484,448,484,448,507,483,464,477,484,448,464,477,478,431,478,431,464,477,475,413,347,223,351,194,374,245,374,245,351,194,400,210,374,245,400,210,390,278,390,278,400,210,397,316,477,334,476,346,476,359,477,334,476,359,475,372,477,334,475,372,474,384,369,0,369,13,341,15,369,0,341,15,321,20,369,0,321,20,224,56,369,0,224,56,218,35,369,0,218,35,206,23,369,0,206,23,185,16,369,0,185,16,155,13,369,0,155,13,155,0,226,87,224,56,321,20,226,87,321,20,307,31,226,87,307,31,226,189,176,223,148,245,171,194,176,223,171,194,226,189,176,223,226,189,218,215,126,316,124,356,122,210,126,316,122,210,133,278,133,278,122,210,171,194,133,278,171,194,148,245,122,210,124,356,121,398,122,210,121,398,110,433,122,210,110,433,89,460,122,210,89,460,82,238,58,477,16,483,30,462,58,477,30,462,39,448,58,477,39,448,45,431,58,477,45,431,48,413,58,477,48,413,48,397,58,477,48,397,55,279,58,477,55,279,82,238,58,477,82,238,89,460,55,279,48,397,48,384,55,279,48,384,47,372,55,279,47,372,46,359,55,279,46,359,46,346,55,279,46,346,45,334,30,462,16,483,16,470,179,449,155,463,155,450,81,66,65,68,221,0,221,0,65,68,53,73,221,0,53,73,20,0,20,0,53,73,44,83,20,0,44,83,20,120,20,120,44,83,39,98,20,120,39,98,38,120,38,120,39,98,37,120,37,278,43,222,46,335,46,335,43,222,61,177,46, -335,61,177,75,388,75,388,61,177,91,140,75,388,91,140,120,432,120,432,91,140,117,280,133,112,117,280,91,140,260,473,209,438,260,448,260,448,311,440,337,463,337,463,311,440,351,417,337,463,351,417,399,435,399,435,351,417,380,382,399,435,380,382,398,335,404,280,427,140,445,392,445,392,427,140,458,176,445,392,458,176,474,338,474,338,458,176,477,222,474,338,477,222,484,278,399,435,398,335,404,280,399,435,404,280,445,392,337,463,260,473,260,448,366,156,385,112,386,193,386,193,385,112,427,140,386,193,427,140,399,235,399,235,427,140,404,280,300,0,332,66,305,113,305,113,332,66,333,92,305,113,333,92,339,128,339,128,333,92,385,112,339,128,385,112,366,156,475,85,467,75,501,0,501,0,467,75,455,68,501,0,455,68,440,66,501,0,501,118,483,118,501,0,483,118,480,99,501,0,480,99,475,85,332,66,300,0,501,0,332,66,501,0,440,66,183,462,120,432,140,375,183,462,140,375,169,413,183,462,169,413,209,438,183,462,209,438,260,473,120,432,117,280,123,329,120,432,123,329,140,375,185,92,187,66,215,113,185,92,215,113,181,130,185,92,181,130,154,159,185,92,154,159,134,196,185,92,134,196,133,112,121,238,117,280,133,112,121,238,133,112,134,196,187,66,81,66,221,0,187,66,221,0,215,113,305,113,339,128,305,112,13,577,14,565,14,587,14,587,14,565,19,556,14,587,19,556,19,597,19,597,19,556,26,549,19,597,26,549,27,604,27,604,26,549,35,544,27,604,35,544,36,609,36,609,35,544,46,542,36,609,46,542,47,611,47,611,46,542,57,544,47,611,57,544,58,609,58,609,57,544,67,549,58,609,67,549,67,604,67,604,67,549,75,556,67,604,75,556,75,597,75,597,75,556,80,565,75,597,80,565,80,587,80,587,80,565,82,576,73,32,62,21,220,0,220,0,62,21,42,16,220,0,42,16,13,13,13,13,42,16,12,13,220,463,13,463,42,447,220,463,42,447,62,442,220,463,62,442,74,431,220,463,74,431,79,413,220,463,79,413,171,442,220,463,171,442,191,448,220,463,191,448,220,450,171,22,159,33,80,78,80,78,159,33,153,52,80,78,153,52,80,386,80,386,153,52,152,78,80,386,152, -78,152,386,80,386,152,386,153,413,80,386,153,413,159,431,80,386,159,431,171,442,80,386,171,442,79,413,152,577,153,565,153,587,153,587,153,565,158,556,153,587,158,556,158,597,158,597,158,556,165,549,158,597,165,549,166,604,166,604,165,549,174,544,166,604,174,544,175,609,175,609,174,544,185,542,175,609,185,542,186,611,186,611,185,542,197,544,186,611,197,544,197,609,197,609,197,544,207,549,197,609,207,549,207,604,207,604,207,549,214,556,207,604,214,556,214,597,214,597,214,556,219,565,214,597,219,565,219,587,219,587,219,565,221,576,220,0,220,13,191,16,220,0,191,16,171,22,220,0,171,22,79,51,220,0,79,51,73,32,220,0,13,13,13,0,79,51,171,22,80,78,42,447,13,463,13,450,26,424,35,427,36,447,36,447,35,427,46,431,36,447,46,431,54,457,54,457,46,431,57,434,54,457,57,434,74,465,74,465,57,434,68,436,74,465,68,436,77,437,77,437,118,429,94,470,94,470,118,429,114,472,94,470,74,465,77,437,277,305,275,305,294,50,277,305,294,50,292,77,277,305,292,77,292,213,277,305,292,213,295,361,364,0,364,13,334,16,364,0,334,16,313,22,364,0,313,22,219,55,364,0,219,55,214,34,364,0,214,34,202,23,364,0,202,23,181,16,364,0,181,16,150,13,364,0,150,13,150,0,237,411,220,206,294,50,237,411,294,50,260,364,260,364,294,50,275,305,219,55,313,22,220,86,220,86,313,22,301,32,220,86,301,32,220,206,220,206,301,32,294,50,465,469,456,469,470,451,470,451,456,469,448,470,470,451,448,470,414,438,414,438,448,470,404,462,414,438,404,462,365,403,365,403,404,462,362,441,365,403,362,441,327,351,327,351,362,441,325,406,327,351,325,406,301,286,301,286,325,406,295,361,301,286,295,361,292,213,474,467,470,451,474,451,474,467,474,451,483,465,483,465,474,451,479,450,483,465,479,450,483,449,488,449,492,448,492,461,488,449,492,461,483,449,483,449,492,461,483,465,291,577,293,565,293,587,293,587,293,565,298,556,293,587,298,556,298,597,298,597,298,556,305,549,298,597,305,549,305,604,305,604,305,549,314,544,305,604,314,544,315,609,315,609,314,544,325,542,315,609,325,542,326, -611,326,611,325,542,336,544,326,611,336,544,337,609,337,609,336,544,346,549,337,609,346,549,346,604,346,604,346,549,353,556,346,604,353,556,353,597,353,597,353,556,358,565,353,597,358,565,358,587,358,587,358,565,360,576,152,577,153,565,153,587,153,587,153,565,158,556,153,587,158,556,158,597,158,597,158,556,165,549,158,597,165,549,166,604,166,604,165,549,174,544,166,604,174,544,175,609,175,609,174,544,185,542,175,609,185,542,186,611,186,611,185,542,197,544,186,611,197,544,197,609,197,609,197,544,207,549,197,609,207,549,207,604,207,604,207,549,214,556,207,604,214,556,214,597,214,597,214,556,219,565,214,597,219,565,219,587,219,587,219,565,221,576,118,429,153,404,163,465,163,465,153,404,182,360,163,465,182,360,204,445,204,445,182,360,204,295,204,445,204,295,237,411,237,411,204,295,220,206,114,472,118,429,163,465,470,451,474,467,465,469,26,424,36,447,20,435,88,234,98,265,111,313,111,313,98,265,114,286,111,313,114,286,158,322,158,322,114,286,133,298,158,322,133,298,154,302,154,302,181,291,158,322,158,322,181,291,191,316,220,463,222,412,225,463,225,463,222,412,228,419,225,463,228,419,231,460,231,460,228,419,233,426,231,460,233,426,236,456,236,456,233,426,237,432,236,456,237,432,239,450,239,450,237,432,240,438,239,450,240,438,241,443,222,412,220,463,212,463,222,412,212,463,206,461,222,412,206,461,201,458,222,412,201,458,196,453,222,412,196,453,193,448,222,412,193,448,176,355,201,262,216,223,218,300,218,300,216,223,226,182,218,300,226,182,239,277,239,277,226,182,232,145,239,277,232,145,244,45,239,277,244,45,255,250,255,250,244,45,259,70,255,250,259,70,266,220,266,220,259,70,266,45,266,220,266,45,297,315,297,315,266,45,275,23,297,315,275,23,288,131,288,131,275,23,286,7,288,131,286,7,299,-2,191,316,181,291,201,262,191,316,201,262,218,300,244,45,232,145,226,117,244,45,226,117,226,24,226,24,226,117,217,83,226,24,217,83,206,7,206,7,217,83,202,49,206,7,202,49,183,23,109,1,152,-6,126,26,126,26,152,-6,158,13,183,23,158,13,181,-2,183,23,181,-2,206,7,294,109,288,131,299,-2,297, -315,288,131,365,315,352,54,348,44,350,12,350,12,348,44,343,38,350,12,343,38,337,37,337,37,324,43,334,-1,334,-1,324,43,315,-6,294,109,299,-2,302,84,302,84,299,-2,315,-6,302,84,315,-6,313,61,313,61,315,-6,324,43,361,33,368,60,370,91,361,33,370,91,360,91,361,33,360,91,357,70,361,33,357,70,352,54,361,33,352,54,350,12,337,37,334,-1,350,12,158,13,152,-6,181,-2,126,26,105,60,109,1,109,1,105,60,92,106,109,1,92,106,73,23,73,23,92,106,85,153,73,23,85,153,84,191,84,191,88,234,72,289,72,289,88,234,111,313,73,23,84,191,72,289,73,23,72,289,45,58,45,58,72,289,44,253,45,58,44,253,27,103,27,103,44,253,26,208,27,103,26,208,20,156,176,355,193,448,152,355,51,18,90,0,65,158,65,158,90,0,80,91,88,165,80,91,85,114,88,165,85,114,98,131,101,199,94,215,98,131,98,131,94,215,91,234,88,165,91,234,84,303,88,165,84,303,69,172,69,172,84,303,56,283,69,172,56,283,54,183,54,183,56,283,43,197,199,320,170,322,178,301,178,301,170,322,157,302,135,298,157,302,170,322,135,298,170,322,121,317,175,463,177,412,181,463,181,463,177,412,183,419,181,463,183,419,186,460,186,460,183,419,189,426,186,460,189,426,191,456,191,456,189,426,193,432,191,456,193,432,195,450,195,450,193,432,195,438,195,450,195,438,196,443,177,412,175,463,167,463,177,412,167,463,161,461,177,412,161,461,156,458,177,412,156,458,152,453,177,412,152,453,148,448,177,412,148,448,131,355,272,278,254,299,255,222,272,278,255,222,264,225,272,278,264,225,272,231,272,278,272,231,277,239,272,278,277,239,279,250,221,232,228,226,228,312,228,312,228,226,236,222,228,312,236,222,254,299,254,299,236,222,245,220,254,299,245,220,255,222,178,301,195,297,199,320,199,320,195,297,208,292,199,320,208,292,228,312,228,312,208,292,215,284,228,312,215,284,218,273,218,273,221,232,228,312,218,273,218,270,221,232,221,232,218,270,217,266,221,232,217,266,216,240,216,240,217,266,216,262,216,240,216,262,215,257,121,317,84,303,94,255,121,317,94,255,103,273,121,317,103,273,117,288,121,317,117, -288,135,298,94,255,84,303,91,234,39,258,34,230,36,213,39,258,36,213,43,197,39,258,43,197,56,283,116,143,136,149,129,177,129,177,136,149,151,174,162,175,151,174,155,152,116,143,129,177,113,186,116,143,113,186,101,199,116,143,101,199,98,131,88,165,98,131,91,234,155,152,151,174,136,149,163,151,169,150,170,176,170,176,169,150,174,149,170,176,174,149,177,178,177,178,174,149,180,148,177,178,180,148,184,180,184,180,180,148,186,148,184,180,186,148,193,180,193,180,186,148,198,149,193,180,198,149,203,180,203,180,198,149,208,152,203,180,208,152,210,177,210,177,208,152,214,156,210,177,214,156,216,174,216,174,214,156,218,160,216,174,218,160,219,170,219,170,218,160,220,166,162,175,155,152,163,151,162,175,163,151,170,176,113,38,151,-6,132,31,132,31,151,-6,154,28,183,31,154,28,182,-2,183,31,182,-2,211,8,96,51,85,69,90,0,96,51,90,0,151,-6,96,51,151,-6,113,38,80,91,90,0,85,69,17,85,19,65,21,107,21,107,19,65,29,41,21,107,29,41,31,128,31,128,29,41,51,18,31,128,51,18,46,145,46,145,51,18,65,158,285,95,275,102,264,56,264,56,275,102,254,76,264,56,254,76,239,28,239,28,254,76,232,55,239,28,232,55,211,8,211,8,232,55,209,40,211,8,209,40,183,31,154,28,151,-6,182,-2,65,158,80,91,88,165,216,240,215,257,215,250,131,355,148,448,107,355,22,246,27,255,31,285,31,285,27,255,34,264,31,285,34,264,46,302,46,302,34,264,42,270,46,302,42,270,51,272,51,272,54,271,62,314,62,314,54,271,58,267,62,314,58,267,61,258,18,264,7,241,17,238,18,264,17,238,22,246,18,264,22,246,31,285,122,266,121,266,123,0,122,266,123,0,123,244,122,266,123,244,143,287,123,244,140,260,143,287,143,287,140,260,155,271,143,287,155,271,164,303,164,303,155,271,169,278,164,303,169,278,184,314,184,314,169,278,182,282,184,314,182,282,195,284,195,284,214,281,203,320,203,320,214,281,223,322,123,0,121,266,118,286,123,0,118,286,114,302,123,0,114,302,106,312,123,0,106,312,95,317,123,0,95,317,79,319,123,0,79,319,64,219,123,0,64,219,64, -0,203,320,184,314,195,284,305,-91,305,223,302,255,305,-91,302,255,292,282,305,-91,292,282,306,-107,275,303,252,317,254,-144,275,303,254,-144,257,-151,275,303,257,-151,306,-107,275,303,306,-107,292,282,257,-151,316,-151,312,-142,257,-151,312,-142,309,-132,257,-151,309,-132,307,-120,257,-151,307,-120,306,-107,252,317,223,322,228,273,252,317,228,273,238,259,252,317,238,259,244,240,252,317,244,240,246,216,252,317,246,216,247,-111,252,317,247,-111,248,-126,252,317,248,-126,251,-136,252,317,251,-136,254,-144,246,216,246,-90,247,-111,185,463,188,412,191,463,191,463,188,412,194,419,191,463,194,419,197,460,197,460,194,419,199,426,197,460,199,426,202,456,202,456,199,426,203,432,202,456,203,432,205,450,205,450,203,432,205,438,205,450,205,438,206,443,188,412,185,463,178,463,188,412,178,463,171,461,188,412,171,461,166,458,188,412,166,458,162,453,188,412,162,453,159,448,188,412,159,448,141,355,63,242,64,219,79,319,63,242,79,319,62,314,63,242,62,314,61,258,62,314,46,302,51,272,141,355,159,448,118,355,223,322,214,281,228,273,124,463,126,412,130,463,130,463,126,412,132,419,130,463,132,419,135,460,135,460,132,419,137,426,135,460,137,426,140,456,140,456,137,426,141,432,140,456,141,432,143,450,143,450,141,432,144,438,143,450,144,438,145,443,126,412,124,463,116,463,126,412,116,463,110,461,126,412,110,461,105,458,126,412,105,458,101,453,126,412,101,453,98,448,126,412,98,448,80,355,63,264,79,306,58,270,58,270,79,306,58,299,58,270,58,299,52,274,52,274,58,299,44,275,39,275,44,275,58,299,39,275,58,299,36,292,79,6,91,-3,101,314,101,314,91,-3,108,-6,101,314,108,-6,123,322,123,322,108,-6,125,55,123,322,125,55,125,320,127,47,129,-1,130,43,130,43,129,-1,147,10,130,43,147,10,134,40,134,40,147,10,139,39,147,40,139,39,147,10,147,40,147,10,163,28,187,70,177,75,176,49,176,49,177,75,168,60,176,49,168,60,163,28,163,28,168,60,161,50,163,28,161,50,154,43,129,-1,127,47,125,51,129,-1,125,51,125,55,129,-1,125,55,108,-6,79,306,63,264,65,254,79,306,65,254,66,241,79,306,66,241,68,37,79, -306,68,37,72,20,79,306,72,20,79,6,79,306,79,6,101,314,66,241,66,55,68,37,36,292,14,285,22,274,36,292,22,274,28,274,36,292,28,274,34,275,36,292,34,275,39,275,22,274,14,285,14,273,147,40,163,28,154,43,80,355,98,448,56,355,26,246,32,255,36,285,36,285,32,255,39,264,36,285,39,264,50,302,50,302,39,264,46,270,50,302,46,270,55,272,55,272,61,269,66,314,66,314,61,269,65,262,66,314,65,262,67,251,23,264,11,241,21,238,23,264,21,238,26,246,23,264,26,246,36,285,69,138,72,93,69,223,68,238,69,223,84,319,68,238,84,319,67,251,67,251,84,319,66,314,76,400,76,379,81,410,81,410,76,379,81,369,81,410,81,369,89,417,89,417,81,369,89,362,89,417,89,362,98,422,98,422,89,362,98,357,98,422,98,357,109,424,109,424,98,357,109,355,109,424,109,355,119,422,119,422,109,355,119,357,119,422,119,357,129,417,129,417,119,357,129,362,129,417,129,362,137,410,137,410,129,362,137,369,137,410,137,369,142,400,142,400,137,369,142,379,142,400,142,379,144,390,127,122,127,270,126,287,127,122,126,287,120,301,127,122,120,301,111,311,127,122,111,311,129,95,198,322,178,322,194,305,198,322,194,305,209,300,198,322,209,300,243,315,280,105,271,69,285,25,285,25,271,69,254,39,285,25,254,39,243,1,243,1,254,39,231,20,243,1,231,20,198,13,198,13,169,20,195,-6,195,-6,169,20,149,40,195,-6,149,40,142,1,142,1,149,40,136,66,142,1,136,66,129,95,106,21,142,1,129,95,106,21,129,95,111,311,106,21,111,311,99,317,106,21,99,317,84,319,106,21,84,319,84,53,84,319,69,223,72,93,84,319,72,93,84,53,66,314,50,302,55,272,209,300,223,292,243,315,243,315,223,292,236,281,243,315,236,281,248,267,248,267,261,246,283,296,283,296,261,246,271,222,283,296,271,222,278,197,283,296,283,146,285,25,283,296,285,25,316,263,316,263,285,25,317,60,316,263,317,60,338,217,338,217,317,60,339,106,338,217,339,106,346,158,283,296,278,197,282,171,283,296,282,171,283,146,283,296,243,315,248,267,198,13,195,-6,243,1,215,400,215,379,220,410,220,410,215, -379,220,369,220,410,220,369,228,417,228,417,220,369,228,362,228,417,228,362,237,422,237,422,228,362,237,357,237,422,237,357,248,424,248,424,237,357,248,355,248,424,248,355,259,422,259,422,248,355,259,357,259,422,259,357,268,417,268,417,259,357,268,362,268,417,268,362,276,410,276,410,268,362,276,369,276,410,276,369,281,400,281,400,276,369,281,379,281,400,281,379,283,390,209,463,211,412,214,463,214,463,211,412,217,419,214,463,217,419,220,460,220,460,217,419,222,426,220,460,222,426,225,456,225,456,222,426,226,432,225,456,226,432,228,450,228,450,226,432,229,438,228,450,229,438,230,443,211,412,209,463,201,463,211,412,201,463,194,461,211,412,194,461,189,458,211,412,189,458,185,453,211,412,185,453,182,448,211,412,182,448,165,355,165,355,182,448,141,355,215,379,215,400,213,390,280,105,285,25,283,146,194,305,178,322,178,308,76,379,76,400,74,390,88,234,98,265,111,313,111,313,98,265,114,286,111,313,114,286,158,322,158,322,114,286,133,298,158,322,133,298,154,302,154,302,181,291,158,322,158,322,181,291,191,316,201,262,216,223,218,300,218,300,216,223,226,182,218,300,226,182,239,277,239,277,226,182,232,145,239,277,232,145,244,45,239,277,244,45,255,250,255,250,244,45,259,70,255,250,259,70,266,220,266,220,259,70,266,45,266,220,266,45,297,315,297,315,266,45,275,23,297,315,275,23,288,131,288,131,275,23,286,7,288,131,286,7,299,-2,191,316,181,291,201,262,191,316,201,262,218,300,244,45,232,145,226,117,244,45,226,117,226,24,226,24,226,117,217,83,226,24,217,83,206,7,206,7,217,83,202,49,206,7,202,49,183,23,109,1,152,-6,126,26,126,26,152,-6,158,13,183,23,158,13,181,-2,183,23,181,-2,206,7,294,109,288,131,299,-2,297,315,288,131,365,315,352,54,348,44,350,12,350,12,348,44,343,38,350,12,343,38,337,37,337,37,324,43,334,-1,334,-1,324,43,315,-6,294,109,299,-2,302,84,302,84,299,-2,315,-6,302,84,315,-6,313,61,313,61,315,-6,324,43,361,33,368,60,370,91,361,33,370,91,360,91,361,33,360,91,357,70,361,33,357,70,352,54,361,33,352,54,350,12,337,37,334,-1,350, -12,158,13,152,-6,181,-2,126,26,105,60,109,1,109,1,105,60,92,106,109,1,92,106,73,23,73,23,92,106,85,153,73,23,85,153,84,191,84,191,88,234,72,289,72,289,88,234,111,313,73,23,84,191,72,289,73,23,72,289,45,58,45,58,72,289,44,253,45,58,44,253,27,103,27,103,44,253,26,208,27,103,26,208,20,156,151,454,174,459,174,459,187,478,174,459,202,451,187,478,202,451,220,473,220,473,202,451,222,433,220,473,222,433,250,458,250,458,222,433,234,406,250,458,234,406,240,376,241,280,254,286,241,330,241,280,241,330,238,314,241,280,238,314,237,250,241,280,237,250,251,226,241,280,251,226,242,279,327,159,323,192,320,109,320,109,323,192,313,221,320,109,313,221,300,64,300,64,313,221,296,247,300,64,296,247,272,267,269,27,300,64,272,267,269,27,272,267,266,141,269,27,266,141,262,101,269,27,262,101,251,66,269,27,251,66,233,39,269,27,233,39,230,2,272,267,242,279,251,226,272,267,251,226,262,191,272,267,262,191,266,141,238,314,232,301,237,250,237,250,232,301,224,292,237,250,224,292,221,262,221,262,224,292,213,289,181,16,184,-6,210,22,210,22,184,-6,230,2,210,22,230,2,233,39,119,416,133,439,143,472,143,472,133,439,151,454,143,472,151,454,187,478,187,478,151,454,174,459,109,350,111,386,106,450,109,350,106,450,106,-122,109,350,106,-122,108,-109,109,350,108,-109,109,-94,106,450,111,386,119,416,106,450,119,416,143,472,106,450,76,411,98,-151,106,450,98,-151,100,-144,106,450,100,-144,103,-134,106,450,103,-134,106,-122,98,-151,76,411,57,349,98,-151,57,349,50,261,98,-151,50,261,50,-94,98,-151,50,-94,49,-107,98,-151,49,-107,48,-119,98,-151,48,-119,45,-131,98,-151,45,-131,42,-141,98,-151,42,-141,38,-151,160,18,140,26,151,-3,160,18,151,-3,166,-5,160,18,166,-5,181,16,151,-3,140,26,137,2,137,2,140,26,124,37,137,2,124,37,123,10,123,10,124,37,113,50,123,10,113,50,109,63,109,63,109,22,123,10,207,266,213,289,206,290,207,266,206,290,199,266,166,263,175,262,177,295,177,295,175,262,182,262,177,295,182,262,183,294,183,294,182,262,188,263,183,294,188,263,190,293,190, -293,188,263,193,265,190,293,193,265,198,291,198,291,193,265,199,266,198,291,199,266,206,290,149,284,149,274,152,288,152,288,149,274,153,269,152,288,153,269,157,291,157,291,153,269,158,265,157,291,158,265,166,294,166,294,158,265,166,263,166,294,166,263,177,295,242,345,254,286,250,458,242,345,250,458,240,376,288,321,292,331,293,405,293,405,292,331,296,341,293,405,296,341,299,370,299,370,296,341,298,351,299,370,298,351,299,360,265,293,275,302,276,435,276,435,275,302,282,311,276,435,282,311,293,405,293,405,282,311,288,321,276,435,250,458,254,286,276,435,254,286,265,293,241,330,254,286,242,345,207,266,221,262,213,289,184,-6,181,16,166,-5,149,274,149,284,148,280,49,269,58,271,58,271,68,320,58,271,92,251,68,320,92,251,109,299,109,299,92,251,117,200,109,299,117,200,135,248,135,248,117,200,134,134,135,248,134,134,144,71,168,68,161,117,166,-148,166,-148,161,117,151,183,166,-148,151,183,149,25,149,25,151,183,144,71,144,71,151,183,135,248,166,-148,178,-137,168,68,168,68,178,-137,180,0,168,68,180,0,241,315,241,315,180,0,311,315,149,25,144,13,148,-151,149,25,148,-151,166,-148,139,1,134,-11,135,-149,139,1,135,-149,148,-151,139,1,148,-151,144,13,134,-11,130,-23,135,-149,135,-149,130,-23,126,-36,135,-149,126,-36,125,-142,125,-142,126,-36,121,-51,125,-142,121,-51,119,-132,119,-132,121,-51,118,-66,119,-132,118,-66,115,-80,115,-119,119,-132,115,-80,115,-119,115,-80,114,-93,115,-119,114,-93,113,-104,190,-103,191,-82,190,-63,190,-103,190,-63,188,-45,190,-103,188,-45,186,-27,190,-103,186,-27,186,-122,186,-122,186,-27,183,-12,186,-122,183,-12,180,0,186,-122,180,0,178,-137,30,249,39,262,45,313,45,313,39,262,49,269,45,313,49,269,68,320,68,320,49,269,58,271,28,297,16,272,17,209,28,297,17,209,22,232,28,297,22,232,30,249,28,297,30,249,45,313,9,242,7,209,17,209,9,242,17,209,16,272,59,405,63,376,66,433,66,433,63,376,75,352,66,433,75,352,86,454,86,454,75,352,85,406,95,331,85,406,75,352,90,423,101,435,113,468,113,468,101,435,117,443,113,468,117,443,143,476,143,476,117,443,133,447,143,476,133, -447,148,448,148,448,191,443,173,478,173,478,191,443,203,476,86,454,85,406,90,423,86,454,90,423,113,468,277,397,284,403,284,445,284,445,284,403,289,410,284,445,289,410,292,426,292,426,289,410,291,418,216,430,232,414,235,470,235,470,232,414,246,401,235,470,246,401,263,460,263,460,246,401,267,395,263,460,267,395,284,445,284,445,267,395,277,397,203,476,191,443,216,430,203,476,216,430,235,470,329,162,325,197,322,107,322,107,325,197,315,229,322,107,315,229,302,60,302,60,315,229,298,258,302,60,298,258,275,282,269,24,302,60,275,282,269,24,275,282,266,145,269,24,266,145,262,100,269,24,262,100,252,63,269,24,252,63,235,35,269,24,235,35,225,1,275,282,247,303,251,209,275,282,251,209,262,176,275,282,262,176,266,145,203,327,178,280,209,265,203,327,209,265,247,303,247,303,209,265,233,240,247,303,233,240,251,209,156,19,172,-6,169,14,169,14,172,-6,182,13,169,14,182,13,182,12,182,12,182,13,211,18,211,18,182,13,225,1,211,18,225,1,235,35,182,13,172,-6,225,1,173,478,143,476,148,448,96,98,121,2,106,72,106,72,121,2,120,48,130,36,120,48,121,2,130,36,121,2,172,-6,95,384,95,331,122,365,122,365,95,331,122,314,122,365,122,314,159,347,159,347,122,314,155,298,159,347,155,298,178,280,87,201,99,231,108,285,108,285,99,231,118,256,108,285,118,256,155,298,155,298,118,256,144,273,155,298,144,273,178,280,108,285,70,261,87,201,87,201,70,261,84,169,85,148,84,169,79,26,85,148,79,26,89,124,89,124,79,26,121,2,89,124,121,2,96,98,79,26,84,169,70,261,79,26,70,261,47,61,47,61,70,261,43,230,47,61,43,230,27,104,27,104,43,230,26,192,27,104,26,192,20,152,142,26,130,36,172,-6,142,26,172,-6,156,19,85,406,95,331,95,384,178,280,203,327,159,347,51,18,90,0,65,158,65,158,90,0,80,91,88,165,80,91,85,114,88,165,85,114,98,131,101,199,94,215,98,131,98,131,94,215,91,234,88,165,91,234,84,303,88,165,84,303,69,172,69,172,84,303,56,283,69,172,56,283,54,183,54,183,56,283,43,197,199,320,170,322,178,301,178,301,170,322,157, -302,135,298,157,302,170,322,135,298,170,322,121,317,272,278,254,299,255,222,272,278,255,222,264,225,272,278,264,225,272,231,272,278,272,231,277,239,272,278,277,239,279,250,221,232,228,226,228,312,228,312,228,226,236,222,228,312,236,222,254,299,254,299,236,222,245,220,254,299,245,220,255,222,178,301,195,297,199,320,199,320,195,297,208,292,199,320,208,292,228,312,228,312,208,292,215,284,228,312,215,284,218,273,218,273,221,232,228,312,218,273,218,270,221,232,221,232,218,270,217,266,221,232,217,266,216,240,216,240,217,266,216,262,216,240,216,262,215,257,121,317,84,303,94,255,121,317,94,255,103,273,121,317,103,273,117,288,121,317,117,288,135,298,94,255,84,303,91,234,39,258,34,230,36,213,39,258,36,213,43,197,39,258,43,197,56,283,116,143,136,149,129,177,129,177,136,149,151,174,162,175,151,174,155,152,116,143,129,177,113,186,116,143,113,186,101,199,116,143,101,199,98,131,88,165,98,131,91,234,155,152,151,174,136,149,163,151,169,150,170,176,170,176,169,150,174,149,170,176,174,149,177,178,177,178,174,149,180,148,177,178,180,148,184,180,184,180,180,148,186,148,184,180,186,148,193,180,193,180,186,148,198,149,193,180,198,149,203,180,203,180,198,149,208,152,203,180,208,152,210,177,210,177,208,152,214,156,210,177,214,156,216,174,216,174,214,156,218,160,216,174,218,160,219,170,219,170,218,160,220,166,162,175,155,152,163,151,162,175,163,151,170,176,113,38,151,-6,132,31,132,31,151,-6,154,28,183,31,154,28,182,-2,183,31,182,-2,211,8,96,51,85,69,90,0,96,51,90,0,151,-6,96,51,151,-6,113,38,80,91,90,0,85,69,17,85,19,65,21,107,21,107,19,65,29,41,21,107,29,41,31,128,31,128,29,41,51,18,31,128,51,18,46,145,46,145,51,18,65,158,285,95,275,102,264,56,264,56,275,102,254,76,264,56,254,76,239,28,239,28,254,76,232,55,239,28,232,55,211,8,211,8,232,55,209,40,211,8,209,40,183,31,154,28,151,-6,182,-2,65,158,80,91,88,165,216,240,215,257,215,250,60,130,57,164,57,164,51,274,57,164,62,212,51,274,62,212,72,316,72,316,62,212,74,257,72, -316,74,257,101,360,101,360,74,257,91,298,101,360,91,298,111,333,67,371,70,417,63,458,67,371,63,458,53,381,53,381,63,458,49,445,53,381,49,445,42,396,42,396,49,445,41,431,42,396,41,431,38,415,72,427,77,437,82,469,82,469,77,437,86,448,82,469,86,448,107,478,107,478,86,448,98,459,107,478,98,459,113,468,72,427,82,469,63,458,72,427,63,458,70,417,151,423,132,402,132,360,132,360,132,402,117,382,132,360,117,382,111,333,111,333,117,382,103,384,111,333,103,384,101,360,101,360,103,384,100,363,232,458,223,459,225,397,225,397,223,459,199,454,225,397,199,454,199,380,199,380,199,454,175,441,199,380,175,441,167,367,167,367,175,441,151,423,167,367,151,423,132,360,91,387,80,393,84,365,91,387,84,365,100,363,91,387,100,363,103,384,73,403,70,417,67,371,73,403,67,371,84,365,73,403,84,365,80,393,99,-2,133,-6,110,62,110,62,133,-6,145,56,152,56,145,56,147,-5,152,56,147,-5,163,-4,85,77,68,101,69,12,85,77,69,12,99,-2,85,77,99,-2,110,62,60,130,57,164,46,40,60,130,46,40,69,12,60,130,69,12,68,101,57,164,51,274,46,40,46,40,51,274,36,232,46,40,36,232,30,81,30,81,36,232,27,189,30,81,27,189,24,140,248,42,219,53,221,-2,221,-2,219,53,200,0,192,0,200,0,219,53,192,0,219,53,180,57,179,-2,192,0,180,57,179,-2,180,57,172,57,179,-2,172,57,164,57,179,-2,164,57,163,-4,158,57,152,56,163,-4,158,57,163,-4,164,57,179,-91,185,-151,187,-97,187,-97,185,-151,211,-146,187,-97,211,-146,196,-102,196,-102,211,-146,206,-104,223,-101,206,-104,211,-146,223,-101,211,-146,238,-131,285,-41,281,-4,279,-77,279,-77,281,-4,269,22,279,-77,269,22,263,-47,263,-47,262,-107,279,-77,221,-2,238,-8,248,42,248,42,238,-8,252,-18,248,42,252,-18,269,22,269,22,252,-18,260,-31,269,22,260,-31,263,-47,262,-107,263,-47,260,-66,262,-107,260,-66,251,-82,262,-107,251,-82,238,-94,262,-107,238,-94,238,-131,153,-85,155,-145,164,-83,164,-83,155,-145,169,-150,164,-83,169,-150,172,-85,172,-85,169,-150,185,-151,172,-85,185,-151,179,-91,136,-103,137,-127,139,-95,139,-95,137, --127,144,-138,139,-95,144,-138,145,-89,145,-89,144,-138,155,-145,145,-89,155,-145,153,-85,246,450,240,455,243,416,246,450,243,416,250,435,246,450,250,435,249,443,232,458,225,397,243,416,232,458,243,416,240,455,145,56,133,-6,147,-5,137,-127,136,-103,134,-112,223,-101,238,-131,238,-94,22,246,27,255,31,285,31,285,27,255,34,264,31,285,34,264,46,302,46,302,34,264,42,270,46,302,42,270,51,272,51,272,54,271,62,314,62,314,54,271,58,267,62,314,58,267,61,258,18,264,7,241,17,238,18,264,17,238,22,246,18,264,22,246,31,285,122,266,121,266,123,0,122,266,123,0,123,244,122,266,123,244,143,287,123,244,140,260,143,287,143,287,140,260,155,271,143,287,155,271,164,303,164,303,155,271,169,278,164,303,169,278,184,314,184,314,169,278,182,282,184,314,182,282,195,284,195,284,214,281,203,320,203,320,214,281,223,322,123,0,121,266,118,286,123,0,118,286,114,302,123,0,114,302,106,312,123,0,106,312,95,317,123,0,95,317,79,319,123,0,79,319,64,219,123,0,64,219,64,0,203,320,184,314,195,284,305,-91,305,223,302,255,305,-91,302,255,292,282,305,-91,292,282,306,-107,275,303,252,317,254,-144,275,303,254,-144,257,-151,275,303,257,-151,306,-107,275,303,306,-107,292,282,257,-151,316,-151,312,-142,257,-151,312,-142,309,-132,257,-151,309,-132,307,-120,257,-151,307,-120,306,-107,252,317,223,322,228,273,252,317,228,273,238,259,252,317,238,259,244,240,252,317,244,240,246,216,252,317,246,216,247,-111,252,317,247,-111,248,-126,252,317,248,-126,251,-136,252,317,251,-136,254,-144,246,216,246,-90,247,-111,63,242,64,219,79,319,63,242,79,319,62,314,63,242,62,314,61,258,62,314,46,302,51,272,223,322,214,281,228,273,209,476,177,478,210,445,210,445,177,478,166,459,139,453,166,459,177,478,139,453,177,478,121,467,323,319,316,355,321,154,323,319,321,154,327,233,323,319,327,233,326,278,307,387,295,414,301,88,307,387,301,88,321,154,307,387,321,154,316,355,32,114,40,90,45,383,45,383,40,90,56,57,45,383,56,57,77,434,77,434,56,57,77,30,77,434,77,30,82,270,82,270,77,30,82,226,82,270,82,226,82,248,82,248,82,226,265, -248,265,248,82,226,265,226,265,248,265,226,269,37,265,248,269,37,278,438,278,438,269,37,301,88,278,438,301,88,295,414,239,409,255,359,259,456,259,456,255,359,263,302,259,456,263,302,278,438,278,438,263,302,265,248,236,468,209,476,210,445,236,468,210,445,239,409,236,468,239,409,259,456,262,152,252,94,269,37,269,37,252,94,235,50,269,37,235,50,226,5,226,5,235,50,211,22,226,5,211,22,179,13,179,13,137,25,170,-6,170,-6,137,25,134,-2,110,59,93,107,103,10,110,59,103,10,134,-2,110,59,134,-2,137,25,82,226,77,30,85,165,85,165,77,30,103,10,85,165,103,10,93,107,265,221,262,152,269,37,265,221,269,37,265,226,179,13,170,-6,226,5,82,270,86,346,77,434,77,434,86,346,98,400,77,434,98,400,121,467,121,467,98,400,116,434,121,467,116,434,139,453,19,201,22,169,25,317,25,317,22,169,26,140,25,317,26,140,45,383,45,383,26,140,32,114,19,201,25,317,19,238,63,264,79,306,58,270,58,270,79,306,58,299,58,270,58,299,52,274,52,274,58,299,44,275,39,275,44,275,58,299,39,275,58,299,36,292,79,6,91,-3,101,314,101,314,91,-3,108,-6,101,314,108,-6,123,322,123,322,108,-6,125,55,123,322,125,55,125,320,127,47,129,-1,130,43,130,43,129,-1,147,10,130,43,147,10,134,40,134,40,147,10,139,39,147,40,139,39,147,10,147,40,147,10,163,28,187,70,177,75,176,49,176,49,177,75,168,60,176,49,168,60,163,28,163,28,168,60,161,50,163,28,161,50,154,43,129,-1,127,47,125,51,129,-1,125,51,125,55,129,-1,125,55,108,-6,79,306,63,264,65,254,79,306,65,254,66,241,79,306,66,241,68,37,79,306,68,37,72,20,79,306,72,20,79,6,79,306,79,6,101,314,66,241,66,55,68,37,36,292,14,285,22,274,36,292,22,274,28,274,36,292,28,274,34,275,36,292,34,275,39,275,22,274,14,285,14,273,147,40,163,28,154,43,15,281,19,281,26,297,26,297,19,281,23,281,26,297,23,281,27,281,27,281,39,280,48,303,48,303,39,280,48,276,48,303,48,276,53,268,10,280,15,281,26,297,10,280,26,297,5,291,10,280,5,291,5,280,48, -303,53,268,67,308,67,308,53,268,56,256,67,308,56,256,57,239,116,0,57,239,57,0,48,303,26,297,27,281,116,180,116,320,113,322,116,180,113,322,116,0,116,180,116,0,116,159,116,180,116,159,178,246,184,221,206,240,224,287,224,287,206,240,225,253,224,287,225,253,258,310,258,310,225,253,244,260,258,310,244,260,263,262,263,262,272,261,283,320,283,320,272,261,281,259,283,320,281,259,290,257,178,246,116,159,158,195,178,246,158,195,184,221,178,246,184,221,224,287,116,0,113,322,98,317,116,0,98,317,83,313,116,0,83,313,67,308,116,0,67,308,57,239,317,255,327,258,328,315,328,315,327,258,335,265,328,315,335,265,336,308,336,308,335,265,341,275,336,308,341,275,341,299,341,299,341,275,343,288,290,257,299,255,302,322,302,322,299,255,308,254,302,322,308,254,316,320,316,320,308,254,317,255,316,320,317,255,328,315,283,320,258,310,263,262,214,17,209,13,352,0,352,0,209,13,202,11,352,0,202,11,192,10,219,27,352,0,320,19,219,27,320,19,306,27,219,27,306,27,293,38,219,27,293,38,279,54,219,27,279,54,218,31,279,54,158,195,208,48,279,54,208,48,211,42,279,54,211,42,214,38,279,54,214,38,217,34,279,54,217,34,218,31,335,13,320,19,352,0,335,13,352,0,352,10,218,22,214,17,352,0,218,22,352,0,219,27,186,10,186,0,352,0,186,10,352,0,192,10,208,48,158,195,116,159,283,320,290,257,302,322,79,428,90,429,90,429,95,478,90,429,103,425,95,478,103,425,116,473,116,473,103,425,116,414,116,473,116,414,132,460,132,460,116,414,129,396,132,460,129,396,140,374,158,409,150,347,159,315,158,409,159,315,169,373,169,373,159,315,179,248,169,373,179,248,247,99,247,99,179,248,230,63,247,99,230,63,237,40,146,438,132,460,140,374,146,438,140,374,150,347,146,438,150,347,158,409,247,99,237,40,246,21,247,99,246,21,257,6,159,315,9,0,78,0,159,315,78,0,179,248,281,44,270,53,271,-3,271,-3,270,53,261,65,271,-3,261,65,257,6,257,6,261,65,253,81,257,6,253,81,247,99,329,75,320,59,323,12,323,12,320,59,310,49,323,12,310,49,306,-2,306,-2,310, -49,301,43,306,-2,301,43,292,41,292,41,281,44,286,-7,286,-7,281,44,271,-3,334,34,342,62,345,96,334,34,345,96,334,96,334,34,334,96,329,75,334,34,329,75,323,12,292,41,286,-7,306,-2,60,414,68,423,72,472,72,472,68,423,79,428,72,472,79,428,95,478,95,478,79,428,90,429,55,455,44,431,48,375,55,455,48,375,53,398,55,455,53,398,60,414,55,455,60,414,72,472,39,403,37,375,48,375,39,403,48,375,44,431,109,315,50,315,96,-151,109,315,96,-151,99,-143,109,315,99,-143,102,-132,109,315,102,-132,105,-120,109,315,105,-120,106,-106,109,315,106,-106,107,13,109,315,107,13,109,13,96,-151,50,315,50,-91,96,-151,50,-91,49,-105,96,-151,49,-105,48,-119,96,-151,48,-119,45,-131,96,-151,45,-131,42,-141,96,-151,42,-141,38,-151,122,0,131,-3,135,44,135,44,131,-3,141,-5,135,44,141,-5,151,36,151,36,141,-5,152,-6,151,36,152,-6,169,34,169,34,152,-6,166,-5,169,34,166,-5,183,0,239,74,236,67,240,50,240,50,236,67,232,61,240,50,232,61,226,55,226,55,214,47,221,26,221,26,214,47,202,41,221,26,202,41,201,10,201,10,202,41,190,37,201,10,190,37,183,0,183,0,190,37,179,34,183,0,179,34,169,34,121,57,112,75,114,5,121,57,114,5,122,0,121,57,122,0,135,44,114,5,112,75,109,97,114,5,109,97,109,13,300,315,241,315,243,32,243,32,241,315,241,95,243,32,241,95,241,50,241,50,241,95,241,83,241,50,241,83,240,50,240,50,241,83,239,74,226,55,221,26,240,50,300,315,243,32,247,16,300,315,247,16,255,4,300,315,255,4,268,-3,300,315,268,-3,284,-6,300,315,284,-6,300,79,342,59,335,49,337,28,337,28,335,49,328,43,337,28,328,43,322,10,322,10,328,43,321,40,322,10,321,40,314,39,314,39,310,40,322,10,322,10,310,40,306,44,322,10,306,44,304,-1,304,-1,306,44,303,51,304,-1,303,51,301,62,350,49,361,70,351,74,350,49,351,74,342,59,350,49,342,59,337,28,301,62,300,79,284,-6,301,62,284,-6,304,-1,107,13,106,-106,107,-90,63,263,79,306,58,269,58,269,79,306,58,299,58,269,58,299,52,274,52,274,58,299,44, -275,40,275,44,275,58,299,40,275,58,299,36,292,125,320,123,322,125,63,125,63,123,322,101,314,125,63,101,314,83,-9,83,-9,101,314,79,306,83,-9,79,306,66,241,66,241,79,306,65,253,36,292,14,285,21,274,36,292,21,274,28,274,36,292,28,274,34,275,36,292,34,275,40,275,260,118,265,198,228,76,228,76,265,198,228,136,228,76,228,136,188,39,188,39,228,136,181,88,188,39,181,88,139,10,139,10,181,88,126,63,265,198,284,162,288,263,288,263,284,162,297,198,288,263,297,198,297,322,297,322,297,198,304,232,297,322,304,232,310,322,310,322,304,232,308,265,310,322,308,265,310,295,125,63,83,-9,139,10,125,63,139,10,126,63,66,241,66,-9,83,-9,21,274,14,285,14,273,265,198,260,118,284,162,79,306,63,263,65,253,71,83,60,106,62,15,62,15,60,106,56,137,55,210,56,137,60,165,55,210,60,165,76,236,76,236,60,165,70,191,76,236,70,191,86,212,85,375,88,427,80,459,85,375,80,459,74,381,74,381,80,459,67,447,74,381,67,447,65,389,65,389,67,447,60,432,65,389,60,432,59,401,59,401,60,432,57,416,89,434,93,443,99,470,99,470,93,443,100,451,99,470,100,451,124,478,124,478,100,451,112,459,124,478,112,459,130,467,89,434,99,470,80,459,89,434,80,459,88,427,102,328,106,396,100,315,100,315,98,401,97,373,97,373,98,401,93,408,97,373,93,408,89,416,116,394,106,396,107,341,116,394,107,341,117,351,116,394,117,351,135,406,101,305,102,258,104,295,104,295,102,258,107,230,104,295,107,230,109,286,109,286,107,230,132,244,109,286,132,244,116,278,116,278,132,244,124,271,141,283,132,244,143,241,141,283,143,241,159,292,159,292,143,241,154,240,159,292,154,240,164,238,102,258,76,236,86,212,102,258,86,212,107,230,102,258,101,305,100,315,102,258,100,315,97,373,102,258,97,373,91,266,73,327,73,301,76,339,76,339,73,301,77,289,76,339,77,289,81,352,81,352,77,289,83,277,81,352,83,277,88,363,88,363,83,277,91,266,88,363,91,266,97,373,89,416,88,427,85,375,89,416,85,375,97,373,180,57,173,57,179,-2,179,-2,173,57,165,57,179,-2,165,57,164,-4,164, --4,165,57,155,57,164,-4,155,57,150,-5,150,-5,155,57,146,56,150,-5,146,56,138,-6,138,-6,146,56,138,56,138,-6,138,56,137,56,137,56,138,56,110,59,248,41,219,53,221,-2,221,-2,219,53,200,0,192,0,200,0,219,53,192,0,219,53,180,57,179,-91,185,-151,187,-97,187,-97,185,-151,212,-146,187,-97,212,-146,196,-102,196,-102,212,-146,206,-104,223,-101,206,-104,212,-146,223,-101,212,-146,239,-131,285,-37,281,-5,279,-75,279,-75,281,-5,269,21,279,-75,269,21,263,-47,263,-47,262,-107,279,-75,221,-2,238,-8,248,41,248,41,238,-8,252,-18,248,41,252,-18,269,21,269,21,252,-18,260,-31,269,21,260,-31,263,-47,263,-47,260,-67,262,-107,262,-107,260,-67,251,-82,262,-107,251,-82,239,-131,239,-131,251,-82,238,-94,239,-131,238,-94,223,-101,153,-85,155,-145,164,-83,164,-83,155,-145,169,-150,164,-83,169,-150,172,-85,172,-85,169,-150,185,-151,172,-85,185,-151,179,-91,136,-103,137,-127,139,-95,139,-95,137,-127,144,-138,139,-95,144,-138,145,-89,145,-89,144,-138,155,-145,145,-89,155,-145,153,-85,254,260,259,276,257,286,254,260,257,286,251,293,254,260,251,293,241,299,254,260,241,299,239,249,164,238,173,238,178,298,178,298,173,238,183,238,178,298,183,238,196,303,196,303,183,238,199,238,196,303,199,238,214,304,214,304,199,238,220,242,214,304,220,242,229,303,229,303,220,242,239,249,229,303,239,249,241,299,224,430,224,380,233,427,233,427,224,380,239,393,233,427,239,393,240,422,240,422,239,393,245,407,240,422,245,407,243,415,175,424,176,363,194,429,194,429,176,363,202,370,194,429,202,370,212,430,212,430,202,370,224,380,212,430,224,380,224,430,117,351,131,358,135,406,135,406,131,358,148,361,135,406,148,361,155,416,155,416,148,361,176,363,155,416,176,363,175,424,110,59,88,67,94,0,110,59,94,0,138,-6,110,59,138,-6,137,56,71,83,62,15,94,0,71,83,94,0,88,67,40,41,62,15,56,137,40,41,56,137,55,210,40,41,55,210,38,181,40,41,38,181,28,74,28,148,24,114,28,74,28,148,28,74,38,181,159,292,164,238,178,298,137,-127,136,-103,134,-112,180,57,179,-2,192,0,73,301,73,327,72,314,132,244,141,283,124,271,98,401,100, -315,106,396,106,396,102,328,107,341,135,290,167,299,167,299,181,322,167,299,207,288,181,322,207,288,233,314,233,314,207,288,235,258,233,314,235,258,275,291,275,291,235,258,255,218,275,291,255,218,265,174,266,104,257,72,267,28,267,28,257,72,241,44,267,28,241,44,225,2,225,2,241,44,218,23,225,2,218,23,188,16,188,16,150,26,177,-6,177,-6,150,26,129,0,150,26,121,53,129,0,129,0,121,53,102,91,129,0,102,91,87,21,87,21,102,91,90,132,87,21,90,132,87,171,113,268,128,312,97,237,97,237,128,312,84,284,97,237,84,284,89,203,89,203,84,284,87,171,87,21,87,171,84,284,87,21,84,284,54,53,54,53,84,284,52,243,54,53,52,243,32,94,32,94,52,243,31,194,32,94,31,194,24,141,331,159,325,211,323,111,323,111,325,211,306,256,323,111,306,256,301,66,301,66,306,256,275,291,301,66,275,291,269,134,269,134,267,28,301,66,188,16,177,-6,225,2,135,290,167,299,181,322,135,290,181,322,128,312,135,290,128,312,113,268,266,104,267,28,269,134,275,291,265,174,269,134,101,166,90,108,108,12,108,12,90,108,75,75,108,12,75,75,73,-9,73,-9,75,75,59,58,73,-9,59,58,55,-7,55,-7,59,58,42,51,55,-7,42,51,42,0,42,0,42,51,37,49,42,0,37,49,33,8,33,8,37,49,32,47,33,8,32,47,29,43,28,21,33,8,29,43,28,21,29,43,27,40,28,21,27,40,26,35,135,315,96,311,109,256,109,256,128,68,135,315,135,315,128,68,137,139,135,315,137,139,141,256,141,256,137,139,140,208,252,256,335,256,335,315,252,256,335,315,205,256,205,256,335,315,141,256,246,110,246,124,237,-2,237,-2,246,124,245,138,237,-2,245,138,245,152,245,152,246,177,237,-2,237,-2,246,177,247,202,237,-2,247,202,219,10,219,10,247,202,249,223,219,10,249,223,250,242,206,29,252,256,205,256,206,29,205,256,203,225,250,242,252,256,206,29,250,242,206,29,219,10,135,315,141,256,335,315,6,216,17,216,22,252,22,252,17,216,32,234,22,252,32,234,41,280,41,280,32,234,49,246,41,280,49,246,65,299,65,299,49,246,66,253,65,299,66,253,96,311,96,311,66,253,86, -256,96,311,86,256,109,256,264,58,257,66,259,-6,259,-6,257,66,252,75,259,-6,252,75,249,85,249,85,247,97,259,-6,259,-6,247,97,237,-2,264,58,286,0,272,53,272,53,286,0,284,51,293,52,284,51,286,0,293,52,286,0,308,16,327,96,320,76,324,40,327,96,324,40,334,68,327,96,334,68,338,96,312,63,303,55,308,16,312,63,308,16,324,40,312,63,324,40,320,76,200,190,197,153,197,52,200,190,197,52,206,29,200,190,206,29,203,225,195,115,195,78,197,52,195,115,197,52,197,153,109,256,101,166,108,12,109,256,108,12,128,68,246,110,237,-2,247,97,264,58,259,-6,286,0,293,52,308,16,303,55,150,297,173,302,173,302,181,322,173,302,202,296,181,322,202,296,228,315,228,315,202,296,228,276,228,315,228,276,268,294,268,294,228,276,248,245,268,294,248,245,261,202,268,294,266,148,269,27,268,294,269,27,299,263,299,263,269,27,300,66,299,263,300,66,319,221,319,221,300,66,320,115,319,221,320,115,327,173,269,27,266,148,262,105,269,27,262,105,251,68,269,27,251,68,233,40,269,27,233,40,229,2,181,16,182,-6,210,22,210,22,182,-6,229,2,210,22,229,2,233,40,182,-6,181,16,165,-5,165,-5,181,16,161,18,165,-5,161,18,151,-3,151,-3,161,18,141,26,151,-3,141,26,137,1,137,1,141,26,125,36,137,1,125,36,123,9,123,9,125,36,113,49,123,9,113,49,109,62,119,259,132,283,141,316,141,316,132,283,150,297,141,316,150,297,181,322,181,322,150,297,173,302,109,191,111,229,105,294,109,191,105,294,106,-120,109,191,106,-120,108,-106,109,191,108,-106,109,-90,105,294,111,229,119,259,105,294,119,259,141,316,105,294,76,255,98,-151,105,294,98,-151,101,-143,105,294,101,-143,104,-133,105,294,104,-133,106,-120,98,-151,76,255,57,193,98,-151,57,193,50,106,98,-151,50,106,50,-91,98,-151,50,-91,49,-105,98,-151,49,-105,48,-119,98,-151,48,-119,45,-131,98,-151,45,-131,42,-141,98,-151,42,-141,38,-151,109,62,109,21,123,9,268,294,261,202,266,148,84,76,68,95,70,6,70,6,68,95,59,119,70,6,59,119,46,28,46,28,59,119,57,148,62,239,57,148,64,189,62,239,64,189,102,283,102, -283,64,189,81,221,102,283,81,221,106,243,102,283,106,243,149,312,149,312,106,243,135,256,149,312,135,256,166,260,166,260,198,255,198,322,198,322,198,255,221,243,198,322,221,243,237,318,237,318,221,243,239,229,237,318,239,229,266,306,266,306,239,229,253,217,266,306,253,217,269,212,24,116,30,64,35,182,35,182,30,64,46,28,35,182,46,28,62,239,62,239,46,28,57,148,248,42,219,53,221,-2,221,-2,219,53,200,0,192,0,200,0,219,53,192,0,219,53,180,57,179,-2,192,0,180,57,179,-2,180,57,173,57,179,-2,173,57,166,57,179,-2,166,57,163,-4,147,-5,163,-4,149,56,155,56,149,56,163,-4,155,56,163,-4,161,57,161,57,163,-4,166,57,84,76,99,-3,109,63,109,63,99,-3,133,-6,109,63,133,-6,145,56,145,56,133,-6,147,-5,145,56,147,-5,149,56,179,-91,185,-151,187,-97,187,-97,185,-151,211,-146,187,-97,211,-146,196,-102,196,-102,211,-146,206,-104,223,-101,206,-104,211,-146,223,-101,211,-146,238,-131,285,-41,281,-4,279,-77,279,-77,281,-4,269,22,279,-77,269,22,263,-47,263,-47,262,-107,279,-77,221,-2,238,-8,248,42,248,42,238,-8,252,-18,248,42,252,-18,269,22,269,22,252,-18,260,-31,269,22,260,-31,263,-47,262,-107,263,-47,260,-66,262,-107,260,-66,251,-82,262,-107,251,-82,238,-94,262,-107,238,-94,238,-131,153,-85,155,-145,164,-83,164,-83,155,-145,169,-150,164,-83,169,-150,172,-85,172,-85,169,-150,185,-151,172,-85,185,-151,179,-91,136,-103,137,-127,139,-95,139,-95,137,-127,144,-138,139,-95,144,-138,145,-89,145,-89,144,-138,155,-145,145,-89,155,-145,153,-85,298,268,286,289,291,220,298,268,291,220,297,228,298,268,297,228,301,237,298,268,301,237,302,246,286,289,266,306,269,212,286,289,269,212,282,214,286,289,282,214,291,220,198,322,149,312,166,260,137,-127,136,-103,134,-112,223,-101,238,-131,238,-94,84,76,70,6,99,-3,261,88,251,59,262,22,262,22,251,59,235,35,262,22,235,35,218,1,218,1,235,35,213,19,218,1,213,19,183,13,183,13,154,21,167,-6,167,-6,154,21,127,43,167,-6,127,43,121,1,121,1,127,43,104,76,121,1,104,76,89,117,82,290,84,164,91,204,82,290,91,204,122,309,122,309,91, -204,110,230,122,309,110,230,136,246,81,25,121,1,89,117,81,25,89,117,84,164,81,25,84,164,82,290,81,25,82,290,50,257,81,25,50,257,49,59,28,211,20,151,28,103,28,211,28,103,49,59,28,211,49,59,50,257,214,241,234,217,239,256,239,256,234,217,250,187,239,256,363,315,191,256,167,315,122,309,136,246,167,315,136,246,165,254,167,315,165,254,191,256,167,315,191,256,363,315,191,256,214,241,239,256,327,131,321,169,319,90,319,90,321,169,305,194,319,90,305,194,296,53,296,53,305,194,284,212,296,53,284,212,264,120,264,120,284,212,261,231,264,120,261,231,260,154,261,231,239,256,250,187,261,231,250,187,260,154,264,120,262,22,296,53,183,13,167,-6,218,1,261,88,262,22,264,120,363,315,239,256,363,256,13,193,22,214,25,256,25,256,22,214,35,232,25,256,35,232,47,285,47,285,35,232,51,245,47,285,51,245,77,307,77,307,51,245,70,253,77,307,70,253,92,256,113,315,92,256,150,256,113,315,150,256,309,315,309,315,150,256,191,256,309,315,191,256,309,256,10,224,2,193,13,193,10,224,13,193,25,256,165,0,175,103,174,127,174,127,176,158,165,0,165,0,176,158,150,256,165,0,150,256,144,15,144,15,150,256,143,230,144,15,143,230,135,199,179,189,183,217,150,256,150,256,183,217,187,241,150,256,187,241,191,256,194,-6,219,0,197,55,197,55,219,0,212,51,225,53,212,51,219,0,225,53,219,0,241,15,259,100,254,83,257,38,259,100,257,38,267,68,259,100,267,68,270,100,246,69,236,59,241,15,246,69,241,15,257,38,246,69,257,38,254,83,194,-6,197,55,186,66,194,-6,186,66,179,83,194,-6,179,83,175,103,194,-6,175,103,165,0,144,15,135,199,131,39,131,39,135,199,128,166,131,39,128,166,124,68,124,68,128,166,124,132,124,68,124,132,122,99,225,53,241,15,236,59,92,256,113,315,77,307,179,189,150,256,176,158,26,246,32,255,36,285,36,285,32,255,39,264,36,285,39,264,50,302,50,302,39,264,46,270,50,302,46,270,55,272,55,272,61,269,66,314,66,314,61,269,65,262,66,314,65,262,67,251,23,264,11,241,21,238,23,264,21,238,26,246,23,264,26,246,36, -285,69,138,72,93,69,223,68,238,69,223,84,319,68,238,84,319,67,251,67,251,84,319,66,314,127,122,127,270,126,287,127,122,126,287,120,301,127,122,120,301,111,311,127,122,111,311,129,95,198,322,178,322,194,305,198,322,194,305,209,300,198,322,209,300,243,315,280,105,271,69,285,25,285,25,271,69,254,39,285,25,254,39,243,1,243,1,254,39,231,20,243,1,231,20,198,13,198,13,169,20,195,-6,195,-6,169,20,149,40,195,-6,149,40,142,1,142,1,149,40,136,66,142,1,136,66,129,95,106,21,142,1,129,95,106,21,129,95,111,311,106,21,111,311,99,317,106,21,99,317,84,319,106,21,84,319,84,53,84,319,69,223,72,93,84,319,72,93,84,53,66,314,50,302,55,272,209,300,223,292,243,315,243,315,223,292,236,281,243,315,236,281,248,267,248,267,261,246,283,296,283,296,261,246,271,222,283,296,271,222,278,197,283,296,283,146,285,25,283,296,285,25,316,263,316,263,285,25,317,60,316,263,317,60,338,217,338,217,317,60,339,106,338,217,339,106,346,158,283,296,278,197,282,171,283,296,282,171,283,146,283,296,243,315,248,267,198,13,195,-6,243,1,280,105,285,25,283,146,194,305,178,322,178,308,85,163,84,191,84,191,77,28,84,191,76,289,77,28,76,289,46,64,46,64,76,289,46,254,46,64,46,254,27,109,27,109,46,254,27,210,27,109,27,210,20,160,89,132,77,28,96,101,96,101,77,28,119,4,96,101,119,4,106,73,106,73,119,4,120,48,132,35,120,48,119,4,132,35,119,4,172,-5,85,163,84,191,77,28,85,163,77,28,89,132,189,147,188,107,247,-151,247,-151,188,107,188,13,247,-151,188,13,188,-6,188,-6,188,13,174,14,188,-6,174,14,172,-5,172,-5,174,14,159,18,172,-5,159,18,145,25,188,309,188,320,185,320,188,309,185,320,181,321,188,309,181,321,177,322,188,309,177,322,173,322,188,309,173,322,170,322,188,309,170,322,153,303,245,309,247,-151,247,180,247,13,247,-6,308,2,247,13,308,2,268,13,268,13,308,2,300,20,290,322,282,302,306,292,290,322,306,292,327,314,327,314,306,292,325,266,327,314,325,266,340,229,249,251,254,278,258,316,258,316,254,278,265,296,258, -316,265,296,273,320,273,320,265,296,282,302,273,320,282,302,290,322,245,309,247,180,247,217,245,309,247,217,249,251,245,309,249,251,258,316,247,-151,245,309,233,301,247,-151,233,301,223,291,247,-151,223,291,207,261,247,-151,207,261,197,227,247,-151,197,227,191,188,247,-151,191,188,189,147,415,155,408,211,408,105,408,105,408,211,389,257,408,105,389,257,388,61,388,61,389,257,361,292,388,61,361,292,355,25,355,25,361,292,352,145,355,25,352,145,349,104,355,25,349,104,340,68,361,292,327,314,340,229,361,292,340,229,349,187,361,292,349,187,352,145,324,39,300,20,308,2,324,39,308,2,355,25,324,39,355,25,340,68,88,232,102,264,118,313,118,313,102,264,124,288,118,313,124,288,170,322,170,322,124,288,153,303,88,232,118,313,76,289,88,232,76,289,84,191,247,-151,188,-6,188,-151,132,35,172,-5,145,25,111,313,88,322,94,269,94,269,88,322,78,273,72,271,78,273,88,322,72,271,88,322,68,317,272,315,172,130,176,37,176,37,172,130,158,195,176,37,158,195,155,109,155,109,158,195,144,248,155,109,144,248,141,166,94,269,107,256,111,313,111,313,107,256,120,235,111,313,120,235,129,288,129,288,120,235,131,205,129,288,131,205,144,248,144,248,131,205,141,166,193,57,340,315,272,315,193,57,272,315,176,37,193,57,176,37,191,-47,193,57,191,-47,198,-81,193,57,198,-81,205,2,155,109,8,-147,77,-147,155,109,77,-147,176,37,295,-70,289,-85,292,-126,292,-126,289,-85,281,-96,292,-126,281,-96,277,-145,277,-145,281,-96,272,-102,277,-145,272,-102,263,-104,262,-104,263,-104,248,-100,262,-104,248,-100,255,-153,255,-153,248,-100,236,-147,248,-100,235,-88,236,-147,236,-147,235,-88,224,-68,236,-147,224,-68,220,-132,220,-132,224,-68,215,-38,220,-132,215,-38,207,-110,207,-110,215,-38,205,2,207,-110,205,2,198,-81,302,-100,307,-73,309,-48,302,-100,309,-48,298,-48,302,-100,298,-48,295,-70,302,-100,295,-70,292,-126,262,-104,255,-153,277,-145,262,-104,277,-145,263,-104,48,219,52,240,54,304,54,304,52,240,58,255,54,304,58,255,68,317,68,317,58,255,65,265,68,317,65,265,72,271,48,219,54,304,44,283,48,219,44,283,38,255,48,219,38,255,37,219,335,54,312, -24,331,0,331,0,312,24,276,13,276,-151,276,13,217,-6,276,315,217,315,217,-6,276,315,217,-6,276,13,217,315,217,13,217,-6,217,-6,217,13,181,24,217,-6,181,24,159,0,159,0,181,24,157,54,159,0,157,54,144,97,138,145,137,192,134,229,138,145,134,229,126,264,138,145,126,264,118,20,138,145,118,20,144,97,73,160,78,101,85,314,85,314,78,101,92,54,85,314,92,54,110,294,110,294,92,54,118,20,110,294,118,20,126,264,59,266,69,229,85,314,85,314,69,229,73,191,85,314,73,191,73,160,85,314,51,322,59,266,59,266,51,322,43,322,59,266,43,322,42,295,42,295,43,322,35,321,42,295,35,321,27,321,20,320,14,320,42,295,20,320,42,295,27,321,366,262,358,226,372,22,372,22,358,226,356,190,372,22,356,190,355,144,479,309,479,320,472,321,479,309,472,321,465,321,479,309,465,321,458,322,479,309,458,322,451,295,424,229,434,266,442,322,442,322,434,266,451,295,442,322,451,295,450,322,450,322,451,295,458,322,366,262,372,22,382,292,382,292,372,22,399,57,382,292,399,57,406,314,406,314,399,57,415,103,406,314,415,103,420,192,420,192,415,103,420,160,406,314,420,192,424,229,406,314,424,229,442,322,372,22,355,144,349,96,372,22,349,96,335,54,372,22,335,54,331,0,276,13,276,-6,331,0,276,-151,217,-6,217,-151,42,295,14,320,14,309,144,97,118,20,159,0,99,43,89,75,98,0,98,0,89,75,85,113,98,0,85,113,83,7,83,7,85,113,84,152,87,295,84,152,88,208,87,295,88,208,102,253,151,305,184,312,184,322,151,305,184,322,132,315,151,305,132,315,124,285,132,315,87,295,102,253,132,315,102,253,124,285,32,69,41,49,52,261,52,261,41,49,54,32,52,261,54,32,87,295,87,295,54,32,68,18,87,295,68,18,84,152,84,152,68,18,83,7,29,211,20,146,22,118,29,211,22,118,25,92,29,211,25,92,32,69,29,211,32,69,52,261,114,-4,130,-6,115,21,115,21,130,-6,140,13,158,16,140,13,153,-3,158,16,153,-3,173,4,99,43,98,0,114,-4,99,43,114,-4,115,21,244,71,238,102,245,17,245,17,238,102,237,102,237,102,238,102,243,222,243,222,238,102,242, -119,243,222,242,119,245,133,248,203,243,222,245,133,248,203,245,133,248,147,248,203,248,147,249,162,248,203,249,162,250,177,219,245,219,60,228,242,228,242,219,60,230,36,228,242,230,36,236,235,236,235,230,36,237,102,236,235,237,102,243,222,244,71,245,17,253,46,253,46,245,17,262,4,253,46,262,4,266,28,266,28,262,4,282,-3,266,28,282,-3,280,16,280,16,282,-3,295,13,321,20,295,13,305,-6,321,20,305,-6,322,-4,395,49,404,69,408,213,408,213,404,69,411,92,408,213,411,92,416,148,416,148,411,92,415,118,386,262,351,296,353,145,386,262,353,145,354,7,386,262,354,7,369,18,386,262,369,18,383,32,386,262,383,32,395,49,386,262,395,49,408,213,337,250,349,204,351,296,351,296,349,204,353,145,354,7,353,145,352,107,337,250,351,296,316,284,316,284,351,296,305,316,316,284,305,316,288,305,288,305,305,316,252,322,288,305,252,322,252,312,321,20,322,-4,338,41,338,41,322,-4,339,0,338,41,339,0,348,71,348,71,339,0,354,7,348,71,354,7,352,107,295,13,282,-3,305,-6,195,118,199,102,200,235,200,235,199,102,206,36,200,235,206,36,209,242,209,242,206,36,219,60,209,242,219,60,219,245,206,36,199,102,193,71,206,36,193,71,190,17,190,17,193,71,184,46,190,17,184,46,173,4,173,4,184,46,172,27,173,4,172,27,158,16,193,222,188,202,189,145,193,222,189,145,191,131,193,222,191,131,195,118,193,222,195,118,200,235,188,202,187,176,187,159,188,202,187,159,189,145,140,13,130,-6,153,-3,237,102,230,36,245,17,152,401,153,390,153,412,153,412,153,390,158,380,153,412,158,380,158,421,158,421,158,380,165,373,158,421,165,373,166,429,166,429,165,373,174,368,166,429,174,368,175,433,175,433,174,368,185,366,175,433,185,366,186,435,186,435,185,366,197,368,186,435,197,368,197,433,197,433,197,368,207,373,197,433,207,373,207,428,207,428,207,373,214,380,207,428,214,380,214,421,214,421,214,380,219,390,214,421,219,390,219,412,219,412,219,390,221,401,13,401,14,390,14,412,14,412,14,390,19,380,14,412,19,380,19,421,19,421,19,380,26,373,19,421,26,373,27,429,27,429,26,373,35,368,27, -429,35,368,36,433,36,433,35,368,46,366,36,433,46,366,47,435,47,435,46,366,57,368,47,435,57,368,58,433,58,433,57,368,67,373,58,433,67,373,67,428,67,428,67,373,75,380,67,428,75,380,75,421,75,421,75,380,80,390,75,421,80,390,80,412,80,412,80,390,82,401,80,264,96,306,75,270,75,270,96,306,74,299,75,270,74,299,69,274,69,274,74,299,60,275,56,275,60,275,74,299,56,275,74,299,52,292,96,6,108,-3,117,314,117,314,108,-3,124,-6,117,314,124,-6,139,322,139,322,124,-6,142,55,139,322,142,55,142,320,144,47,145,-1,147,43,147,43,145,-1,163,10,147,43,163,10,151,40,151,40,163,10,156,39,165,40,156,39,163,10,165,40,163,10,179,28,204,70,193,75,193,49,193,49,193,75,185,60,193,49,185,60,179,28,179,28,185,60,178,50,179,28,178,50,171,43,145,-1,144,47,143,51,145,-1,143,51,142,55,145,-1,142,55,124,-6,96,306,80,264,83,254,96,306,83,254,84,241,96,306,84,241,85,37,96,306,85,37,89,20,96,306,89,20,96,6,96,306,96,6,117,314,84,241,84,55,85,37,52,292,30,285,38,274,52,292,38,274,45,274,52,292,45,274,51,275,52,292,51,275,56,275,38,274,30,285,30,273,165,40,179,28,171,43,127,122,127,270,126,287,127,122,126,287,120,301,127,122,120,301,111,311,127,122,111,311,129,95,198,322,178,322,194,305,198,322,194,305,209,300,198,322,209,300,243,315,280,105,271,69,285,25,285,25,271,69,254,39,285,25,254,39,243,1,243,1,254,39,231,20,243,1,231,20,198,13,198,13,169,20,195,-6,195,-6,169,20,149,40,195,-6,149,40,142,1,142,1,149,40,136,66,142,1,136,66,129,95,106,21,142,1,129,95,106,21,129,95,111,311,106,21,111,311,99,317,106,21,99,317,84,319,106,21,84,319,84,53,84,319,66,314,67,251,84,319,67,251,68,238,84,319,68,238,69,223,84,319,69,223,72,93,84,319,72,93,84,53,69,223,69,138,72,93,26,246,32,255,36,285,36,285,32,255,39,264,36,285,39,264,50,302,50,302,39,264,46,270,50,302,46,270,55,272,55,272,61,269,66,314,66,314,61,269,65,262,66,314,65, -262,67,251,66,314,50,302,55,272,209,300,223,292,243,315,243,315,223,292,236,281,243,315,236,281,248,267,248,267,261,246,283,296,283,296,261,246,271,222,283,296,271,222,278,197,283,296,283,146,285,25,283,296,285,25,316,263,316,263,285,25,317,60,316,263,317,60,338,217,338,217,317,60,339,106,338,217,339,106,346,158,283,296,278,197,282,171,283,296,282,171,283,146,283,296,243,315,248,267,198,13,195,-6,243,1,213,401,215,390,215,412,215,412,215,390,220,380,215,412,220,380,220,421,220,421,220,380,227,373,220,421,227,373,227,429,227,429,227,373,236,368,227,429,236,368,237,433,237,433,236,368,247,366,237,433,247,366,248,435,248,435,247,366,258,368,248,435,258,368,259,433,259,433,258,368,268,373,259,433,268,373,268,428,268,428,268,373,276,380,268,428,276,380,276,421,276,421,276,380,281,390,276,421,281,390,281,412,281,412,281,390,283,401,74,401,76,390,76,412,76,412,76,390,81,380,76,412,81,380,81,421,81,421,81,380,88,373,81,421,88,373,88,429,88,429,88,373,97,368,88,429,97,368,98,433,98,433,97,368,108,366,98,433,108,366,109,435,109,435,108,366,119,368,109,435,119,368,119,433,119,433,119,368,129,373,119,433,129,373,129,428,129,428,129,373,137,380,129,428,137,380,137,421,137,421,137,380,142,390,137,421,142,390,142,412,142,412,142,390,144,401,23,264,11,241,21,238,23,264,21,238,26,246,23,264,26,246,36,285,280,105,285,25,283,146,194,305,178,322,178,308,135,290,167,299,167,299,181,322,167,299,207,288,181,322,207,288,233,314,233,314,207,288,235,258,233,314,235,258,275,291,275,291,235,258,255,218,275,291,255,218,265,174,202,463,204,412,207,463,207,463,204,412,210,419,207,463,210,419,213,460,213,460,210,419,215,426,213,460,215,426,218,456,218,456,215,426,219,432,218,456,219,432,221,450,221,450,219,432,222,438,221,450,222,438,223,443,204,412,202,463,194,463,204,412,194,463,187,461,204,412,187,461,182,458,204,412,182,458,178,453,204,412,178,453,175,448,204,412,175,448,158,355,266,104,257,72,267,28,267,28,257,72,241,44,267,28,241,44,225,2,225,2,241,44,218,23,225,2,218,23,188, -16,188,16,150,26,177,-6,177,-6,150,26,129,0,150,26,121,53,129,0,129,0,121,53,102,91,129,0,102,91,87,21,87,21,102,91,90,132,87,21,90,132,87,171,113,268,128,312,97,237,97,237,128,312,84,284,97,237,84,284,89,203,89,203,84,284,87,171,87,21,87,171,84,284,87,21,84,284,54,53,54,53,84,284,52,243,54,53,52,243,32,94,32,94,52,243,31,194,32,94,31,194,24,141,331,159,325,211,323,111,323,111,325,211,306,256,323,111,306,256,301,66,301,66,306,256,275,291,301,66,275,291,269,134,269,134,267,28,301,66,188,16,177,-6,225,2,135,290,167,299,181,322,135,290,181,322,128,312,135,290,128,312,113,268,266,104,267,28,269,134,275,291,265,174,269,134,158,355,175,448,134,355,26,246,32,255,36,285,36,285,32,255,39,264,36,285,39,264,50,302,50,302,39,264,46,270,50,302,46,270,55,272,55,272,61,269,66,314,66,314,61,269,65,262,66,314,65,262,67,251,23,264,11,241,21,238,23,264,21,238,26,246,23,264,26,246,36,285,69,138,72,93,69,223,68,238,69,223,84,319,68,238,84,319,67,251,67,251,84,319,66,314,127,122,127,270,126,287,127,122,126,287,120,301,127,122,120,301,111,311,127,122,111,311,129,95,198,322,178,322,194,305,198,322,194,305,209,300,198,322,209,300,243,315,280,105,271,69,285,25,285,25,271,69,254,39,285,25,254,39,243,1,243,1,254,39,231,20,243,1,231,20,198,13,198,13,169,20,195,-6,195,-6,169,20,149,40,195,-6,149,40,142,1,142,1,149,40,136,66,142,1,136,66,129,95,106,21,142,1,129,95,106,21,129,95,111,311,106,21,111,311,99,317,106,21,99,317,84,319,106,21,84,319,84,53,84,319,69,223,72,93,84,319,72,93,84,53,66,314,50,302,55,272,209,300,223,292,243,315,243,315,223,292,236,281,243,315,236,281,248,267,248,267,261,246,283,296,283,296,261,246,271,222,283,296,271,222,278,197,283,296,283,146,285,25,283,296,285,25,316,263,316,263,285,25,317,60,316,263,317,60,338,217,338,217,317,60,339,106,338,217,339,106,346,158,283,296,278,197,282,171,283,296,282,171,283,146,283,296,243,315,248,267,198, -13,195,-6,243,1,202,463,205,412,208,463,208,463,205,412,211,419,208,463,211,419,214,460,214,460,211,419,216,426,214,460,216,426,219,456,219,456,216,426,220,432,219,456,220,432,222,450,222,450,220,432,223,438,222,450,223,438,223,443,205,412,202,463,194,463,205,412,194,463,188,461,205,412,188,461,183,458,205,412,183,458,179,453,205,412,179,453,176,448,205,412,176,448,158,355,158,355,176,448,134,355,280,105,285,25,283,146,194,305,178,322,178,308,241,463,243,412,246,463,246,463,243,412,249,419,246,463,249,419,252,460,252,460,249,419,254,426,252,460,254,426,257,456,257,456,254,426,258,432,257,456,258,432,260,450,260,450,258,432,261,438,260,450,261,438,262,443,243,412,241,463,233,463,243,412,233,463,226,461,243,412,226,461,221,458,243,412,221,458,217,453,243,412,217,453,214,448,243,412,214,448,197,355,99,43,89,75,98,0,98,0,89,75,85,113,98,0,85,113,83,7,83,7,85,113,84,152,87,295,84,152,88,208,87,295,88,208,102,253,151,305,184,312,184,322,151,305,184,322,132,315,151,305,132,315,124,285,132,315,87,295,102,253,132,315,102,253,124,285,32,69,41,49,52,261,52,261,41,49,54,32,52,261,54,32,87,295,87,295,54,32,68,18,87,295,68,18,84,152,84,152,68,18,83,7,29,211,20,146,22,118,29,211,22,118,25,92,29,211,25,92,32,69,29,211,32,69,52,261,114,-4,130,-6,115,21,115,21,130,-6,140,13,158,16,140,13,153,-3,158,16,153,-3,173,4,99,43,98,0,114,-4,99,43,114,-4,115,21,244,71,238,102,245,17,245,17,238,102,237,102,237,102,238,102,243,222,243,222,238,102,242,119,243,222,242,119,245,133,248,203,243,222,245,133,248,203,245,133,248,147,248,203,248,147,249,162,248,203,249,162,250,177,219,245,219,60,228,242,228,242,219,60,230,36,228,242,230,36,236,235,236,235,230,36,237,102,236,235,237,102,243,222,244,71,245,17,253,46,253,46,245,17,262,4,253,46,262,4,266,28,266,28,262,4,282,-3,266,28,282,-3,280,16,280,16,282,-3,295,13,321,20,295,13,305,-6,321,20,305,-6,322,-4,395,49,404,69,408,213,408,213,404,69,411,92,408,213,411, -92,416,148,416,148,411,92,415,118,386,262,351,296,353,145,386,262,353,145,354,7,386,262,354,7,369,18,386,262,369,18,383,32,386,262,383,32,395,49,386,262,395,49,408,213,337,250,349,204,351,296,351,296,349,204,353,145,354,7,353,145,352,107,337,250,351,296,316,284,316,284,351,296,305,316,316,284,305,316,288,305,288,305,305,316,252,322,288,305,252,322,252,312,321,20,322,-4,338,41,338,41,322,-4,339,0,338,41,339,0,348,71,348,71,339,0,354,7,348,71,354,7,352,107,295,13,282,-3,305,-6,195,118,199,102,200,235,200,235,199,102,206,36,200,235,206,36,209,242,209,242,206,36,219,60,209,242,219,60,219,245,206,36,199,102,193,71,206,36,193,71,190,17,190,17,193,71,184,46,190,17,184,46,173,4,173,4,184,46,172,27,173,4,172,27,158,16,193,222,188,202,189,145,193,222,189,145,191,131,193,222,191,131,195,118,193,222,195,118,200,235,188,202,187,176,187,159,188,202,187,159,189,145,140,13,130,-6,153,-3,237,102,230,36,245,17,197,355,214,448,173,355,54,209,63,245,68,357,68,357,63,245,76,280,68,357,76,280,98,410,98,410,76,280,92,314,98,410,92,314,111,346,111,346,120,345,116,355,116,355,120,345,140,355,40,237,41,127,49,298,49,298,41,127,51,172,49,298,51,172,68,357,68,357,51,172,54,209,140,355,148,344,152,355,152,355,148,344,157,344,152,355,157,344,165,357,165,357,157,344,191,346,165,357,191,346,177,360,177,360,191,346,189,363,140,355,120,345,129,345,140,355,129,345,138,344,140,355,138,344,148,344,257,432,246,413,257,370,257,370,246,413,231,394,257,370,231,394,226,354,226,354,231,394,215,378,226,354,215,378,201,368,201,368,189,363,191,346,238,472,235,484,212,485,238,472,212,485,206,464,238,472,206,464,237,472,238,472,256,478,235,484,212,485,198,483,206,464,206,464,198,483,183,478,206,464,183,478,178,443,178,443,183,478,167,471,178,443,167,471,153,463,116,355,132,383,141,455,141,455,132,383,153,415,141,455,153,415,153,463,153,463,153,415,178,443,141,455,98,410,111,346,141,455,111,346,116,355,245,471,251,467,256,478,256,478,251,467,257,462,256,478,257,462,272, -468,272,468,257,462,260,455,272,468,260,455,262,448,262,448,257,432,279,393,279,393,257,432,257,370,238,472,237,472,245,471,238,472,245,471,256,478,279,393,287,427,283,451,279,393,283,451,272,468,279,393,272,468,262,448,201,368,191,346,226,354,108,5,155,-6,109,20,109,20,155,-6,127,16,161,30,127,16,155,-6,161,30,155,-6,198,1,216,262,201,245,217,242,216,262,217,242,243,240,243,240,217,242,231,234,243,240,231,234,241,222,80,76,88,112,91,227,91,227,88,112,107,156,91,227,107,156,116,249,116,249,107,156,135,199,116,249,135,199,146,264,146,264,135,199,168,232,146,264,168,232,180,270,180,270,168,232,201,245,180,270,201,245,216,262,109,20,96,29,108,5,108,5,96,29,87,43,108,5,87,43,74,35,74,35,87,43,82,59,74,35,82,59,80,76,80,76,91,227,74,35,74,35,91,227,69,201,74,35,69,201,52,78,52,78,69,201,51,172,52,78,51,172,41,127,279,140,275,175,273,98,273,98,275,175,263,210,273,98,263,210,258,58,258,58,263,210,250,191,258,58,250,191,243,153,258,58,243,153,232,24,232,24,243,153,223,108,232,24,223,108,198,1,198,1,223,108,194,63,198,1,194,63,161,30,248,207,250,191,263,210,248,207,263,210,243,240,248,207,243,240,241,222,41,127,40,237,38,174,28,172,35,180,44,212,44,212,35,180,41,183,44,212,41,183,47,184,47,184,51,183,60,221,60,221,51,183,55,180,60,221,55,180,58,173,0,147,10,141,13,174,13,174,10,141,20,160,13,174,20,160,28,196,28,196,20,160,28,172,28,196,28,172,44,212,61,145,65,86,77,224,77,224,65,86,77,48,77,224,77,48,94,222,94,222,77,48,100,19,94,222,100,19,106,216,106,216,100,19,121,93,106,216,121,93,120,118,120,118,120,154,118,183,120,118,118,183,114,203,120,118,114,203,106,216,169,478,167,452,188,448,169,478,188,448,202,474,202,474,188,448,209,434,202,474,209,434,228,461,228,461,209,434,227,404,228,461,227,404,242,354,252,78,240,45,241,5,241,5,240,45,220,21,241,5,220,21,191,13,191,13,161,20,187,-6,187,-6,161,20,141,39,187,-6,141,39,136,0,136,0,141,39,128,65,136, -0,128,65,121,93,60,162,61,145,77,224,60,162,77,224,60,221,60,162,60,221,58,173,60,221,44,212,47,184,380,192,380,203,370,191,370,191,380,203,369,204,370,191,369,204,358,189,358,189,369,204,357,205,358,189,357,205,346,188,346,188,357,205,345,206,346,188,345,206,333,188,333,188,345,206,333,207,333,188,333,207,323,209,323,209,320,246,322,188,322,188,320,246,317,133,320,246,316,284,317,133,317,133,316,284,308,322,317,133,308,322,304,81,304,81,308,322,297,359,304,81,297,359,282,394,304,81,282,394,280,36,280,36,282,394,267,420,280,36,267,420,260,162,260,162,258,119,280,36,280,36,258,119,252,78,280,36,252,78,241,5,191,13,187,-6,241,5,333,188,323,209,322,188,128,430,139,442,140,474,140,474,139,442,152,450,140,474,152,450,169,478,169,478,152,450,167,452,112,463,118,391,121,413,112,463,121,413,140,474,140,474,121,413,128,430,267,420,250,443,253,280,267,420,253,280,253,277,267,420,253,277,254,270,267,420,254,270,256,258,267,420,256,258,257,243,267,420,257,243,259,226,267,420,259,226,259,192,267,420,259,192,260,186,267,420,260,186,260,180,267,420,260,180,260,174,267,420,260,174,260,168,267,420,260,168,260,162,259,226,198,255,199,208,259,226,199,208,259,192,157,291,133,328,146,235,157,291,146,235,199,208,157,291,199,208,198,255,121,363,118,391,103,271,121,363,103,271,146,235,121,363,146,235,133,328,118,391,112,463,103,271,103,271,112,463,88,442,103,271,88,442,74,316,74,316,88,442,71,411,74,316,71,411,64,370,242,354,253,280,250,443,242,354,250,443,228,461,65,86,61,145,61,130,121,93,100,19,136,0,26,424,35,427,36,447,36,447,35,427,46,431,36,447,46,431,54,457,54,457,46,431,57,434,54,457,57,434,74,465,74,465,57,434,68,436,74,465,68,436,77,437,77,437,118,429,94,470,94,470,118,429,114,472,94,470,74,465,77,437,279,291,277,291,292,77,279,291,292,77,290,339,290,339,292,77,292,176,290,339,292,176,296,234,423,454,424,473,419,454,419,454,424,473,415,455,366,433,415,455,375,462,366,433,375,462,337,431,296,234,308,307,309,388,309,388,308,307,331,379,309,388,331, -379,337,431,337,431,331,379,366,433,292,77,277,291,294,50,428,452,431,450,443,470,443,470,431,450,432,446,445,360,432,446,432,362,432,362,432,446,429,441,432,362,429,441,422,434,424,473,423,454,428,452,424,473,428,452,443,470,424,473,375,462,415,455,445,360,460,363,461,462,461,462,460,363,473,371,461,462,473,371,475,449,475,449,473,371,481,383,475,449,481,383,485,432,485,432,481,383,487,397,485,432,487,397,488,413,443,470,432,446,445,360,443,470,445,360,461,462,405,399,407,386,408,414,408,414,407,386,412,376,408,414,412,376,414,425,414,425,412,376,421,367,414,425,421,367,422,434,422,434,421,367,432,362,364,0,364,13,334,16,364,0,334,16,313,22,364,0,313,22,219,55,364,0,219,55,214,34,364,0,214,34,202,23,364,0,202,23,181,16,364,0,181,16,150,13,364,0,150,13,150,0,182,360,204,295,204,444,204,444,204,295,220,206,237,408,220,206,294,50,237,408,294,50,261,357,261,357,294,50,277,291,219,55,313,22,220,86,220,86,313,22,301,32,220,86,301,32,220,206,220,206,301,32,294,50,163,465,114,472,118,429,163,465,118,429,153,404,163,465,153,404,182,360,163,465,182,360,204,444,204,444,220,206,237,408,290,339,296,234,309,388,26,424,36,447,20,435,415,162,411,200,409,114,409,114,411,200,400,235,409,114,400,235,392,68,392,68,400,235,381,266,392,68,381,266,360,29,360,29,381,266,355,292,360,29,355,292,352,143,309,315,315,270,323,311,323,311,315,270,336,235,323,311,336,235,355,292,355,292,336,235,348,191,355,292,348,191,352,143,295,319,280,321,285,294,295,319,285,294,315,270,295,319,315,270,309,315,280,321,264,322,285,294,285,294,264,322,247,322,285,294,247,322,246,302,246,302,247,322,247,478,246,302,247,478,189,302,189,302,247,478,188,478,189,302,188,478,188,322,360,29,352,143,349,102,360,29,349,102,340,67,360,29,340,67,323,38,360,29,323,38,313,3,323,38,300,19,313,3,313,3,300,19,268,13,313,3,268,13,247,-6,247,-6,268,13,246,13,247,-6,246,13,247,-151,247,-151,246,13,189,302,247,-151,189,302,189,13,188,-6,188,-151,247,-151,188,-6,247,-151,189,13,188,-6,189,13,174, -14,188,-6,174,14,172,-6,97,98,119,2,107,71,107,71,119,2,121,48,132,35,121,48,119,2,132,35,119,2,172,-6,115,283,120,313,98,260,98,260,120,313,77,289,98,260,77,289,87,229,87,229,77,289,84,192,85,159,84,192,77,28,85,159,77,28,89,127,89,127,77,28,119,2,89,127,119,2,97,98,172,-6,174,14,160,18,172,-6,160,18,145,25,172,-6,145,25,132,35,177,322,120,313,138,297,177,322,138,297,168,302,177,322,168,302,189,302,177,322,189,302,188,322,77,28,84,192,77,289,77,28,77,289,46,65,46,65,77,289,45,253,46,65,45,253,27,111,27,111,45,253,27,208,27,111,27,208,20,159,120,313,115,283,138,297,246,302,189,302,246,13,15,192,25,212,26,257,26,257,25,212,37,230,26,257,37,230,46,286,46,286,37,230,51,244,46,286,51,244,74,307,74,307,51,244,67,253,74,307,67,253,86,256,108,315,86,256,117,256,108,315,117,256,508,315,508,315,117,256,175,256,508,315,175,256,391,256,11,224,4,192,15,192,11,224,15,192,26,257,152,191,157,215,117,256,117,256,157,215,165,237,117,256,165,237,175,256,152,73,157,0,161,42,161,42,157,0,188,-6,161,42,188,-6,176,21,176,21,188,-6,200,13,218,16,200,13,215,-3,218,16,215,-3,237,4,147,139,129,17,148,106,148,106,129,17,157,0,148,106,157,0,152,73,307,72,301,103,309,16,304,208,301,103,305,114,304,208,305,114,309,193,309,193,305,114,308,127,309,193,308,127,311,139,312,177,309,193,311,139,312,177,311,139,313,150,312,177,313,150,313,161,263,103,270,36,270,219,270,219,270,36,282,60,270,219,282,60,283,223,283,223,282,60,294,35,283,223,294,35,295,219,295,219,294,35,301,103,295,219,301,103,304,208,307,72,309,16,317,46,317,46,309,16,327,3,317,46,327,3,330,28,330,28,327,3,346,-4,330,28,346,-4,345,16,345,16,346,-4,361,13,385,20,361,13,366,-6,385,20,366,-6,401,0,508,315,391,256,400,239,508,315,400,239,407,217,508,315,407,217,448,256,508,315,448,256,508,256,476,190,470,214,474,89,474,89,470,214,461,237,474,89,461,237,458,47,458,47,461,237,448,256,458,47,448,256,432,17,432, -17,448,256,417,145,407,217,413,193,448,256,448,256,413,193,416,168,448,256,416,168,417,145,148,166,152,191,117,256,148,166,117,256,129,17,148,166,129,17,147,139,476,190,474,89,480,143,476,190,480,143,479,166,432,17,417,145,416,107,432,17,416,107,411,71,432,17,411,71,401,41,432,17,401,41,401,0,361,13,346,-4,366,-6,261,209,255,195,256,126,261,209,256,126,260,114,261,209,260,114,263,103,261,209,263,103,270,219,251,162,251,150,252,178,252,178,251,150,253,138,252,178,253,138,255,195,255,195,253,138,256,126,270,36,263,103,256,71,270,36,256,71,255,17,255,17,256,71,246,46,255,17,246,46,237,4,237,4,246,46,234,27,237,4,234,27,218,16,200,13,188,-6,215,-3,106,237,97,215,106,47,106,237,106,47,129,17,106,237,129,17,117,256,90,191,86,167,90,89,90,191,90,89,106,47,90,191,106,47,97,215,90,89,86,167,84,145,385,20,401,0,401,41,86,256,108,315,74,307,301,103,294,35,309,16,355,-151,355,-137,327,-135,355,-151,327,-135,307,-129,355,-151,307,-129,216,-96,355,-151,216,-96,211,-116,355,-151,211,-116,200,-128,355,-151,200,-128,181,-134,355,-151,181,-134,152,-137,355,-151,152,-137,152,-151,296,-118,290,-100,234,17,234,17,290,-100,253,16,274,17,253,16,290,-100,274,17,290,-100,288,-73,217,-6,296,-118,234,17,217,-6,234,17,216,20,217,-6,216,20,198,26,217,-6,198,26,182,35,217,-6,182,35,166,47,217,-6,166,47,152,11,217,-65,216,-96,307,-129,217,-65,307,-129,296,-118,217,-65,296,-118,217,-6,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,135,376,152,401,176,462,135,376,176,462,113,430,126,105,152,11,144,73,144,73,152,11,166,47,106,185,104,232,99,46,106,185,99,46,114,142,114,142,99,46,152,11,114,142,152,11,126,105,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,104,232,106,272,113,430,106,272,112,311,113,430,112,311,122,346,113,430,122,346,135,376,23,234,32,159,34,313,34,313,32,159,58,96,34,313,58,96,65,379,65,379,58,96,99,46,65,379,99,46,104,232,290,442,307, -436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,360,391,392,428,392,428,360,391,378,360,392,428,378,360,391,324,329,462,252,473,252,448,312,27,352,11,328,37,328,37,352,11,344,49,364,75,344,49,352,11,364,75,352,11,406,46,399,188,406,46,402,236,402,236,406,46,440,377,440,377,406,46,446,95,440,377,446,95,471,310,471,310,446,95,472,158,471,310,472,158,481,232,399,282,402,236,440,377,399,282,440,377,392,428,399,282,392,428,391,324,392,428,329,462,338,415,406,46,399,188,392,144,406,46,392,144,381,107,406,46,381,107,364,75,293,21,274,17,288,-6,293,21,288,-6,352,11,293,21,352,11,312,27,288,-6,274,17,288,-73,65,379,104,232,113,430,155,18,142,25,145,-3,145,-3,142,25,130,35,145,-3,130,35,120,48,120,48,107,72,145,-3,145,-3,107,72,104,10,104,10,107,72,96,98,104,10,96,98,89,128,104,10,89,128,85,159,104,10,85,159,70,34,70,34,85,159,84,191,84,191,87,230,82,293,82,293,87,230,98,260,82,293,98,260,125,314,125,314,98,260,115,283,125,314,115,283,138,297,20,159,26,110,28,214,28,214,26,110,43,68,28,214,43,68,49,259,49,259,43,68,70,34,49,259,70,34,82,293,82,293,70,34,84,191,227,315,178,322,182,301,182,301,178,322,165,302,138,297,165,302,178,322,138,297,178,322,125,314,252,62,235,35,246,10,246,10,235,35,212,18,246,10,212,18,204,-3,204,-3,212,18,184,13,204,-3,184,13,204,-151,204,-151,184,13,169,14,196,296,209,289,227,315,227,315,209,289,221,279,227,315,221,279,231,267,231,267,243,248,268,293,268,293,243,248,253,225,268,293,253,225,260,199,252,62,281,36,262,98,262,98,281,36,266,143,268,293,266,143,281,36,268,293,281,36,300,260,300,260,281,36,307,70,300,260,307,70,321,216,321,216,307,70,323,113,321,216,323,113,329,162,268,293,260,199,264,171,268,293,264,171,266,143,268,293,227,315,231,267,204,-151,169,14,155,18,204,-151,155,18,145,-3,204,-151,145,-3,145,-151,252,62,246,10,281,36,227,315,182,301,196,296,135,150,89,184,99,74,99,74,89,184,71,248,58,103,71,248,37,298,58,103,37,298,30, -148,30,148,37,298,20,214,174,-83,181,-121,191,-97,191,-97,181,-121,205,-135,191,-97,205,-135,210,-107,210,-107,205,-135,229,-144,210,-107,229,-144,230,-115,230,-115,229,-144,254,-150,230,-115,254,-150,252,-119,252,-119,254,-150,273,-121,289,-120,273,-121,277,-151,289,-120,277,-151,326,-146,71,248,83,308,84,370,84,370,83,308,114,359,84,370,114,359,151,425,151,425,114,359,160,398,151,425,160,398,229,461,229,461,160,398,217,424,229,461,217,424,280,433,280,433,318,427,308,473,308,473,318,427,343,472,84,370,37,298,71,248,374,-66,367,-80,369,-128,369,-128,367,-80,358,-91,369,-128,358,-91,347,-101,347,-101,334,-109,369,-128,369,-128,334,-109,326,-146,435,-12,431,21,427,-61,427,-61,431,21,419,50,427,-61,419,50,403,-100,403,-100,419,50,400,74,403,-100,400,74,380,-34,380,-34,400,74,374,93,380,-34,374,93,369,0,342,108,272,124,297,38,342,108,297,38,339,23,342,108,339,23,369,0,342,108,369,0,374,93,135,150,150,59,200,134,200,134,150,59,205,51,200,134,205,51,272,124,272,124,205,51,250,46,272,124,250,46,297,38,380,-34,379,-51,403,-100,374,-66,369,-128,403,-100,374,-66,403,-100,379,-51,326,-146,334,-109,320,-115,326,-146,320,-115,305,-118,326,-146,305,-118,289,-120,384,377,400,379,400,456,400,456,400,379,411,385,400,456,411,385,418,439,418,439,411,385,419,393,418,439,419,393,424,414,424,414,419,393,423,403,374,466,343,472,352,396,374,466,352,396,364,382,374,466,364,382,384,377,374,466,384,377,400,456,343,472,318,427,339,413,343,472,339,413,352,396,308,473,229,461,280,433,273,-121,254,-150,277,-151,181,-121,174,-83,159,-101,99,74,71,248,58,103,135,150,99,74,150,59,66,71,59,87,70,7,70,7,59,87,57,105,51,175,57,105,58,118,51,175,58,118,81,203,81,203,58,118,62,131,81,203,62,131,69,143,138,176,165,241,122,172,122,172,165,241,120,225,122,172,120,225,106,168,106,168,120,225,92,163,106,168,92,163,92,162,92,162,92,163,79,153,79,153,92,163,81,203,79,153,81,203,69,143,218,262,221,189,249,281,249,281,221,189,259,209,249,281,259,209,276,308,276,308,259,209,285,240,276,308,285,240,295,343,295,343,285,240,300,284,295, -343,300,284,305,343,138,176,155,178,165,241,165,241,155,178,172,180,165,241,172,180,188,249,188,249,172,180,221,189,188,249,221,189,218,262,248,42,219,53,221,-2,221,-2,219,53,200,0,192,0,200,0,219,53,192,0,219,53,180,57,66,71,70,7,77,58,77,58,70,7,99,-3,77,58,99,-3,92,49,92,49,99,-3,111,46,122,47,111,46,133,-6,122,47,133,-6,137,50,137,50,133,-6,147,-5,137,50,147,-5,153,53,153,53,147,-5,163,-4,153,53,163,-4,168,56,168,56,163,-4,179,-2,168,56,179,-2,180,57,180,57,179,-2,192,0,111,46,99,-3,133,-6,179,-91,185,-151,187,-97,187,-97,185,-151,211,-146,187,-97,211,-146,196,-102,196,-102,211,-146,206,-104,223,-101,206,-104,211,-146,223,-101,211,-146,238,-131,285,-41,281,-4,279,-77,279,-77,281,-4,269,22,279,-77,269,22,263,-47,263,-47,262,-107,279,-77,221,-2,238,-8,248,42,248,42,238,-8,252,-18,248,42,252,-18,269,22,269,22,252,-18,260,-31,269,22,260,-31,263,-47,262,-107,263,-47,260,-66,262,-107,260,-66,251,-82,262,-107,251,-82,238,-94,262,-107,238,-94,238,-131,153,-85,155,-145,164,-83,164,-83,155,-145,169,-150,164,-83,169,-150,172,-85,172,-85,169,-150,185,-151,172,-85,185,-151,179,-91,136,-103,137,-127,139,-95,139,-95,137,-127,144,-138,139,-95,144,-138,145,-89,145,-89,144,-138,155,-145,145,-89,155,-145,153,-85,120,225,81,203,92,163,46,26,70,7,57,105,46,26,57,105,51,175,46,26,51,175,31,139,46,26,31,139,30,55,30,55,31,139,24,95,137,-127,136,-103,134,-112,223,-101,238,-131,238,-94,53,440,64,429,379,463,379,463,64,429,155,436,379,463,155,436,165,437,379,463,165,437,257,437,379,463,257,437,300,435,70,386,142,51,141,78,141,258,141,229,314,229,141,258,314,229,314,258,379,463,300,435,328,429,379,463,328,429,346,416,379,463,346,416,358,395,379,463,358,395,365,363,379,463,365,363,382,363,70,386,141,78,141,409,70,386,141,409,141,421,70,386,141,421,143,428,70,386,143,428,148,433,70,386,148,433,68,412,155,436,64,429,68,412,155,436,68,412,148,433,36,447,53,440,379,463,36,447,379,463,9,463,36,447,9,463,9,450,205,0,205,13,177,16,205,0,177, -16,159,22,205,0,159,22,68,55,205,0,68,55,63,35,205,0,63,35,52,23,205,0,52,23,35,16,205,0,35,16,8,13,205,0,8,13,8,0,70,86,68,55,159,22,70,86,159,22,148,33,70,86,148,33,142,51,70,86,142,51,70,386,112,273,305,273,305,315,112,273,305,315,56,315,112,273,56,315,112,-132,112,91,112,63,270,63,112,91,270,63,270,91,112,-132,56,315,56,-132,177,558,157,556,162,519,162,519,157,556,152,521,140,520,152,521,157,556,140,520,157,556,139,550,104,507,116,514,120,540,120,540,116,514,128,518,120,540,128,518,139,550,139,550,128,518,140,520,101,526,80,508,89,497,101,526,89,497,104,507,101,526,104,507,120,540,474,380,466,389,391,293,391,293,466,389,93,255,391,293,93,255,18,159,18,159,93,255,165,445,168,451,165,445,198,396,168,451,198,396,171,459,171,459,198,396,175,470,178,487,198,396,203,554,203,554,198,396,218,425,203,554,218,425,222,545,222,545,218,425,232,448,222,545,232,448,236,531,236,531,232,448,241,467,236,531,241,467,244,514,244,514,241,467,245,483,244,514,245,483,246,497,177,496,178,487,203,554,177,496,203,554,177,558,177,496,177,558,175,505,177,558,162,519,170,513,177,558,170,513,175,505,177,479,175,470,198,396,177,479,198,396,178,487,165,445,93,255,198,396,239,65,241,34,244,81,244,81,241,34,249,17,244,81,249,17,252,100,252,100,249,17,262,3,252,100,262,3,266,123,266,123,262,3,282,-6,266,123,282,-6,287,152,287,152,282,-6,308,-9,287,152,308,-9,306,62,306,62,307,69,287,152,287,152,307,69,310,79,287,152,310,79,313,89,287,152,313,89,391,293,391,293,313,89,317,98,391,293,317,98,320,104,320,104,474,380,391,293,395,51,381,41,384,22,384,22,381,41,368,34,384,22,368,34,364,8,364,8,368,34,356,30,364,8,356,30,346,-1,346,-1,356,30,345,28,346,-1,345,28,333,27,333,27,322,29,327,-7,327,-7,322,29,314,35,327,-7,314,35,310,43,308,-9,327,-7,310,43,308,-9,310,43,307,52,308,-9,307,52,306,62,333,27,327,-7,346,-1,395,51,384,22,404,41,241,34,239,65,238,51,18,159,165,445,9,168,133,261,261,463,191, -463,133,261,191,463,45,202,133,261,45,202,230,202,133,261,230,202,319,261,230,202,102,0,172,0,230,202,172,0,319,261,145,225,176,225,145,420,145,420,145,459,121,412,121,412,145,459,97,439,121,412,97,439,97,402,97,402,97,439,73,389,52,410,8,370,28,355,52,410,28,355,50,373,52,410,50,373,73,389,52,410,73,389,97,439,182,428,189,429,195,470,195,470,189,429,195,429,195,470,195,429,248,473,248,473,195,429,202,430,248,473,202,430,208,430,208,430,253,425,248,473,248,473,253,425,334,459,413,418,407,318,421,292,421,292,436,260,477,351,477,351,436,260,448,226,477,351,448,226,457,190,299,140,324,209,335,284,335,284,324,209,364,264,335,284,364,264,407,318,407,318,364,264,421,292,279,224,241,149,281,0,279,224,281,0,285,67,279,224,285,67,299,140,279,224,299,140,335,284,218,71,210,0,281,0,218,71,281,0,241,149,457,190,463,152,477,351,477,351,463,152,465,112,490,-17,465,112,456,49,490,-17,456,49,438,-81,438,-81,456,49,432,-10,438,-81,432,-10,396,-63,477,351,413,418,421,292,521,259,477,351,490,-17,521,259,490,-17,524,60,521,259,524,60,537,145,372,-128,438,-81,396,-63,372,-128,396,-63,350,-104,372,-128,350,-104,297,-127,372,-128,297,-127,297,-151,253,425,298,410,334,459,334,459,298,410,339,387,334,459,339,387,413,418,413,418,339,387,376,356,413,418,376,356,407,318,145,420,176,225,145,459,145,459,176,225,176,427,145,459,176,427,195,470,195,470,176,427,182,428,465,112,490,-17,477,351,84,330,124,297,149,331,149,331,124,297,162,260,149,331,162,260,207,287,207,287,162,260,196,219,207,287,196,219,209,200,207,287,209,200,253,241,253,241,209,200,214,193,253,241,214,193,219,186,80,369,4,401,41,358,80,369,41,358,84,330,80,369,84,330,149,331,219,186,223,179,253,241,253,241,223,179,228,172,253,241,228,172,232,165,232,165,236,157,253,241,253,241,236,157,240,149,253,241,240,149,244,142,244,142,248,134,253,241,253,241,248,134,252,127,253,241,252,127,261,107,261,107,252,127,142,38,142,38,252,127,131,58,196,219,77,151,89,131,196,219,89,131,209,200,332,74,321,116,323,-151,323,-151,321,116,305,157,323, --151,305,157,305,-82,305,-82,304,-94,323,-151,323,-151,304,-94,304,-107,323,-151,304,-107,303,-120,305,157,286,196,290,29,305,157,290,29,298,-8,305,157,298,-8,303,-45,305,157,303,-45,305,-82,286,196,253,241,261,107,286,196,261,107,277,67,286,196,277,67,290,29,338,30,332,74,335,-95,338,30,335,-95,338,-68,338,30,338,-68,340,-41,338,30,340,-41,341,-15,332,74,323,-151,330,-123,332,74,330,-123,335,-95,302,-133,300,-146,323,-151,302,-133,323,-151,303,-120,41,358,4,401,-3,380,133,244,135,303,125,257,125,257,135,303,115,317,125,257,115,317,114,266,114,266,115,317,99,269,93,267,99,269,115,317,93,267,115,317,89,322,288,315,155,146,238,169,238,169,155,146,131,132,238,169,131,132,127,119,127,119,30,0,102,0,156,159,159,176,161,256,161,256,159,176,162,193,161,256,162,193,164,224,164,224,162,193,163,210,154,146,156,159,161,256,154,146,161,256,151,283,154,146,151,283,140,208,154,146,140,208,139,190,154,146,139,190,137,170,154,146,137,170,135,150,154,146,135,150,131,132,154,146,131,132,155,146,268,56,259,70,272,0,272,0,259,70,254,90,272,0,254,90,252,15,252,15,254,90,252,119,239,169,252,119,252,137,239,169,252,137,254,155,260,185,264,198,288,315,260,185,288,315,257,171,257,171,288,315,239,169,257,171,239,169,254,155,288,315,264,198,360,315,138,227,140,208,151,283,138,227,151,283,135,303,127,119,102,0,238,169,314,60,307,56,316,-5,316,-5,307,56,302,52,316,-5,302,52,299,-6,299,-6,302,52,298,48,299,-6,298,48,292,46,292,46,279,48,299,-6,299,-6,279,48,272,0,352,37,351,45,350,20,350,20,351,45,347,52,350,20,347,52,342,7,342,7,347,52,342,57,342,7,342,57,334,60,314,60,316,-5,326,62,326,62,316,-5,330,0,326,62,330,0,334,60,334,60,330,0,342,7,239,169,235,155,238,38,239,169,238,38,252,15,239,169,252,15,252,119,232,140,230,123,230,64,232,140,230,64,238,38,232,140,238,38,235,155,228,107,227,91,230,64,228,107,230,64,230,123,89,322,74,320,76,254,89,322,76,254,84,258,89,322,84,258,89,263,89,322,89,263,93,267,49,258,56,254,61,315,61,315,56, -254,64,252,61,315,64,252,74,320,74,320,64,252,76,254,38,277,40,270,41,294,41,294,40,270,44,263,41,294,44,263,49,306,49,306,44,263,49,258,49,306,49,258,61,315,135,303,133,244,138,227,268,56,272,0,279,48,288,315,238,169,239,169,40,-9,91,-71,62,55,62,55,91,-71,105,-11,105,-11,91,-71,154,-99,105,-11,154,-99,167,-42,167,-42,154,-99,216,-111,167,-42,216,-111,232,-56,232,-56,216,-111,264,-123,232,-56,264,-123,283,-76,283,-76,264,-123,287,-150,283,-76,287,-150,304,-121,304,-121,287,-150,298,-150,304,-121,298,-150,300,-144,77,34,96,16,84,191,84,191,88,232,71,276,71,276,88,232,99,263,71,276,99,263,117,309,117,309,99,263,117,285,117,309,117,285,181,322,181,322,117,285,140,298,181,322,140,298,168,302,168,302,197,294,181,322,181,322,197,294,232,314,186,13,149,-3,183,-6,186,13,183,-6,232,2,186,13,147,23,149,-3,120,3,149,-3,147,23,120,3,147,23,119,52,120,3,119,52,99,93,120,3,99,93,96,16,87,141,84,191,96,16,87,141,96,16,99,93,264,115,256,77,273,26,273,26,256,77,242,45,273,26,242,45,232,2,232,2,242,45,219,21,232,2,219,21,186,13,245,239,260,198,273,292,273,292,260,198,266,152,273,26,266,152,264,115,232,314,197,294,224,272,232,314,224,272,245,239,232,314,245,239,273,292,273,26,303,61,303,257,303,257,303,61,322,105,303,257,322,105,322,210,322,210,322,105,329,154,273,292,266,152,273,26,273,292,273,26,303,257,304,-121,300,-144,301,-137,304,-121,301,-137,303,-131,304,-121,303,-131,304,-125,22,69,25,41,25,176,25,176,25,41,31,14,25,176,31,14,41,229,41,229,31,14,40,-9,41,229,40,-9,62,55,25,176,20,124,21,97,25,176,21,97,22,69,62,55,63,56,71,276,71,276,63,56,77,34,71,276,77,34,84,191,71,276,41,229,62,55,208,440,252,473,188,431,188,431,252,473,176,462,188,431,176,462,169,418,169,418,176,462,152,401,136,379,152,401,176,462,136,379,176,462,113,430,290,442,329,462,271,446,271,446,329,462,252,448,230,446,252,448,252,473,230,446,252,473,208,440,113,430,65,379,65,85,113,430,65,85,104,252,113,430,104,252,107, -287,113,430,107,287,114,321,113,430,114,321,124,352,113,430,124,352,136,379,107,176,104,220,113,34,113,34,104,220,65,85,65,85,104,220,104,252,104,252,104,220,401,252,401,252,104,220,402,220,401,252,402,220,440,377,34,152,65,85,65,379,34,152,65,379,34,313,34,152,34,313,23,234,312,27,293,21,328,1,328,1,293,21,274,17,328,1,274,17,253,16,253,16,234,17,252,-9,252,-9,234,17,216,20,252,-9,216,20,198,26,166,47,177,1,182,35,182,35,177,1,252,-9,182,35,252,-9,198,26,391,137,379,102,391,33,391,33,379,102,363,73,391,33,363,73,344,49,344,49,328,37,391,33,391,33,328,37,328,1,481,232,471,310,470,151,470,151,471,310,440,377,470,151,440,377,439,84,439,84,440,377,402,220,439,84,402,220,398,176,375,365,388,331,392,428,392,428,388,331,397,293,392,428,397,293,440,377,440,377,397,293,401,252,290,442,307,436,329,462,329,462,307,436,323,426,329,462,323,426,338,415,338,415,359,393,392,428,392,428,359,393,375,365,392,428,329,462,338,415,398,176,391,137,391,33,398,176,391,33,439,84,253,16,252,-9,328,1,329,462,252,473,252,448,115,137,113,34,127,102,127,102,113,34,177,1,127,102,177,1,144,72,144,72,177,1,166,47,107,176,113,34,115,137,312,27,328,1,328,37,217,156,217,178,80,156,80,156,80,178,74,287,74,287,80,178,85,212,74,287,85,212,115,313,115,313,85,212,97,245,115,313,97,245,115,274,96,79,109,2,114,49,114,49,109,2,157,-6,114,49,157,-6,140,29,140,29,157,-6,172,22,195,24,172,22,190,-2,195,24,190,-2,220,7,84,115,80,156,70,26,84,115,70,26,109,2,84,115,109,2,96,79,17,152,23,104,24,203,24,203,23,104,41,61,24,203,41,61,43,249,43,249,41,61,70,26,43,249,70,26,74,287,74,287,70,26,80,156,222,285,237,268,223,309,223,309,237,268,234,308,239,309,234,308,237,268,239,309,237,268,248,248,258,322,246,322,248,248,258,322,248,248,256,227,258,322,256,227,267,227,248,248,246,322,245,318,248,248,245,318,244,314,248,248,244,314,242,311,248,248,242,311,239,309,186,320,167,302,199,297,186,320,199,297,201,317,201, -317,199,297,222,285,201,317,222,285,213,313,213,313,222,285,223,309,285,73,274,79,268,46,268,46,274,79,256,57,268,46,256,57,246,24,246,24,256,57,237,41,246,24,237,41,220,7,220,7,237,41,217,30,220,7,217,30,195,24,172,22,157,-6,190,-2,166,322,115,313,115,274,166,322,115,274,139,294,166,322,139,294,167,302,166,322,167,302,186,320,80,178,80,156,217,178,63,1,65,4,70,47,70,47,65,4,68,6,70,47,68,6,73,7,73,7,84,6,86,30,86,30,84,6,94,2,86,30,94,2,108,18,108,18,94,2,106,-1,108,18,106,-1,121,-5,40,88,50,-6,51,88,51,88,50,-6,61,-6,51,88,61,-6,59,67,59,67,61,-6,62,-2,59,67,62,-2,70,47,70,47,62,-2,63,1,23,241,33,236,40,269,40,269,33,236,51,257,40,269,51,257,61,291,61,291,51,257,70,274,61,291,70,274,87,308,87,308,70,274,90,285,87,308,90,285,117,318,117,318,90,285,112,291,117,318,112,291,135,293,135,293,167,286,151,322,151,322,167,286,198,313,290,163,284,211,283,112,283,112,284,211,266,254,283,112,266,254,264,66,264,66,266,254,237,289,264,66,237,289,233,28,233,28,237,289,227,159,227,137,227,159,91,159,227,137,91,159,91,137,237,289,198,313,211,236,237,289,211,236,223,200,237,289,223,200,227,159,198,313,167,286,193,266,198,313,193,266,211,236,233,28,227,159,227,137,233,28,227,137,222,103,233,28,222,103,210,70,233,28,210,70,192,41,233,28,192,41,192,2,140,13,141,-6,168,21,168,21,141,-6,192,2,168,21,192,2,192,41,151,322,117,318,135,293,140,13,108,18,121,-5,140,13,121,-5,141,-6,86,30,70,47,73,7,111,89,109,93,121,36,121,36,109,93,106,97,121,36,106,97,104,102,120,428,118,391,121,36,120,428,121,36,149,408,149,408,121,36,149,56,185,2,149,56,121,36,120,428,72,377,73,300,120,428,73,300,84,331,120,428,84,331,100,362,120,428,100,362,118,391,78,151,69,177,73,89,73,89,69,177,64,204,73,89,64,204,42,155,42,155,64,204,63,232,72,377,63,232,65,267,72,377,65,267,73,300,42,155,63,232,72,377,42,155,72,377,42,310,42,155,42, -310,31,232,464,90,442,111,430,54,430,54,442,111,411,80,430,54,411,80,394,26,394,26,411,80,380,55,394,26,380,55,354,6,354,6,380,55,347,37,354,6,347,37,310,-5,310,-5,347,37,310,25,310,-5,310,25,265,21,265,21,243,23,262,-9,262,-9,243,23,217,27,262,-9,217,27,192,35,185,2,262,-9,192,35,185,2,192,35,168,44,185,2,168,44,149,56,193,429,217,436,263,473,263,473,217,436,242,441,263,473,242,441,266,442,266,442,310,438,311,469,311,469,310,438,347,427,311,469,347,427,354,457,354,457,347,427,380,408,354,457,380,408,393,437,393,437,380,408,410,383,393,437,410,383,429,409,429,409,410,383,441,352,429,409,441,352,463,373,184,462,120,428,149,408,184,462,149,408,170,420,184,462,170,420,193,429,184,462,193,429,263,473,121,36,118,391,118,83,121,36,118,83,114,86,121,36,114,86,111,89,121,36,104,102,89,126,121,36,89,126,78,151,121,36,78,151,73,89,311,469,263,473,266,442,265,21,262,-9,310,-5,372,93,367,14,378,71,378,71,367,14,399,-3,378,71,399,-3,386,51,386,51,399,-3,396,32,404,23,396,32,399,-3,404,23,399,-3,435,-9,478,237,441,242,443,225,443,225,441,242,430,227,409,223,430,227,441,242,409,223,441,242,400,236,505,71,497,43,509,14,509,14,497,43,484,23,509,14,484,23,476,-3,476,-3,484,23,466,10,476,-3,466,10,445,5,445,5,433,7,435,-9,435,-9,433,7,423,10,435,-9,423,10,413,15,454,222,464,216,478,237,478,237,464,216,473,209,478,237,473,209,481,200,481,200,490,185,510,220,510,220,490,185,498,168,510,220,498,168,503,148,551,160,534,195,535,41,551,160,535,41,551,77,551,160,551,77,556,119,505,71,509,14,508,105,508,105,509,14,510,220,510,220,509,14,535,41,510,220,535,41,534,195,510,220,503,148,507,127,510,220,507,127,508,105,510,220,478,237,481,200,445,5,435,-9,476,-3,367,14,369,117,368,142,368,142,371,172,367,220,367,220,371,172,379,195,367,220,379,195,400,236,400,236,379,195,392,212,400,236,392,212,409,223,367,14,368,142,367,220,367,14,367,220,342,41,342,41,367,220,341,194,342,41,341,194,325,76,325,76,341,194,325, -159,325,76,325,159,320,118,420,473,103,-9,138,-9,420,473,138,-9,452,473,107,279,90,301,102,227,102,227,90,301,79,330,102,227,79,330,74,243,74,243,79,330,75,365,78,445,75,365,78,396,78,445,78,396,92,455,92,455,78,396,88,421,92,455,88,421,104,441,158,259,136,221,149,222,158,259,149,222,162,225,158,259,130,264,136,221,107,279,102,227,136,221,107,279,136,221,130,264,166,454,171,449,177,471,177,471,171,449,176,442,177,471,176,442,180,432,200,462,180,432,184,420,200,462,184,420,187,412,151,473,148,457,158,456,151,473,158,456,177,471,177,471,158,456,166,454,229,435,217,450,223,400,229,435,223,400,229,405,229,435,229,405,232,411,229,435,232,411,234,418,217,450,200,462,202,396,217,450,202,396,209,395,217,450,209,395,217,396,217,450,217,396,223,400,200,462,187,412,191,405,200,462,191,405,196,400,200,462,196,400,202,396,207,252,215,261,219,290,219,290,215,261,223,273,219,290,223,273,234,310,234,310,223,273,231,287,234,310,231,287,241,305,162,225,174,229,175,261,175,261,174,229,186,235,175,261,186,235,191,266,191,266,186,235,198,244,191,266,198,244,205,276,205,276,198,244,207,252,205,276,207,252,219,290,175,261,158,259,162,225,124,453,148,457,136,472,124,453,136,472,121,468,124,453,121,468,106,463,124,453,106,463,104,441,62,429,50,411,52,268,62,429,52,268,74,243,62,429,74,243,75,365,62,429,75,365,78,445,41,389,35,366,38,301,41,389,38,301,52,268,41,389,52,268,50,411,148,457,151,473,136,472,38,301,35,366,34,340,92,455,104,441,106,463,180,432,200,462,177,471,369,117,367,14,372,93,478,237,443,225,454,222,404,23,435,-9,413,15,32,78,47,55,48,205,48,205,47,55,66,35,48,205,66,35,79,225,79,225,66,35,90,18,79,225,90,18,102,147,102,147,90,18,100,127,111,8,100,127,90,18,121,311,116,326,118,253,118,253,116,326,115,343,103,450,115,343,119,376,103,450,119,376,150,467,150,467,119,376,132,405,150,467,132,405,155,427,153,245,153,244,158,214,158,214,153,244,138,204,125,193,138,204,153,244,125,193,153,244,115,238,115,238,79,225,102,147,115,238,102,147,107,165,115, -238,107,165,114,180,115,238,114,180,125,193,27,175,20,134,23,105,27,175,23,105,32,78,27,175,32,78,48,205,273,228,239,257,237,227,237,227,239,257,212,259,237,227,212,259,206,225,206,225,212,259,190,262,206,225,190,262,180,221,180,221,190,262,171,267,180,221,171,267,158,214,158,214,171,267,155,274,158,214,155,274,153,245,153,245,155,274,141,284,153,245,141,284,136,248,136,248,141,284,129,297,136,248,129,297,121,311,103,450,70,423,73,282,103,450,73,282,86,270,103,450,86,270,102,261,103,450,102,261,118,253,103,450,118,253,115,343,45,334,49,319,50,389,50,389,49,319,55,306,50,389,55,306,70,423,70,423,55,306,63,293,70,423,63,293,73,282,229,21,211,-9,225,-9,229,21,225,-9,242,-7,229,21,185,26,211,-9,106,90,111,8,122,60,122,60,111,8,134,0,122,60,134,0,149,39,149,39,134,0,158,-5,149,39,158,-5,185,26,185,26,158,-5,184,-8,185,26,184,-8,211,-9,229,447,228,473,213,473,229,447,213,473,187,442,229,447,242,472,228,473,213,473,150,467,155,427,213,473,155,427,187,442,353,115,343,108,353,32,353,32,343,108,334,96,353,32,334,96,329,18,329,18,334,96,325,80,329,18,325,80,313,61,313,61,303,49,329,18,329,18,303,49,302,6,306,456,307,424,318,453,318,453,307,424,336,396,318,453,336,396,328,451,328,451,336,396,336,450,343,451,336,450,336,396,343,451,336,396,356,359,367,314,384,314,377,473,367,314,377,473,363,473,367,314,363,473,360,465,367,314,360,465,356,359,356,359,360,465,355,459,356,359,355,459,350,454,356,359,350,454,343,451,388,109,383,114,388,69,388,109,388,69,393,91,388,109,393,91,392,101,353,115,353,32,367,118,367,118,353,32,374,50,367,118,374,50,376,117,376,117,374,50,388,69,376,117,388,69,383,114,229,21,242,-7,253,23,253,23,242,-7,260,-4,253,23,260,-4,273,29,273,29,260,-4,281,0,273,29,281,0,290,38,290,38,281,0,302,6,290,38,302,6,303,49,306,456,295,460,307,424,307,424,295,460,286,462,307,424,286,462,271,441,271,441,286,462,271,466,271,441,271,466,256,469,271,441,256,469,242,472,271,441,242,472,229,447,273,256,239, -257,273,228,100,127,111,8,106,90,45,334,50,389,44,351,121,311,118,253,136,248,230,238,255,254,260,283,260,283,255,254,276,264,260,283,276,264,295,303,295,303,276,264,296,271,295,303,296,271,324,319,324,319,296,271,313,275,324,319,313,275,330,276,330,276,374,267,349,333,349,333,374,267,373,346,282,160,278,172,281,116,281,116,278,172,271,184,281,116,271,184,269,91,269,91,271,184,260,198,269,91,260,198,246,62,246,62,260,198,230,238,246,62,230,238,219,95,219,95,218,83,246,62,246,62,218,83,215,73,246,62,215,73,210,27,210,27,215,73,210,65,210,27,210,65,204,58,216,257,202,275,207,126,216,257,207,126,219,95,216,257,219,95,230,238,216,257,230,238,260,283,349,333,324,319,330,276,308,-142,335,-113,314,-63,314,-63,335,-113,333,-81,385,-41,333,-81,335,-113,385,-41,335,-113,368,-86,308,-142,314,-63,299,-142,299,-142,314,-63,296,-50,299,-142,296,-50,283,-126,283,-126,296,-50,278,-42,283,-126,278,-42,266,-114,266,-114,278,-42,260,-37,266,-114,260,-37,248,-105,248,-105,260,-37,242,-36,248,-105,242,-36,228,-100,228,-100,242,-36,206,-98,189,-100,206,-98,205,-41,189,-100,205,-41,174,-55,147,202,180,161,177,354,177,354,177,426,147,202,147,202,177,426,143,389,147,202,143,389,120,251,120,251,143,389,118,349,120,251,118,349,109,308,178,369,181,383,177,426,177,426,181,383,187,396,177,426,187,396,215,459,215,459,187,396,195,408,215,459,195,408,205,418,205,418,225,403,215,459,215,459,225,403,250,487,420,471,400,460,402,423,402,423,400,460,380,453,402,423,380,453,372,402,372,402,380,453,361,450,372,402,361,450,341,449,341,449,323,451,337,388,337,388,323,451,304,455,337,388,304,455,298,383,298,383,304,455,286,462,298,383,286,462,279,384,279,384,286,462,268,473,279,384,268,473,261,387,261,387,268,473,250,487,261,387,250,487,244,393,244,393,250,487,225,403,374,267,410,244,432,325,432,325,410,244,437,210,432,325,437,210,479,294,479,294,437,210,454,167,479,294,454,167,459,120,459,120,456,84,479,2,479,2,456,84,444,44,479,2,444,44,443,-29,443,-29,444,44,421,1,443,-29,421,1,405,-58,405,-58,421,1,385,-41,405,-58,385,-41,368, --86,534,205,513,254,516,49,534,205,516,49,530,77,534,205,530,77,538,110,534,205,538,110,541,151,513,254,479,294,479,2,513,254,479,2,499,25,513,254,499,25,516,49,459,120,479,2,479,294,429,449,452,477,438,487,429,449,438,487,420,471,429,449,420,471,402,423,341,449,337,388,372,402,242,-36,205,-41,206,-98,113,-131,127,-137,128,-102,128,-102,127,-137,140,-124,128,-102,140,-124,149,-76,149,-76,140,-124,155,-113,149,-76,155,-113,174,-55,174,-55,155,-113,171,-105,174,-55,171,-105,189,-100,202,275,191,294,207,126,207,126,191,294,183,314,207,126,183,314,180,161,180,161,183,314,178,334,180,161,178,334,177,354,210,27,204,58,198,52,198,52,188,56,210,27,210,27,188,56,167,68,210,27,167,68,161,-15,161,-15,167,68,147,-5,79,30,91,25,103,106,103,106,91,25,108,16,103,106,108,16,118,97,118,97,108,16,129,5,118,97,129,5,141,83,141,83,129,5,147,-5,141,83,147,-5,167,68,282,160,281,116,285,141,282,160,285,141,285,151,103,106,30,3,47,-6,103,106,47,-6,54,2,103,106,54,2,62,12,103,106,62,12,70,21,103,106,70,21,76,28,103,106,76,28,79,30,373,346,374,267,432,325,177,426,177,354,178,369,134,433,165,0,165,463,165,247,165,216,338,216,165,247,338,216,338,247,338,247,338,216,368,30,338,247,368,30,338,463,338,463,368,30,368,433,338,463,368,433,454,463,454,463,368,433,423,433,454,463,423,433,454,0,454,0,423,433,423,30,454,0,423,30,368,30,368,30,338,216,338,0,368,30,338,0,454,0,134,433,165,463,80,433,80,433,165,463,49,463,80,433,49,463,80,30,80,30,49,463,49,0,80,30,49,0,165,0,134,30,80,30,165,0,134,30,165,0,134,433,138,172,138,172,138,172,138,172,152,164,173,231,173,231,152,164,169,191,91,0,109,57,144,401,144,401,109,57,123,101,144,401,123,101,138,172,138,172,123,101,137,136,138,172,137,136,152,164,285,279,291,322,277,283,277,283,291,322,266,284,252,280,266,284,265,317,252,280,265,317,236,302,173,231,192,223,206,274,206,274,192,223,213,248,206,274,213,248,236,302,236,302,213,248,234,268,236,302,234,268,252,280,286,210,259,109,266,-4,286, -210,266,-4,279,-6,286,210,279,-6,295,-4,286,210,295,-4,288,217,295,-4,302,43,302,47,302,47,314,319,295,-4,295,-4,314,319,293,253,295,-4,293,253,293,245,295,-4,293,245,291,235,314,319,302,47,302,54,314,319,302,54,303,61,314,319,303,61,305,69,314,319,305,69,307,77,314,319,307,77,309,85,314,319,309,85,345,211,314,319,345,211,331,312,292,264,293,253,314,319,292,264,314,319,291,322,292,264,291,322,289,272,291,322,265,317,266,284,348,222,350,232,351,282,351,282,350,232,352,242,351,282,352,242,353,260,353,260,352,242,353,251,345,211,348,222,351,282,345,211,351,282,343,299,345,211,343,299,331,312,305,37,314,4,308,36,308,36,314,4,311,35,319,36,311,35,314,4,319,36,314,4,335,19,357,42,381,74,373,82,357,42,373,82,355,62,357,42,355,62,340,48,357,42,340,48,335,19,328,40,319,36,335,19,328,40,335,19,340,48,314,4,305,37,303,40,314,4,303,40,302,43,314,4,302,43,295,-4,290,226,288,217,295,-4,290,226,295,-4,291,235,256,0,266,-4,259,109,256,0,259,109,254,91,256,0,254,91,249,73,256,0,249,73,248,7,245,56,242,42,243,18,245,56,243,18,248,7,245,56,248,7,249,73,146,414,145,410,221,477,221,477,145,410,145,406,221,477,145,406,144,401,144,401,33,0,91,0,118,436,129,435,138,454,138,454,129,435,138,433,138,454,138,433,162,461,162,461,138,433,144,428,162,461,144,428,146,421,146,421,146,418,221,477,221,477,146,418,146,414,106,448,106,437,118,436,106,448,118,436,138,454,221,477,216,478,200,472,221,477,200,472,183,466,221,477,183,466,162,461,221,477,162,461,146,421,144,401,138,172,221,477,243,18,242,42,241,32,291,322,285,279,289,272,169,191,192,223,173,231,138,172,138,172,138,172,138,172,152,164,173,231,173,231,152,164,169,191,146,414,146,410,186,353,186,353,146,410,145,406,186,353,145,406,144,401,144,401,130,359,138,172,138,172,130,359,137,136,138,172,137,136,152,164,285,279,291,322,277,283,277,283,291,322,266,284,252,280,266,284,265,317,252,280,265,317,236,302,173,231,192,223,206,274,206,274,192,223,213,248,206,274,213,248,236,302,236,302,213, -248,234,268,236,302,234,268,252,280,286,210,259,109,266,-4,286,210,266,-4,279,-6,286,210,279,-6,296,-3,286,210,296,-3,288,217,296,-3,302,43,302,47,302,47,314,319,296,-3,296,-3,314,319,293,253,296,-3,293,253,293,245,296,-3,293,245,291,235,314,319,302,47,302,54,314,319,302,54,303,61,314,319,303,61,305,69,314,319,305,69,307,77,314,319,307,77,309,85,314,319,309,85,345,211,314,319,345,211,331,312,292,264,293,253,314,319,292,264,314,319,291,322,292,264,291,322,289,272,291,322,265,317,266,284,348,222,350,232,351,282,351,282,350,232,352,242,351,282,352,242,353,260,353,260,352,242,353,251,345,211,348,222,351,282,345,211,351,282,343,299,345,211,343,299,331,312,305,37,314,4,308,36,308,36,314,4,311,35,319,36,311,35,314,4,319,36,314,4,335,19,358,42,383,75,373,82,358,42,373,82,354,62,358,42,354,62,339,48,358,42,339,48,335,19,328,40,319,36,335,19,328,40,335,19,339,48,314,4,305,37,303,40,314,4,303,40,302,43,314,4,302,43,296,-3,290,226,288,217,296,-3,290,226,296,-3,291,235,256,0,266,-4,259,109,256,0,259,109,254,93,256,0,254,93,250,75,256,0,250,75,248,7,245,58,243,43,243,18,245,58,243,18,248,7,245,58,248,7,250,75,91,0,109,57,122,328,122,328,109,57,123,101,122,328,123,101,130,359,130,359,123,101,137,136,63,334,56,305,122,328,63,334,122,328,130,359,118,436,129,435,138,454,138,454,129,435,138,433,138,454,138,433,163,461,163,461,138,433,144,428,163,461,144,428,146,421,146,421,146,418,186,353,186,353,146,418,146,414,106,448,106,437,118,436,106,448,118,436,138,454,211,441,215,453,216,478,216,478,215,453,218,465,216,478,218,465,222,477,186,353,195,383,200,472,200,472,195,383,204,415,200,472,204,415,216,478,216,478,204,415,208,428,216,478,208,428,211,441,186,353,200,472,183,466,186,353,183,466,163,461,186,353,163,461,146,421,144,401,138,172,186,353,195,383,186,353,287,389,195,383,287,389,295,420,91,0,122,328,33,0,243,18,243,43,241,32,291,322,285,279,289,272,169,191,192,223,173,231,143,277,127,291,140,251,140,251,127,291,115, -311,140,251,115,311,108,265,108,265,115,311,111,337,123,458,111,337,116,367,123,458,116,367,130,389,216,487,193,416,235,411,216,487,235,411,270,481,270,481,235,411,270,397,270,481,270,397,311,467,311,467,270,397,303,380,311,467,303,380,339,367,311,467,339,367,345,451,345,451,339,367,382,361,345,451,382,361,380,437,380,437,382,361,423,431,442,434,423,431,424,368,442,434,424,368,454,386,498,467,481,472,489,440,489,440,481,472,477,464,489,440,477,464,475,412,475,412,477,464,469,453,475,412,469,453,457,443,457,443,442,434,454,386,457,443,454,386,475,412,423,431,382,361,424,368,413,331,385,327,396,276,396,276,385,327,394,261,400,2,394,261,385,327,400,2,385,327,383,69,383,69,379,48,400,2,400,2,379,48,369,30,400,2,369,30,354,-16,354,-16,369,30,354,16,354,-16,354,16,333,6,455,324,437,329,442,301,442,301,437,329,434,302,423,300,434,302,437,329,423,300,437,329,413,331,413,331,396,276,402,287,413,331,402,287,412,295,413,331,412,295,423,300,480,280,492,292,481,304,480,280,481,304,470,315,480,280,470,315,469,289,442,301,451,299,455,324,455,324,451,299,459,295,455,324,459,295,470,315,470,315,459,295,469,289,469,106,461,144,460,66,460,66,461,144,442,178,460,66,442,178,436,30,436,30,442,178,420,209,436,30,420,209,402,236,402,236,394,261,400,2,402,236,400,2,436,30,333,6,307,3,354,-16,354,-16,307,3,302,-22,302,-22,307,3,286,5,302,-22,286,5,268,-21,268,-21,286,5,268,12,268,-21,268,12,253,23,130,389,149,405,165,479,165,479,149,405,171,414,165,479,171,414,216,487,216,487,171,414,193,416,91,428,71,390,84,286,91,428,84,286,108,265,91,428,108,265,111,337,91,428,111,337,123,458,71,390,64,348,69,314,71,390,69,314,84,286,220,272,211,270,211,251,211,251,211,270,201,267,211,251,201,267,201,248,201,248,201,267,192,266,201,248,192,266,191,247,191,247,192,266,183,266,180,246,191,247,183,266,180,246,183,266,162,268,180,246,162,268,143,277,180,246,143,277,140,251,222,255,234,260,228,276,222,255,228,276,220,272,222,255,220,272,211,251,131,159,101,153,105,102,105,102,101,153,97,104,85, -102,97,104,101,153,85,102,101,153,75,136,75,136,54,114,55,80,75,136,55,80,63,89,75,136,63,89,74,97,75,136,74,97,85,102,48,68,55,80,54,114,48,68,54,114,39,91,48,68,39,91,31,72,114,98,122,91,131,159,131,159,122,91,129,81,131,159,129,81,136,69,136,69,143,54,166,153,166,153,143,54,151,40,166,153,151,40,160,27,171,15,185,4,191,138,191,138,185,4,201,-5,191,138,201,-5,208,115,208,115,201,-5,219,-13,208,115,219,-13,221,88,221,88,219,-13,241,-18,221,88,241,-18,231,61,231,61,241,-18,241,39,253,23,241,39,241,-18,253,23,241,-18,268,-21,166,153,160,27,171,15,166,153,171,15,191,138,166,153,131,159,136,69,323,273,325,203,338,297,338,297,325,203,341,170,338,297,341,170,359,315,359,315,341,170,360,139,359,315,360,139,385,327,385,327,360,139,376,106,385,327,376,106,383,69,325,203,323,273,318,243,131,159,105,102,114,98,123,458,130,389,165,479,409,58,409,30,440,0,409,58,440,0,409,109,409,58,409,109,408,109,409,58,408,109,166,432,409,58,166,432,144,463,409,58,144,463,127,433,80,433,127,433,144,463,80,433,144,463,49,463,80,433,49,463,64,0,80,433,64,0,80,0,409,463,409,109,440,0,409,463,440,0,440,463,360,30,80,405,81,353,360,30,81,353,346,0,360,30,346,0,440,0,360,30,440,0,409,30,81,353,80,405,80,353,64,0,49,463,49,0,538,249,543,276,545,321,545,321,543,276,551,296,545,321,551,296,579,327,579,327,551,296,563,307,579,327,563,307,577,311,577,311,593,307,579,327,579,327,593,307,612,321,593,307,606,296,612,321,612,321,606,296,615,276,612,321,615,276,639,304,639,304,615,276,620,249,639,304,620,249,622,213,622,213,620,249,622,212,622,212,620,178,639,125,639,125,620,178,615,152,639,125,615,152,612,109,612,109,615,152,606,133,612,109,606,133,593,122,639,304,639,125,659,279,659,279,639,125,660,149,659,279,660,149,672,249,672,249,660,149,672,180,672,249,672,180,677,215,622,213,622,212,639,125,622,213,639,125,639,304,542,151,545,109,551,133,551,133,545,109,579,103,551,133,579,103,563,122,563,122,579,103,578,118,593,122,578, -118,579,103,593,122,579,103,612,109,518,125,545,109,518,304,518,304,545,109,538,178,518,304,538,178,536,213,536,213,538,249,518,304,518,304,538,249,545,321,481,213,485,179,485,248,485,248,485,179,498,149,485,248,498,149,498,279,498,279,498,149,518,125,498,279,518,125,518,304,484,61,484,0,673,0,484,61,673,0,673,61,149,157,146,109,158,38,158,38,146,109,138,66,158,38,138,66,127,3,127,3,138,66,123,36,127,3,123,36,100,24,100,24,90,30,127,3,127,3,90,30,77,-9,83,449,91,447,189,463,189,463,91,447,99,445,189,463,99,445,105,443,105,443,113,439,189,463,189,463,113,439,120,431,189,463,120,431,129,421,487,420,494,473,480,433,480,433,494,473,470,439,446,427,470,439,494,473,446,427,494,473,443,460,526,384,536,385,536,467,536,467,536,385,547,389,536,467,547,389,552,458,552,458,547,389,556,397,552,458,556,397,561,443,561,443,556,397,562,407,561,443,562,407,565,422,517,472,494,473,496,403,517,472,496,403,507,389,517,472,507,389,526,384,517,472,526,384,536,467,420,260,421,307,412,426,412,426,421,307,424,355,412,426,424,355,443,460,443,460,424,355,432,397,443,460,432,397,446,427,412,426,396,379,407,-7,412,426,407,-7,420,-7,412,426,420,-7,420,260,407,-7,396,379,390,328,407,-7,390,328,389,280,407,-7,389,280,389,149,407,-7,389,149,189,463,407,-7,189,463,180,345,180,345,189,463,158,38,180,345,158,38,174,85,180,345,174,85,180,136,180,345,180,136,180,183,139,408,150,391,189,463,189,463,150,391,158,38,158,38,150,391,150,203,74,449,83,449,189,463,74,449,189,463,63,463,74,449,63,463,63,450,77,-9,90,30,82,44,77,-9,82,44,74,60,77,-9,74,60,63,74,77,-9,63,74,53,-8,44,80,34,78,34,-3,44,80,34,-3,53,-8,44,80,53,-8,63,74,7,56,8,20,14,67,14,67,8,20,18,5,14,67,18,5,23,74,23,74,18,5,34,-3,23,74,34,-3,34,78,8,20,7,56,5,41,149,157,158,38,150,203,189,463,129,421,139,408,494,473,487,420,496,403,538,178,545,109,542,151,257,348,262,348,263,348,273,364,263,348,289,347,273,364,289,347,294,363,294,363,289,347,308, -341,294,363,308,341,313,360,313,360,308,341,319,330,313,360,319,330,330,354,330,354,319,330,326,314,330,354,326,314,327,292,327,292,325,273,326,226,326,226,325,273,318,257,326,226,318,257,311,221,311,221,318,257,307,245,311,221,307,245,293,219,293,219,307,245,290,237,293,219,290,237,271,219,271,219,290,237,267,234,271,219,267,234,266,219,266,219,267,234,263,234,266,219,263,234,262,219,262,219,263,234,260,235,262,219,260,235,258,219,258,219,260,235,257,235,258,219,257,235,254,220,254,220,257,235,254,235,254,220,254,235,249,220,249,220,254,235,249,236,249,220,249,236,249,152,249,152,249,236,205,319,249,152,205,319,250,138,250,138,205,319,205,156,374,293,374,305,373,282,373,282,374,305,371,315,373,282,371,315,371,271,371,271,371,315,368,324,371,271,368,324,367,261,367,261,368,324,363,333,367,261,363,333,361,251,361,251,363,333,355,340,361,251,355,340,353,243,353,243,355,340,344,348,353,243,344,348,340,233,340,233,344,348,330,354,340,233,330,354,327,292,327,292,326,226,340,233,273,364,172,364,186,352,273,364,186,352,196,348,273,364,196,348,201,343,273,364,201,343,204,333,273,364,204,333,205,319,273,364,205,319,253,347,273,364,253,347,257,348,273,364,257,348,263,348,249,335,250,340,205,319,249,335,205,319,249,236,251,344,253,347,205,319,251,344,205,319,250,340,285,106,285,117,269,118,285,106,269,118,259,122,285,106,259,122,204,140,285,106,204,140,202,129,285,106,202,129,197,122,285,106,197,122,187,119,285,106,187,119,172,117,285,106,172,117,172,106,205,156,204,140,259,122,205,156,259,122,253,128,205,156,253,128,250,138,270,473,265,444,329,433,270,473,329,433,344,461,344,461,329,433,384,403,344,461,384,403,409,427,409,427,384,403,428,357,409,427,428,357,460,374,460,374,428,357,457,299,460,374,457,299,467,231,467,231,493,307,460,374,467,231,494,154,493,307,460,88,494,154,467,231,460,88,467,231,457,165,460,88,457,165,428,107,460,88,428,107,409,36,266,20,266,-9,329,31,329,31,266,-9,343,2,329,31,343,2,384,61,384,61,343,2,409,36,384,61,409,36,428,107,75,298,104,356,125,427,125,427,104,356,148,402,125, -427,148,402,192,461,192,461,148,402,203,433,192,461,203,433,270,473,270,473,203,433,265,444,39,155,72,88,39,309,39,309,72,88,65,232,73,375,65,232,75,298,73,375,75,298,125,427,203,30,148,61,190,2,203,30,190,2,266,-9,203,30,266,-9,266,20,124,36,190,2,148,61,124,36,148,61,104,107,124,36,104,107,75,165,124,36,75,165,72,88,65,232,72,88,75,165,39,155,39,309,27,232,39,309,65,232,73,375,493,307,494,154,505,230,186,352,172,364,172,353,289,347,263,348,262,348,112,121,105,136,117,80,117,80,105,136,101,157,117,80,101,157,86,97,86,97,101,157,99,182,118,343,99,182,108,243,118,343,108,243,132,291,121,110,112,121,117,80,121,110,117,80,120,-94,121,110,120,-94,125,-59,121,110,125,-59,131,102,120,-94,117,80,109,67,120,-94,109,67,120,-106,193,181,176,162,188,77,193,181,188,77,231,136,193,181,231,136,210,198,292,335,297,323,293,361,292,335,293,361,283,343,283,343,293,361,278,373,283,343,278,373,271,349,271,349,278,373,259,380,271,349,259,380,257,352,257,352,259,380,244,353,205,346,244,353,238,383,205,346,238,383,173,372,173,372,118,343,132,291,173,372,132,291,166,325,173,372,166,325,205,346,48,142,64,118,75,300,75,300,64,118,86,97,75,300,86,97,118,343,118,343,86,97,99,182,47,249,37,195,39,168,47,249,39,168,48,142,47,249,48,142,75,300,303,345,293,361,297,323,303,345,297,323,307,323,318,8,341,-2,331,112,331,112,341,-2,338,38,340,111,338,38,341,46,340,111,341,46,349,107,349,107,341,46,347,53,349,107,347,53,353,60,349,107,353,60,355,101,355,101,353,60,359,69,355,101,359,69,360,92,360,92,359,69,362,81,353,16,371,-6,363,13,363,13,371,-6,376,13,415,27,376,13,394,-4,415,27,394,-4,416,1,345,21,340,29,341,-2,345,21,341,-2,371,-6,345,21,371,-6,353,16,338,38,341,-2,340,29,331,112,317,109,318,8,318,8,317,109,306,102,318,8,306,102,303,25,303,25,306,102,297,91,303,25,297,91,294,44,294,44,297,91,292,78,294,44,292,78,291,63,441,295,429,314,402,311,441,295,402,311,393,282,441,295,455,315,429,314,402,311,373, -305,393,282,393,282,373,305,343,295,393,282,343,295,338,246,338,246,343,295,312,280,338,246,312,280,291,266,283,195,338,246,291,266,283,195,291,266,271,252,283,195,271,252,250,235,283,195,250,235,231,136,230,218,210,198,231,136,230,218,231,136,250,235,176,162,174,53,188,45,176,162,188,45,188,77,188,77,188,45,199,34,188,77,199,34,212,68,212,68,199,34,207,20,212,68,207,20,212,6,416,1,437,10,448,65,448,65,437,10,457,22,448,65,457,22,473,117,473,117,457,22,477,38,473,117,477,38,489,174,489,174,477,38,504,68,489,174,504,68,495,228,495,228,504,68,519,299,519,299,504,68,527,103,519,299,527,103,541,280,541,280,527,103,544,141,541,280,544,141,554,252,554,252,544,141,555,179,554,252,555,179,559,216,494,246,495,228,519,299,494,246,519,299,490,311,494,246,490,311,489,264,490,311,455,315,464,291,490,311,464,291,480,280,490,311,480,280,489,264,441,295,464,291,455,315,376,13,371,-6,394,-4,259,380,238,383,244,353,211,-37,201,-69,210,-123,210,-123,201,-69,186,-99,210,-123,186,-99,174,-143,174,-143,186,-99,167,-121,174,-143,167,-121,145,-129,145,-129,134,-128,174,-143,174,-143,134,-128,133,-151,174,53,176,162,167,41,167,41,176,162,160,143,167,41,160,143,153,14,153,14,160,143,145,123,153,14,145,123,138,-21,138,-21,145,123,131,102,138,-21,131,102,125,-59,263,-8,259,19,257,-53,257,-53,259,19,249,41,257,-53,249,41,238,-91,238,-91,249,41,232,57,238,-91,232,57,214,-7,214,-7,232,57,212,6,214,-7,211,-37,238,-91,134,-128,127,-123,133,-151,133,-151,127,-123,122,-115,133,-151,122,-115,106,-147,106,-147,122,-115,120,-106,106,-147,120,-106,109,67,106,-147,109,67,102,53,106,-147,102,53,95,40,106,-147,95,40,90,28,106,-147,90,28,86,-136,90,28,84,15,86,-136,86,-136,84,15,78,-1,86,-136,78,-1,73,-121,73,-121,78,-1,73,-19,73,-121,73,-19,68,-38,66,-101,73,-121,68,-38,66,-101,68,-38,65,-58,66,-101,65,-58,64,-78,211,-37,210,-123,238,-91,212,68,212,6,232,57,415,27,416,1,448,65,331,112,338,38,340,111,306,429,313,427,313,427,325,458,313,427,326,183,325,458,326,183,344,423,344,423,326,183,344, -217,372,199,344,217,326,183,325,458,273,463,279,433,325,458,279,433,288,432,325,458,288,432,297,431,325,458,297,431,306,429,325,458,306,429,313,427,273,463,49,463,80,433,273,463,80,433,134,433,273,463,134,433,165,433,273,463,165,433,272,433,273,463,272,433,279,433,134,433,165,0,165,433,165,208,165,177,273,177,165,208,273,177,266,208,275,208,266,208,273,177,275,208,273,177,326,183,80,30,80,433,49,463,80,30,49,463,49,0,80,30,49,0,165,0,80,30,165,0,134,30,407,414,371,442,385,393,407,414,385,393,398,371,407,414,398,371,406,346,407,414,406,346,409,320,407,414,409,320,431,374,371,442,325,458,344,423,371,442,344,423,367,411,371,442,367,411,385,393,326,183,313,427,313,213,326,183,313,213,305,211,326,183,305,211,295,209,326,183,295,209,285,208,326,183,285,208,275,208,440,321,431,374,431,268,431,268,431,374,409,320,408,228,409,320,406,295,408,228,406,295,398,270,384,248,366,229,372,199,384,248,372,199,408,228,384,248,408,228,398,270,134,30,165,0,134,433,344,217,372,199,366,229,409,320,408,228,431,268,97,357,118,384,118,384,123,430,118,384,124,36,123,430,124,36,149,409,149,409,124,36,149,55,189,2,149,55,124,36,64,265,71,298,73,379,73,379,71,298,81,329,73,379,81,329,123,430,123,430,81,329,97,357,123,430,97,357,118,384,73,379,43,155,64,265,64,265,43,155,63,232,65,200,63,232,43,155,65,200,43,155,74,89,42,312,31,232,43,155,42,312,43,155,73,379,228,77,210,67,213,29,213,29,210,67,194,55,213,29,194,55,189,2,189,2,194,55,180,39,189,2,180,39,173,42,490,310,460,377,461,298,490,310,461,298,468,265,490,310,468,265,470,232,490,310,470,232,480,127,490,310,480,127,495,177,490,310,495,177,501,232,450,137,455,83,461,168,461,168,455,83,480,127,461,168,480,127,467,200,467,200,480,127,470,232,460,377,412,428,414,384,460,377,414,384,435,357,460,377,435,357,451,329,460,377,451,329,461,298,414,84,414,384,412,428,414,84,412,428,383,409,414,84,383,409,383,55,414,84,383,55,421,46,435,109,414,84,421,46,435,109,421,46,455,83,435,109,455,83,450,137,390, -7,380,17,392,-34,383,55,380,17,421,46,380,17,383,55,378,52,380,17,378,52,375,-24,380,17,375,-24,392,-34,310,26,299,24,300,-7,300,-7,299,24,288,22,300,-7,288,22,283,-9,283,-9,288,22,277,21,283,-9,277,21,266,-9,266,-9,277,21,266,21,269,85,266,55,280,53,269,85,280,53,291,83,291,83,280,53,292,50,291,83,292,50,311,76,311,76,292,50,303,44,311,76,303,44,313,37,192,430,218,437,270,473,270,473,218,437,244,441,270,473,244,441,266,442,266,442,290,441,270,473,270,473,290,441,348,462,232,44,242,50,247,83,247,83,242,50,254,53,247,83,254,53,269,85,269,85,254,53,266,55,228,77,213,29,222,37,228,77,222,37,232,44,228,77,232,44,247,83,383,409,412,428,363,422,363,422,412,428,348,462,363,422,348,462,340,431,340,431,348,462,315,438,496,-38,492,-8,484,-40,484,-40,492,-8,481,-9,484,-40,481,-9,473,-42,473,-42,481,-9,471,-11,473,-42,471,-11,461,-43,461,-43,471,-11,460,-12,461,-43,460,-12,450,-44,450,-44,460,-12,449,-13,450,-44,449,-13,438,-44,438,-44,449,-13,438,-14,425,-12,412,-8,413,-42,425,-12,413,-42,438,-44,425,-12,438,-44,438,-14,401,-1,390,7,392,-34,401,-1,392,-34,413,-42,401,-1,413,-42,412,-8,375,-24,378,52,373,49,375,-24,373,49,368,46,375,-24,368,46,363,43,375,-24,363,43,359,-11,311,76,313,37,328,66,328,66,313,37,322,29,328,66,322,29,331,-1,328,66,331,-1,343,54,343,54,331,-1,346,3,343,54,346,3,357,41,357,41,346,3,359,-11,357,41,359,-11,363,43,322,29,310,26,316,-4,322,29,316,-4,331,-1,189,462,123,430,149,409,189,462,149,409,168,420,189,462,168,420,192,430,189,462,192,430,270,473,124,36,118,384,118,84,124,36,118,84,98,109,124,36,98,109,83,137,124,36,83,137,74,89,71,168,65,200,74,89,71,168,74,89,83,137,266,-9,266,21,257,21,266,-9,257,21,247,22,266,-9,247,22,236,24,266,-9,236,24,225,26,266,-9,225,26,213,29,266,-9,213,29,189,2,189,2,173,42,166,45,189,2,166,45,160,49,189,2,160,49,155,52,189,2,155,52,149,55,310,26,300,-7,316,-4,348,462,290,441,315,438,115,245,111, -228,115,245,115,245,111,228,136,203,115,245,136,203,133,362,115,245,133,362,113,385,115,245,113,385,107,276,107,276,113,385,105,418,89,469,105,418,107,432,89,469,107,432,124,482,124,482,107,432,113,445,124,482,113,445,122,455,165,487,152,465,186,451,165,487,186,451,196,484,196,484,186,451,208,416,196,484,208,416,224,475,224,475,208,416,220,370,224,475,220,370,226,323,226,231,224,172,242,74,242,74,224,172,219,118,242,74,219,118,209,27,209,27,219,118,209,78,209,27,209,78,191,63,191,63,180,66,209,27,209,27,180,66,170,-15,308,226,360,238,311,250,308,226,311,250,311,355,308,226,311,355,308,371,308,226,308,371,304,387,308,226,304,387,299,401,308,226,299,401,293,175,311,250,312,265,313,339,313,339,312,265,313,281,313,339,313,281,313,326,313,326,313,281,313,297,313,326,313,297,313,312,288,425,270,444,271,123,271,123,270,444,249,461,271,123,249,461,242,74,242,74,249,461,227,284,88,28,98,24,107,105,107,105,98,24,116,15,107,105,116,15,120,97,120,97,116,15,136,4,120,97,136,4,140,86,140,86,136,4,155,-6,140,86,155,-6,162,75,162,75,155,-6,170,-15,162,75,170,-15,180,66,107,105,41,3,57,-5,107,105,57,-5,64,4,107,105,64,4,71,12,107,105,71,12,78,19,107,105,78,19,84,24,107,105,84,24,88,28,135,462,152,465,165,487,135,462,165,487,124,482,135,462,124,482,122,455,89,469,61,446,63,321,89,469,63,321,87,299,89,469,87,299,107,276,89,469,107,276,105,418,43,345,63,321,61,446,43,345,61,446,42,416,43,345,42,416,35,378,133,362,136,203,157,343,157,343,136,203,162,226,157,343,162,226,177,318,177,318,162,226,179,252,177,318,179,252,185,280,104,185,136,203,111,228,104,185,111,228,102,214,104,185,102,214,89,202,104,185,89,202,75,194,104,185,75,194,69,173,75,194,62,188,63,188,75,194,63,188,69,173,387,209,405,291,376,227,376,227,405,291,376,269,376,227,376,269,360,238,360,238,376,269,334,255,329,426,342,433,381,493,381,493,342,433,356,438,381,493,356,438,372,439,372,439,396,435,381,493,381,493,396,435,431,487,437,372,464,284,469,472,469,472,464,284,488, -305,469,472,488,305,497,449,497,449,488,305,505,330,497,449,505,330,513,420,513,420,505,330,515,358,513,420,515,358,519,388,434,389,437,372,469,472,434,389,469,472,431,487,434,389,431,487,427,407,431,487,396,435,414,423,431,487,414,423,427,407,434,344,424,317,432,268,434,344,432,268,464,284,434,344,464,284,437,372,432,266,432,268,424,317,432,266,424,317,438,2,432,266,438,2,469,223,562,73,554,65,565,51,565,51,554,65,545,57,565,51,545,57,544,33,544,33,545,57,537,51,544,33,537,51,531,48,531,48,505,66,520,15,520,15,505,66,497,-1,438,2,466,-15,469,223,469,223,466,-15,475,-15,469,223,475,-15,486,166,486,166,475,-15,497,-1,486,166,497,-1,494,110,494,110,497,-1,505,66,396,131,398,98,405,291,405,291,398,98,405,62,405,291,405,62,424,317,424,317,405,62,418,29,424,317,418,29,438,2,387,209,393,185,405,291,405,291,393,185,395,159,405,291,395,159,396,131,569,80,562,73,565,51,569,80,565,51,580,66,531,48,520,15,544,33,381,493,288,425,299,401,381,493,299,401,315,415,381,493,315,415,329,426,288,425,271,123,293,175,288,425,293,175,299,401,226,323,227,284,249,461,226,323,249,461,224,475,311,250,360,238,334,255,226,231,242,74,227,284,311,250,313,339,311,355,406,299,397,276,406,234,406,234,397,276,384,255,406,234,384,255,380,214,380,214,384,255,366,237,380,214,366,237,348,199,348,199,366,237,344,225,348,199,344,225,316,192,348,199,316,192,438,30,325,459,273,463,278,433,325,459,278,433,285,432,325,459,285,432,292,431,325,459,292,431,299,430,325,459,299,430,306,428,325,459,306,428,313,427,325,459,313,427,316,192,325,459,316,192,344,225,325,459,344,225,344,423,325,459,344,423,370,444,165,433,278,433,273,463,165,433,273,463,134,433,165,433,134,433,165,0,134,433,273,463,80,433,80,433,273,463,49,463,80,433,49,463,80,30,80,30,49,463,49,0,80,30,49,0,165,0,316,192,313,427,313,224,316,192,313,224,307,191,307,191,313,224,305,223,307,191,305,223,298,190,298,190,305,223,297,222,298,190,297,222,290,221,274,220,280,189,282,221,282,221,280,189,289,189,282,221,289,189,290,221,290, -221,289,189,298,190,274,220,165,220,217,190,274,220,217,190,254,190,274,220,254,190,257,190,274,220,257,190,261,190,274,220,261,190,264,189,274,220,264,189,268,189,274,220,268,189,272,189,274,220,272,189,280,189,406,299,406,234,409,325,409,325,424,260,431,379,431,379,424,260,436,291,431,379,436,291,440,327,407,418,370,444,385,394,407,418,385,394,398,375,407,418,398,375,406,352,407,418,406,352,409,325,407,418,409,325,431,379,370,444,344,423,367,410,370,444,367,410,385,394,348,199,438,30,498,0,498,0,438,30,370,30,498,0,370,30,353,0,353,0,370,30,254,190,353,0,254,190,217,190,134,30,80,30,165,0,134,30,165,0,134,433,409,325,406,234,424,260,217,190,165,220,165,190,208,212,213,212,214,233,214,233,213,212,218,212,214,233,218,212,221,233,221,233,218,212,223,212,221,233,223,212,228,233,228,233,223,212,227,212,228,233,227,212,232,212,341,260,310,243,313,222,313,222,310,243,272,235,313,222,272,235,377,44,377,44,272,235,241,213,236,213,241,213,272,235,236,213,272,235,232,212,232,212,272,235,228,233,193,213,198,213,200,234,200,234,198,213,203,212,200,234,203,212,207,233,207,233,203,212,208,212,207,233,208,212,214,233,193,91,193,213,193,234,193,91,193,234,131,377,193,91,131,377,196,58,205,431,218,439,248,467,248,467,218,439,235,443,248,467,235,443,255,445,255,445,297,441,298,464,298,464,297,441,329,430,298,464,329,430,350,452,350,452,329,430,352,410,350,452,352,410,395,429,395,429,352,410,365,379,395,429,365,379,370,336,370,336,362,290,384,250,384,250,362,290,349,233,193,397,196,417,131,377,193,397,131,377,193,234,131,377,196,417,205,431,131,377,205,431,248,467,131,377,248,467,128,409,248,467,48,467,79,448,248,467,79,448,103,442,248,467,103,442,119,429,248,467,119,429,128,409,370,336,384,250,395,429,395,429,384,250,413,274,395,429,413,274,428,393,428,393,413,274,433,304,428,393,433,304,441,342,298,464,248,467,255,445,341,260,313,222,349,233,341,260,349,233,362,290,490,26,472,36,413,0,413,0,472,36,456,50,413,0,456,50,439,66,439,66,515,178,420,86,534,0,534,16,510,19,534,0,510, -19,490,26,534,0,490,26,413,0,413,0,439,66,420,86,413,0,420,86,398,113,413,0,398,113,395,23,377,44,280,-50,298,-69,377,44,298,-69,395,23,377,44,395,23,398,113,377,44,398,113,376,140,377,44,376,140,355,167,377,44,355,167,335,195,377,44,335,195,313,222,276,0,276,17,245,19,276,0,245,19,222,25,276,0,222,25,128,58,276,0,128,58,119,37,276,0,119,37,103,25,276,0,103,25,79,19,276,0,79,19,48,17,276,0,48,17,48,0,128,58,222,25,131,91,131,91,222,25,205,37,131,91,205,37,131,128,131,128,205,37,196,58,131,128,196,58,131,377,515,178,439,66,534,159,79,448,48,467,48,450,193,234,193,213,200,234,263,463,21,463,83,449,263,463,83,449,117,449,263,463,117,449,166,449,263,463,166,449,202,449,263,463,202,449,215,448,263,463,215,448,226,442,263,463,226,442,235,433,263,463,235,433,242,420,263,463,242,420,248,402,263,463,248,402,263,402,202,195,184,197,202,180,202,180,184,197,174,200,202,180,174,200,117,234,117,234,174,200,169,206,117,234,169,206,117,449,117,449,169,206,167,217,117,449,167,217,166,234,21,463,21,402,35,402,21,463,35,402,41,420,21,463,41,420,48,433,21,463,48,433,57,442,21,463,57,442,69,448,21,463,69,448,83,449,337,211,331,202,397,180,397,180,331,202,320,198,397,180,320,198,305,195,570,198,565,197,666,180,666,180,565,197,558,196,666,180,558,196,547,195,580,212,579,207,666,180,666,180,579,207,578,203,666,180,578,203,576,201,576,201,573,200,666,180,666,180,573,200,570,198,654,447,670,449,670,463,654,447,670,463,643,443,643,443,670,463,598,463,643,443,598,463,636,436,636,436,598,463,632,425,666,195,648,197,666,180,666,180,648,197,638,200,666,180,638,200,581,232,581,232,638,200,633,206,581,232,633,206,581,398,581,398,633,206,631,216,581,398,631,216,598,463,598,463,631,216,630,233,598,463,630,233,630,411,581,221,580,212,666,180,581,221,666,180,581,232,486,247,378,463,466,179,486,247,466,179,473,179,486,247,473,179,581,398,486,247,581,398,598,463,378,463,293,463,305,447,378,463,305,447,317,443,378,463,317,443,327,435,378,463,327,435,335, -426,378,463,335,426,341,414,378,463,341,414,360,396,378,463,360,396,466,179,341,414,361,223,360,240,397,195,382,198,397,180,397,180,382,198,371,202,397,180,371,202,340,223,340,223,371,202,365,211,340,223,365,211,341,240,341,240,365,211,361,223,341,240,361,223,341,414,202,180,117,234,117,217,202,180,117,217,115,206,202,180,115,206,110,200,202,180,110,200,99,197,202,180,99,197,82,195,202,180,82,195,82,180,397,180,305,195,305,180,337,211,397,180,340,223,305,447,293,463,293,449,360,396,341,414,360,240,666,180,547,195,547,180,632,425,598,463,630,411,166,449,117,449,166,234,177,30,474,433,432,433,432,433,474,433,474,463,432,433,474,463,366,433,366,433,474,463,328,433,366,433,328,433,72,30,72,30,328,433,35,30,72,30,35,30,468,0,468,0,35,30,35,0,70,463,70,433,328,433,70,463,328,433,474,463,177,30,432,433,140,30,177,30,140,30,468,0,177,30,468,0,468,30,72,30,468,0,140,30,264,305,264,315,185,294,185,294,264,315,127,315,185,294,127,315,47,305,47,305,127,315,127,316,47,305,127,316,186,441,186,441,127,316,264,453,186,441,264,453,186,442,186,442,264,453,264,463,186,442,264,463,104,442,81,441,104,442,264,463,81,441,264,463,32,463,204,-19,190,-62,203,-114,203,-114,190,-62,171,-96,203,-114,171,-96,153,-141,153,-141,171,-96,147,-118,153,-141,147,-118,123,-126,123,-126,117,-126,153,-141,153,-141,117,-126,109,-124,153,-141,109,-124,91,-151,91,-151,109,-124,102,-121,91,-151,102,-121,94,-116,32,463,30,380,43,380,32,463,43,380,47,407,32,463,47,407,54,424,32,463,54,424,65,435,32,463,65,435,81,441,185,293,73,173,111,163,185,293,111,163,153,185,185,293,153,185,264,305,185,293,264,305,185,294,153,184,153,185,150,157,153,184,150,157,178,140,153,184,178,140,198,171,273,47,269,87,265,-16,265,-16,269,87,255,121,265,-16,255,121,241,-71,241,-71,255,121,232,149,241,-71,232,149,209,31,209,31,232,149,206,76,198,171,178,140,196,113,198,171,196,113,206,76,198,171,206,76,232,149,209,31,204,-19,241,-71,91,-151,94,-116,87,-108,91,-151,87,-108,79,-100,91,-151,79,-100,73,-93,91,-151,73,-93,70,-150,70, --150,73,-93,66,-89,70,-150,66,-89,60,-86,70,-150,60,-86,53,-86,70,-150,53,-86,52,-144,44,-87,36,-91,37,-136,44,-87,37,-136,52,-144,44,-87,52,-144,53,-86,30,-97,26,-104,28,-126,30,-97,28,-126,37,-136,30,-97,37,-136,36,-91,28,-126,26,-104,24,-113,204,-19,203,-114,241,-71,111,163,73,173,73,163,153,185,111,163,150,157,185,294,47,305,47,294,65,60,52,65,20,0,20,0,52,65,42,75,20,0,42,75,20,112,20,112,42,75,36,90,20,112,36,90,34,112,37,271,43,215,46,330,46,330,43,215,61,169,46,330,61,169,75,385,75,385,61,169,90,133,75,385,90,133,120,431,120,431,90,133,117,273,132,105,117,273,90,133,260,473,209,437,260,448,260,448,311,439,337,462,337,462,311,439,351,415,337,462,351,415,399,432,399,432,351,415,380,377,399,432,380,377,398,329,404,273,428,132,445,387,445,387,428,132,458,169,445,387,458,169,474,332,474,332,458,169,477,215,474,332,477,215,484,271,399,432,398,329,404,273,399,432,404,273,445,387,337,462,260,473,260,448,366,149,386,104,386,185,386,185,386,104,428,132,386,185,428,132,399,228,399,228,428,132,404,273,300,0,333,59,305,105,305,105,333,59,334,84,305,105,334,84,339,121,339,121,334,84,386,104,339,121,386,104,366,149,483,77,477,67,501,0,501,0,477,67,467,61,501,0,467,61,453,59,501,0,501,111,488,111,501,0,488,111,486,92,501,0,486,92,483,77,333,59,300,0,501,0,333,59,501,0,453,59,183,462,120,431,140,370,183,462,140,370,169,410,183,462,169,410,209,437,183,462,209,437,260,473,120,431,117,273,123,323,120,431,123,323,140,370,184,84,185,59,215,105,184,84,215,105,181,122,184,84,181,122,154,152,184,84,154,152,134,189,184,84,134,189,132,105,121,231,117,273,132,105,121,231,132,105,134,189,221,0,215,105,185,59,221,0,185,59,81,59,221,0,81,59,65,60,221,0,65,60,20,0,43,248,46,133,61,294,61,294,46,133,75,78,61,294,75,78,90,331,90,331,75,78,120,32,90,331,120,32,117,191,117,191,132,359,90,331,154,312,181,341,184,379,184,379,181,341,215,359,184,379,215,359,185,405,185,405,215,359,221,463,185,405,221, -463,81,405,65,403,81,405,221,463,65,403,221,463,20,463,20,463,20,352,34,352,20,463,34,352,36,373,20,463,36,373,42,388,20,463,42,388,52,398,20,463,52,398,65,403,398,135,380,86,399,31,399,31,380,86,351,49,399,31,351,49,337,1,337,1,351,49,311,24,337,1,311,24,260,-9,260,-9,311,24,260,16,501,463,300,463,333,405,501,463,333,405,453,405,501,463,453,405,467,403,501,463,467,403,477,396,501,463,477,396,483,386,501,463,483,386,486,372,501,463,486,372,488,353,501,463,488,353,501,353,366,315,386,359,339,343,339,343,386,359,334,379,339,343,334,379,305,359,305,359,334,379,333,405,305,359,333,405,300,463,484,192,477,248,474,131,474,131,477,248,458,294,474,131,458,294,445,76,445,76,458,294,428,331,445,76,428,331,404,191,404,191,428,331,399,236,386,278,399,236,428,331,386,278,428,331,386,359,386,278,386,359,366,315,404,191,399,31,445,76,209,26,169,53,183,1,209,26,183,1,260,-9,209,26,260,-9,260,16,140,93,123,141,120,32,140,93,120,32,183,1,140,93,183,1,169,53,117,191,121,233,132,359,132,359,121,233,134,274,132,359,134,274,184,379,184,379,134,274,154,312,46,133,43,248,37,192,117,191,120,32,123,141,398,135,399,31,404,191,58,-44,67,-35,72,11,72,11,67,-35,77,-27,72,11,77,-27,96,27,96,27,77,-27,89,-22,96,27,89,-22,100,-20,100,-20,113,-24,127,34,127,34,113,-24,121,-35,127,34,121,-35,126,-51,54,-9,42,-32,51,-56,54,-9,51,-56,58,-44,54,-9,58,-44,72,11,79,333,97,327,98,384,98,384,97,327,118,374,98,384,118,374,127,427,127,427,118,374,144,409,127,427,144,409,165,459,165,459,144,409,175,434,165,459,175,434,213,480,213,480,175,434,211,448,213,480,211,448,251,453,251,453,286,449,272,487,272,487,286,449,328,480,276,167,271,212,252,214,276,167,252,214,245,165,276,167,303,217,271,212,163,253,171,238,181,266,181,266,171,238,183,223,181,266,183,223,197,246,197,246,183,223,198,210,197,246,198,210,214,230,214,230,198,210,218,198,214,230,218,198,233,220,233,220,218,198,243,191,233,220,243,191,252,214,252,214,243,191,245,165,384,-19,376,-56,400, --108,400,-108,376,-56,361,-87,400,-108,361,-87,346,-133,346,-133,361,-87,336,-108,346,-133,336,-108,298,-115,298,-115,270,-112,280,-142,280,-142,270,-112,249,-141,249,-141,270,-112,249,-101,249,-141,249,-101,233,-85,249,-141,233,-85,222,-64,249,-141,222,-64,220,-136,222,-64,213,-40,220,-136,220,-136,213,-40,204,-19,220,-136,204,-19,194,-127,194,-127,204,-19,193,1,194,-127,193,1,178,18,347,414,366,380,378,462,378,462,366,380,373,333,380,206,373,333,368,292,328,480,286,449,320,437,328,480,320,437,347,414,328,480,347,414,378,462,380,206,413,231,419,432,419,432,413,231,436,262,419,432,436,262,446,389,446,389,436,262,451,298,446,389,451,298,455,336,378,462,373,333,380,206,378,462,380,206,419,432,366,111,384,173,342,141,342,141,384,173,339,186,342,141,339,186,331,233,331,233,339,186,339,188,331,233,339,188,353,258,353,258,339,188,380,206,353,258,380,206,368,292,473,30,467,79,465,-22,465,-22,467,79,449,119,465,-22,449,119,440,-70,440,-70,449,119,421,151,440,-70,421,151,400,-108,400,-108,421,151,386,20,384,173,366,111,381,70,384,173,381,70,386,20,384,173,386,20,421,151,312,161,342,141,331,233,312,161,331,233,303,217,312,161,303,217,276,167,298,-115,280,-142,346,-133,272,487,213,480,251,453,245,165,243,191,243,190,245,165,243,190,221,158,221,158,243,190,216,181,221,158,216,181,201,146,201,146,216,181,194,169,201,146,194,169,184,130,184,130,194,169,177,154,184,130,177,154,166,109,166,109,177,154,162,137,166,109,162,137,149,118,132,-70,145,-90,157,29,157,29,145,-90,168,-112,157,29,168,-112,178,18,178,18,168,-112,194,-127,127,34,126,-51,132,-70,127,34,132,-70,157,29,127,34,96,27,100,-20,384,-19,400,-108,386,20,213,-40,222,-64,212,-40,51,-56,42,-32,35,-51,98,279,102,324,90,288,90,288,102,324,77,291,64,288,77,291,76,320,64,288,76,320,55,308,55,308,39,291,44,244,55,308,44,244,46,256,55,308,46,256,49,269,55,308,49,269,55,280,55,308,55,280,64,288,28,269,23,244,44,244,28,269,44,244,39,291,106,0,193,0,106,240,106,253,106,240,133,321,106,253,133,321,103,267,103,267,133,321,102,324,103,267,102,324,98,279,102, -324,76,320,77,291,193,0,193,239,189,270,193,0,189,270,177,294,193,0,177,294,159,311,193,0,159,311,133,321,193,0,133,321,106,240,77,81,103,31,101,42,101,42,101,48,98,130,98,130,101,48,102,54,98,130,102,54,103,60,242,471,107,71,139,152,242,471,139,152,152,180,152,180,139,152,323,152,152,180,323,152,313,180,313,180,323,152,429,77,313,180,429,77,258,470,363,29,361,25,495,0,495,0,361,25,358,22,495,0,358,22,355,20,355,20,350,17,495,0,495,0,350,17,345,15,495,0,345,15,338,14,365,37,495,0,462,24,365,37,462,24,450,36,365,37,450,36,440,54,365,37,440,54,429,77,365,37,429,77,364,44,429,77,323,152,352,85,429,77,352,85,356,74,429,77,356,74,360,63,429,77,360,63,363,53,429,77,363,53,364,44,295,526,289,513,295,486,295,486,289,513,279,503,295,486,279,503,278,476,278,476,279,503,266,497,278,476,266,497,258,470,258,470,266,497,251,495,258,470,251,495,313,180,313,180,251,495,242,471,242,471,251,495,236,497,242,471,236,497,224,503,242,471,152,180,232,373,242,471,232,373,313,180,98,130,77,81,101,42,98,130,103,60,105,66,98,130,105,66,107,71,98,130,107,71,242,471,476,17,462,24,495,0,476,17,495,0,495,13,364,33,363,29,495,0,364,33,495,0,365,37,329,13,316,13,495,0,329,13,495,0,338,14,150,0,150,13,132,14,150,0,132,14,118,17,150,0,118,17,61,48,150,0,61,48,47,28,150,0,47,28,31,18,150,0,31,18,10,13,150,0,10,13,10,0,61,48,118,17,108,23,61,48,108,23,103,31,61,48,103,31,77,81,223,476,242,471,224,503,223,476,224,503,214,513,223,476,214,513,208,526,223,476,208,526,206,486,208,526,205,541,206,486,206,486,205,541,196,581,196,581,205,541,211,596,211,596,205,541,208,555,182,541,185,520,186,562,186,562,185,520,193,501,186,562,193,501,196,581,196,581,193,501,206,486,295,486,309,501,295,526,295,526,309,501,298,541,295,555,298,541,308,581,295,555,308,581,293,596,252,609,251,586,266,584,252,609,266,584,274,606,274,606,266,584,278,577,274,606,278,577,293,596,293,596,278,577,289,567,293,596,289, -567,295,555,318,561,308,581,309,501,318,561,309,501,318,519,318,561,318,519,321,540,298,541,309,501,308,581,214,567,224,577,230,606,230,606,224,577,237,584,230,606,237,584,252,609,252,609,237,584,251,586,211,596,208,555,214,567,211,596,214,567,230,606,495,0,316,13,316,0,245,95,254,93,247,111,247,111,254,93,252,111,266,113,252,111,254,93,266,113,254,93,263,93,309,302,285,335,288,192,288,192,285,335,274,367,268,225,274,367,248,399,268,225,248,399,244,257,244,257,248,399,225,365,244,257,225,365,224,291,224,291,225,365,216,331,275,377,278,386,280,431,280,431,278,386,284,397,280,431,284,397,314,460,314,460,284,397,291,407,314,460,291,407,302,419,302,419,314,406,314,460,314,460,314,406,327,397,314,460,327,397,346,487,346,487,327,397,342,391,346,487,342,391,358,388,280,431,248,399,274,367,280,431,274,367,275,377,450,465,440,457,444,426,444,426,440,457,430,452,444,426,430,452,425,407,425,407,430,452,420,449,425,407,420,449,410,448,410,448,399,450,402,392,402,392,399,450,387,455,402,392,387,455,377,387,377,387,387,455,375,462,377,387,375,462,361,473,361,473,346,487,358,388,361,473,358,388,377,387,460,446,473,463,461,474,460,446,461,474,450,465,460,446,450,465,444,426,410,448,402,392,425,407,309,302,297,152,326,112,309,302,326,112,339,268,339,268,326,112,351,133,339,268,351,133,363,230,363,230,351,133,367,159,363,230,367,159,373,188,297,152,296,98,326,112,296,98,297,152,294,137,296,98,294,137,288,126,296,98,288,126,278,117,296,98,278,117,266,113,296,98,266,113,263,93,266,441,277,454,268,462,266,441,268,462,258,469,266,441,258,469,258,445,231,451,240,450,245,474,245,474,240,450,249,448,245,474,249,448,258,469,258,469,249,448,258,445,119,327,131,373,142,464,142,464,131,373,152,413,142,464,152,413,210,480,210,480,152,413,182,441,210,480,182,441,220,452,220,452,231,451,229,478,229,478,231,451,245,474,247,111,242,112,245,95,245,95,242,112,236,114,245,95,236,114,235,97,235,97,236,114,230,116,235,97,230,116,225,100,225,100,230,116,224,119,225,100,224,119,216,104,113,41,115,280,92,423,113,41,92,423,68, -102,68,102,92,423,58,367,68,102,58,367,42,174,42,174,58,367,39,306,42,174,39,306,33,249,119,327,142,464,92,423,119,327,92,423,115,280,229,478,210,480,220,452,177,0,259,-16,221,59,221,59,259,-16,287,45,320,48,287,45,312,-9,320,48,312,-9,357,10,177,0,221,59,172,96,177,0,172,96,139,150,177,0,139,150,121,213,177,0,121,213,113,41,451,113,437,121,427,74,427,74,437,121,409,94,427,74,409,94,396,39,396,39,409,94,381,73,396,39,381,73,357,10,357,10,381,73,351,58,357,10,351,58,320,48,287,45,259,-16,312,-9,113,41,121,213,115,280,288,192,274,367,268,225,309,302,288,192,297,152,470,90,441,61,444,25,444,25,441,61,410,38,444,25,410,38,402,4,402,4,410,38,375,22,402,4,375,22,353,-7,353,-7,375,22,338,13,353,-7,338,13,297,-11,297,-11,338,13,297,10,470,90,444,25,483,53,470,90,483,53,520,90,297,10,256,13,297,-11,297,-11,256,13,220,22,297,-11,220,22,209,0,209,0,220,22,187,36,209,0,187,36,159,55,136,77,130,84,134,35,136,77,134,35,209,0,136,77,209,0,159,55,130,84,127,89,134,35,134,35,127,89,125,93,134,35,125,93,76,87,76,87,125,93,124,99,76,87,124,99,124,108,124,269,124,231,125,263,125,368,127,374,132,426,132,426,127,374,131,378,132,426,131,378,136,384,136,384,160,405,207,461,207,461,160,405,189,423,207,461,189,423,223,437,37,307,38,154,74,373,74,373,38,154,76,87,74,373,76,87,132,426,132,426,76,87,124,361,132,426,124,361,125,368,124,352,124,361,76,87,124,352,76,87,124,108,207,461,223,437,297,473,297,473,223,437,259,447,297,473,259,447,297,450,297,450,334,447,374,464,374,464,334,447,370,439,374,464,370,439,403,426,207,461,132,426,136,384,374,464,403,426,446,434,446,434,403,426,431,409,446,434,431,409,452,389,452,389,457,383,506,385,506,385,457,383,461,377,506,385,461,377,464,372,374,464,297,473,297,450,466,271,566,231,466,355,466,365,466,355,506,385,466,365,506,385,464,372,506,385,446,434,452,389,506,385,466,355,566,231,506,385,566,231,547,318,566,231,466,271,466,264,566,231,466,264,464,260,566, -231,464,260,461,257,566,231,461,257,456,255,566,231,456,255,450,255,566,231,450,255,138,255,566,231,138,255,124,231,124,231,138,255,133,255,124,231,133,255,129,256,124,231,129,256,126,259,124,231,126,259,125,263,38,154,37,307,24,231,323,463,263,463,323,0,323,0,263,463,263,245,323,0,263,245,263,193,263,193,263,245,55,245,263,193,55,245,55,193,263,52,9,52,16,0,263,52,16,0,323,0,263,52,323,0,263,193,93,28,75,22,95,0,95,0,75,22,57,18,95,0,57,18,42,17,58,355,69,450,66,462,66,462,67,464,58,355,58,355,67,464,52,474,58,355,52,474,49,365,49,365,52,474,46,466,49,365,46,466,41,377,41,377,46,466,40,455,41,377,40,455,36,390,36,390,40,455,35,444,36,390,35,444,32,403,32,403,35,444,32,431,32,403,32,431,30,417,67,467,67,469,52,474,52,474,67,469,68,472,52,474,68,472,70,474,93,28,95,0,106,38,106,38,95,0,128,3,106,38,128,3,112,52,112,52,128,3,113,204,113,204,116,298,104,72,104,72,116,298,94,282,104,72,94,282,87,90,87,90,94,282,73,262,87,90,73,262,67,109,67,109,73,262,57,239,67,109,57,239,49,138,49,138,57,239,46,213,49,138,46,213,42,181,117,235,121,250,116,298,116,298,121,250,127,265,116,298,127,265,134,280,134,280,347,84,320,205,320,205,347,84,345,185,320,205,345,185,356,347,356,347,345,185,379,327,356,347,379,327,363,436,356,347,363,436,355,444,116,298,134,280,320,205,116,298,320,205,111,403,116,298,111,403,98,415,116,298,98,415,86,427,116,298,86,427,76,439,116,298,76,439,69,450,116,298,69,450,58,355,340,362,356,347,344,467,344,467,344,468,328,378,328,378,344,468,328,474,328,378,328,474,323,466,344,470,344,471,328,474,328,474,344,471,345,473,328,474,345,473,345,474,344,467,328,378,340,362,320,394,328,378,323,466,320,394,323,466,319,456,320,394,319,456,316,447,320,394,316,447,315,410,314,437,313,427,315,410,314,437,315,410,316,447,391,313,397,307,407,394,407,394,397,307,403,301,407,394,403,301,407,295,407,295,409,290,422,377,422,377,409,290,411,285,422,377,411,285,412,281,434,278,438, -288,439,346,439,346,438,288,441,299,439,346,441,299,443,332,443,332,441,299,443,309,443,332,443,309,444,319,413,276,413,270,422,377,422,377,413,270,430,270,422,377,430,270,433,361,433,361,430,270,434,278,433,361,434,278,439,346,422,377,407,394,407,295,372,59,388,42,411,120,411,120,388,42,402,25,411,120,402,25,411,8,411,8,412,5,421,109,421,109,412,5,412,2,421,109,412,2,413,-1,430,-8,436,6,437,84,437,84,436,6,440,19,437,84,440,19,442,70,442,70,440,19,442,32,442,70,442,32,444,55,444,55,442,32,443,44,437,84,430,97,430,-8,430,-8,430,97,421,109,430,-8,421,109,413,-8,413,-8,421,109,413,-5,421,109,411,120,411,8,411,120,345,185,347,84,411,120,347,84,358,73,411,120,358,73,372,59,356,347,355,444,349,452,356,347,349,452,345,459,356,347,345,459,344,467,407,394,372,427,379,327,407,394,379,327,385,320,407,394,385,320,391,313,116,298,113,204,114,219,116,298,114,219,117,235,113,204,104,72,112,52,188,59,186,75,184,40,184,40,186,75,180,88,184,40,180,88,173,23,173,23,180,88,171,100,173,23,171,100,160,111,154,11,173,23,160,111,154,11,160,111,148,124,154,11,148,124,135,140,154,11,135,140,128,3,128,3,135,140,126,155,128,3,126,155,119,170,128,3,119,170,115,186,128,3,115,186,113,204,95,0,42,17,42,0,363,436,379,327,372,427,421,109,413,-1,413,-5,422,377,412,281,413,276,328,474,344,468,344,470,52,474,67,464,67,467,103,435,97,446,111,350,111,350,97,446,95,460,84,360,95,460,95,463,84,360,95,463,80,474,80,474,95,463,95,465,80,474,95,465,95,468,96,471,97,474,80,474,96,471,80,474,95,468,70,465,63,454,67,374,70,465,67,374,84,360,70,465,84,360,80,474,58,441,54,427,56,392,58,441,56,392,67,374,58,441,67,374,63,454,243,355,248,432,225,355,225,355,248,432,225,431,225,355,225,431,207,352,207,352,225,431,203,427,207,352,203,427,188,350,188,350,203,427,182,423,188,350,182,423,168,348,168,348,182,423,161,419,168,348,161,419,146,347,146,347,161,419,138,418,340,71,358,383,332,411,340,71,332,411,331,203,340,71,331,203,330, -176,340,71,330,176,328,146,340,71,328,146,347,3,374,342,358,383,361,157,374,342,361,157,370,203,374,342,370,203,376,247,374,342,376,247,379,288,358,383,340,71,350,112,358,383,350,112,361,157,388,84,380,79,385,29,388,84,385,29,396,50,388,84,396,50,401,76,370,75,358,73,368,13,370,75,368,13,385,29,370,75,385,29,380,79,348,71,340,71,347,3,348,71,347,3,368,13,348,71,368,13,358,73,108,0,121,0,126,69,126,69,121,0,321,0,126,69,321,0,152,71,152,71,321,0,316,71,321,91,316,71,321,0,321,91,321,0,325,117,325,117,321,0,347,3,325,117,347,3,328,146,102,62,79,48,79,-2,102,62,79,-2,94,0,102,62,94,0,108,0,102,62,108,0,126,69,40,-3,54,-12,58,27,58,27,54,-12,66,-6,58,27,66,-6,79,48,79,48,66,-6,79,-2,332,411,295,427,297,338,332,411,297,338,315,310,332,411,315,310,327,267,332,411,327,267,331,203,272,352,297,338,295,427,272,352,295,427,248,432,272,352,248,432,243,355,103,435,111,350,112,426,112,426,111,350,146,347,112,426,146,347,124,420,124,420,146,347,138,418,111,350,95,460,84,360,56,392,54,427,53,410,123,361,149,350,132,461,132,461,132,464,123,361,123,361,132,464,132,466,123,361,132,466,117,474,117,474,132,466,133,469,117,474,133,469,133,471,108,466,101,456,104,376,108,466,104,376,123,361,108,466,123,361,117,474,95,445,92,431,94,394,95,445,94,394,104,376,95,445,104,376,101,456,201,420,174,422,184,346,201,420,184,346,197,342,201,420,197,342,208,332,201,420,208,332,227,417,154,428,141,437,149,350,154,428,149,350,184,346,154,428,184,346,174,422,134,448,132,461,149,350,134,448,149,350,141,437,223,276,223,259,235,86,235,86,223,259,223,241,235,86,223,241,222,128,222,128,223,241,221,222,222,128,221,222,220,128,220,128,221,222,219,201,220,128,219,201,216,177,216,177,204,81,213,105,165,19,180,37,183,112,183,112,180,37,193,58,183,112,193,58,201,142,201,142,193,58,204,81,201,142,204,81,216,177,163,90,141,76,145,6,163,90,145,6,156,11,163,90,156,11,165,19,163,90,165,19,183,112,81,0,96,0,97,67,97, -67,96,0,109,0,97,67,109,0,118,70,118,70,109,0,122,1,118,70,122,1,141,76,141,76,122,1,134,2,141,76,134,2,145,6,258,391,246,407,248,205,248,205,252,57,256,174,256,174,252,57,270,35,256,174,270,35,275,143,275,143,270,35,284,15,275,143,284,15,297,114,297,114,284,15,289,-8,297,114,289,-8,306,-8,250,235,254,264,258,391,258,391,254,264,259,293,258,391,259,293,264,372,264,372,259,293,264,321,264,372,264,321,266,349,258,391,248,205,250,235,306,-8,312,0,316,85,316,85,312,0,317,11,316,85,317,11,324,55,324,55,317,11,321,23,324,55,321,23,323,37,235,86,252,57,248,205,235,86,248,205,246,407,235,86,246,407,227,417,235,86,227,417,223,276,216,177,213,105,220,128,208,332,216,317,227,417,227,417,216,317,222,297,227,417,222,297,223,276,28,-3,42,-12,43,23,43,23,42,-12,54,-6,43,23,54,-6,59,43,59,43,54,-6,67,-2,59,43,67,-2,78,58,78,58,67,-2,81,0,78,58,81,0,97,67,297,114,306,-8,316,85,94,394,92,431,91,413,117,474,133,471,134,474,76,355,88,351,77,460,77,460,77,463,66,360,66,360,77,463,78,465,66,360,78,465,63,474,63,474,78,465,78,468,63,474,78,468,79,471,80,474,63,474,79,471,77,460,66,360,76,355,66,360,63,474,55,368,55,368,63,474,54,465,55,368,54,465,47,377,47,377,54,465,46,454,47,377,46,454,41,387,41,387,46,454,41,441,41,387,41,441,38,398,38,398,41,441,38,427,38,398,38,427,37,410,254,355,259,432,234,355,234,355,259,432,233,431,234,355,233,431,210,352,210,352,233,431,204,427,210,352,204,427,185,350,185,350,204,427,175,423,185,350,175,423,159,348,159,348,175,423,147,419,159,348,147,419,134,347,134,347,147,419,121,418,134,347,121,418,117,347,117,347,121,418,107,420,117,347,107,420,102,349,102,349,107,420,95,426,102,349,95,426,88,351,88,351,95,426,86,435,88,351,86,435,79,446,311,184,305,219,313,37,313,37,305,219,302,263,297,16,302,263,290,328,297,16,290,328,278,0,278,0,290,328,273,302,278,0,273,302,257,272,344,392,335,408,336,346,344,392,336,346,340,353,344,392,340, -353,344,360,344,392,344,360,346,367,344,392,346,367,347,375,308,299,314,316,318,420,318,420,314,316,322,330,318,420,322,330,335,408,335,408,322,330,330,340,335,408,330,340,336,346,279,354,289,353,293,429,293,429,289,353,297,351,293,429,297,351,318,420,318,420,297,351,305,348,318,420,305,348,308,299,268,355,279,354,293,429,268,355,293,429,259,432,268,355,259,432,254,355,305,348,290,328,302,263,305,348,302,263,304,281,305,348,304,281,308,299,254,-12,278,0,257,272,254,-12,257,272,252,59,254,-12,252,59,251,48,254,-12,251,48,249,36,254,-12,249,36,247,23,254,-12,247,23,243,8,254,-12,243,8,239,-4,257,272,245,238,247,118,257,272,247,118,250,87,257,272,250,87,252,59,245,238,241,198,242,176,245,238,242,176,244,149,245,238,244,149,247,118,311,184,313,37,318,152,318,152,313,37,322,60,318,152,322,60,323,120,323,120,322,60,326,84,313,37,302,263,297,16,77,460,88,351,79,446,267,84,266,104,271,10,271,10,266,104,251,32,251,32,266,104,266,284,251,32,266,284,239,61,239,61,266,284,235,284,239,61,235,284,235,95,155,30,186,0,155,284,155,284,186,0,186,284,155,284,186,284,427,315,427,315,186,284,235,284,427,315,235,284,266,284,113,30,113,284,83,284,113,30,83,284,83,0,113,30,83,0,186,0,113,30,186,0,155,30,339,284,427,284,427,315,339,284,427,315,308,284,339,284,308,284,308,70,339,284,308,70,308,59,339,284,308,59,308,49,339,284,308,49,309,38,339,284,309,38,311,27,339,284,311,27,332,-8,339,284,332,-8,339,80,427,315,17,315,83,284,427,315,83,284,113,284,427,315,113,284,155,284,410,59,399,44,404,6,404,6,399,44,387,33,404,6,387,33,383,-2,383,-2,387,33,371,25,383,-2,371,25,359,-6,359,-6,371,25,348,23,422,21,439,44,452,64,422,21,452,64,422,76,422,21,422,76,410,59,422,21,410,59,404,6,344,32,341,44,332,-8,344,32,332,-8,359,-6,344,32,359,-6,348,23,341,44,340,56,332,-8,332,-8,340,56,339,69,332,-8,339,69,339,80,310,26,292,34,298,-3,310,26,298,-3,332,-8,310,26,332,-8,311,27,267,84,271,10,271,65,271,65,271,10,298, --3,271,65,298,-3,279,48,279,48,298,-3,292,34,308,70,308,284,308,80,83,284,17,315,17,284,427,315,266,284,308,284,210,-65,211,-82,230,-11,230,-11,211,-82,241,-145,230,-11,241,-145,239,-114,239,-114,241,-145,241,-115,250,-101,241,-115,241,-145,250,-101,241,-145,265,-128,241,-145,211,-82,211,-90,241,-145,211,-90,210,-98,241,-145,210,-98,209,-106,241,-145,209,-106,209,-151,185,-147,209,-151,191,-117,191,-117,209,-151,205,-121,208,-113,205,-121,209,-151,208,-113,209,-151,209,-106,185,-147,191,-117,180,-107,185,-147,180,-107,172,-93,185,-147,172,-93,167,-78,185,-147,167,-78,164,-134,172,48,160,27,166,-63,166,-63,160,27,164,-134,166,-63,164,-134,167,-78,158,250,133,281,139,225,139,225,133,281,105,311,139,225,105,311,104,313,200,60,158,128,172,48,172,48,175,-18,200,60,200,60,175,-18,182,-5,200,60,182,-5,190,8,190,8,191,8,200,60,200,60,191,8,198,-6,200,60,198,-6,203,-25,230,-11,200,60,203,-25,230,-11,203,-25,207,-45,230,-11,207,-45,210,-65,63,249,74,189,110,192,110,192,74,189,110,146,110,192,110,146,158,128,158,128,110,146,144,100,158,128,144,100,172,48,74,189,63,249,59,253,74,189,59,253,57,256,74,189,57,256,54,259,74,189,54,259,52,262,74,189,52,262,49,266,74,189,49,266,36,232,227,152,206,185,225,94,227,152,225,94,254,24,227,152,254,24,246,118,227,152,246,118,247,184,185,163,225,94,206,185,185,163,206,185,183,218,185,163,183,218,158,250,185,163,158,250,139,225,139,225,104,313,101,315,139,225,101,315,99,318,139,225,99,318,97,320,139,225,97,320,95,322,139,225,95,322,93,277,241,-84,230,-11,239,-114,241,-84,239,-114,240,-108,241,-84,240,-108,241,-102,241,-84,241,-102,241,-96,241,-84,241,-96,241,-90,335,312,312,281,332,253,335,312,332,253,355,286,335,312,355,286,337,314,355,286,368,304,342,321,355,286,342,321,341,319,355,286,341,319,340,317,355,286,340,317,338,315,355,286,338,315,337,314,247,184,246,118,266,153,247,184,266,153,268,217,268,217,266,153,287,187,268,217,287,187,290,249,290,249,287,187,309,221,290,249,309,221,312,281,312,281,309,221,332,253,295,-43,293,-10,292,-74,292,-74,293,-10,286,23,292, --74,286,23,282,-104,282,-104,286,23,275,56,282,-104,275,56,265,-128,265,-128,275,56,265,-43,265,-128,265,-43,264,-59,265,-128,264,-59,262,-74,261,88,246,118,254,24,261,88,254,24,265,-43,261,88,265,-43,275,56,257,-88,250,-101,265,-128,257,-88,265,-128,262,-74,172,48,166,-63,167,-47,172,48,167,-47,170,-33,172,48,170,-33,175,-18,137,-44,139,-93,142,-19,142,-19,139,-93,148,-115,142,-19,148,-115,150,4,150,4,148,-115,164,-134,150,4,164,-134,160,27,95,322,0,277,49,266,95,322,49,266,85,286,95,322,85,286,87,284,95,322,87,284,88,282,95,322,88,282,90,280,95,322,90,280,91,279,95,322,91,279,93,277,49,266,0,277,36,232,139,-93,137,-44,135,-68,397,433,397,463,165,433,165,433,397,463,134,433,165,433,134,433,165,0,165,0,134,433,134,30,165,0,134,30,80,30,134,433,397,463,80,433,80,433,397,463,49,463,80,433,49,463,80,30,80,30,49,463,49,0,80,30,49,0,165,0,454,463,49,463,80,433,454,463,80,433,134,433,454,463,134,433,165,433,454,463,165,433,338,433,454,463,338,433,368,433,454,463,368,433,423,433,454,463,423,433,454,0,368,30,368,433,338,433,368,30,338,433,338,0,368,30,338,0,454,0,368,30,454,0,423,30,165,0,165,433,134,433,165,0,134,433,134,30,165,0,134,30,80,30,165,0,80,30,49,0,49,463,49,0,80,30,49,463,80,30,80,433,423,30,454,0,423,433,537,534,43,534,91,494,537,534,91,494,191,494,537,534,191,494,236,494,537,534,236,494,537,494,241,177,43,-140,91,-140,91,-140,43,-140,617,-180,91,-140,617,-180,185,-140,185,-140,617,-180,232,-140,185,-140,232,-140,385,177,385,177,232,-140,431,177,385,177,431,177,236,494,241,177,91,-140,286,177,241,177,286,177,91,494,241,177,91,494,43,534,241,177,43,534,43,494,617,-180,43,-140,43,-180,232,-140,617,-180,617,-140,385,177,236,494,191,494,177,418,221,420,221,420,224,473,221,420,286,409,224,473,286,409,307,462,307,462,286,409,338,380,307,462,338,380,374,428,374,428,338,380,375,337,374,428,375,337,425,377,425,377,375,337,398,285,425,377,398,285,405,228,112,389,124,401,129,463,129,463,124,401,145,411,129,463,145, -411,170,471,170,471,145,411,177,418,170,471,177,418,224,473,224,473,177,418,221,420,112,389,129,463,109,377,109,377,129,463,97,451,109,377,97,451,109,266,109,266,97,451,71,437,109,266,71,437,48,422,405,228,398,173,423,87,423,87,398,173,376,123,423,87,376,123,371,35,371,35,376,123,340,82,371,35,340,82,305,2,305,2,340,82,290,54,305,2,290,54,226,-9,226,-9,290,54,226,44,468,230,457,310,456,153,456,153,457,310,425,377,456,153,425,377,423,87,423,87,425,377,405,228,70,140,84,37,93,101,93,101,84,37,116,15,93,101,116,15,122,74,122,74,116,15,151,0,122,74,151,0,154,56,154,56,151,0,189,-7,154,56,189,-7,189,47,189,47,189,-7,226,-9,189,47,226,-9,226,44,109,266,48,422,48,213,109,266,48,213,184,213,109,266,184,213,169,266,56,140,56,68,84,37,56,140,84,37,70,140,279,412,279,0,340,0,279,412,340,0,340,463,279,412,340,463,22,463,279,412,22,463,9,412,340,0,340,463,279,463,340,0,279,463,279,52,340,0,279,52,9,52,340,0,9,52,22,0,220,210,360,0,252,262,220,210,252,262,252,463,220,210,252,463,190,463,220,210,190,463,190,262,220,210,190,262,81,0,252,262,360,0,427,0,81,0,190,262,15,0,463,156,474,232,464,310,463,156,464,310,443,239,463,156,443,239,441,209,463,156,441,209,435,175,463,156,435,175,432,92,408,355,424,329,433,374,433,374,424,329,435,301,433,374,435,301,464,310,464,310,435,301,441,271,464,310,441,271,443,239,408,355,433,374,387,379,387,379,433,374,385,422,387,379,385,422,387,88,387,88,385,422,384,43,387,88,384,43,432,92,408,111,387,88,432,92,424,141,408,111,432,92,424,141,432,92,435,175,384,43,385,422,356,400,384,43,356,400,356,70,384,43,356,70,338,56,384,43,338,56,320,11,356,400,385,422,336,411,336,411,385,422,321,453,336,411,321,453,313,420,313,420,321,453,287,427,165,433,240,433,244,463,244,463,240,433,263,431,244,463,263,431,321,453,321,453,263,431,287,427,49,463,49,0,80,30,80,30,49,0,244,0,80,30,244,0,134,30,134,30,244,0,165,30,134,30,165,30,134,433,134,433,165,30,165, -433,134,433,165,433,244,463,244,463,49,463,80,433,244,463,80,433,134,433,320,11,338,56,314,45,320,11,314,45,288,37,320,11,288,37,262,32,320,11,262,32,244,0,239,30,165,30,244,0,239,30,244,0,262,32,80,433,49,463,80,30,259,209,259,209,259,280,259,280,259,209,291,30,259,280,291,30,259,478,259,478,291,30,291,448,259,478,291,448,363,478,363,478,291,448,333,448,363,478,333,448,363,0,363,0,333,448,333,30,363,0,333,30,291,30,259,109,255,83,259,34,259,109,259,34,291,30,259,109,291,30,259,209,259,34,259,0,363,0,259,34,363,0,291,30,259,209,259,280,255,234,255,234,259,280,243,298,255,234,243,298,242,257,242,257,243,298,225,310,242,257,225,310,222,275,222,275,225,310,206,317,222,275,206,317,199,287,199,287,206,317,185,321,199,287,185,321,173,291,150,289,157,290,165,322,165,322,157,290,165,291,165,322,165,291,185,321,185,321,165,291,173,291,116,3,135,34,117,313,117,313,135,34,135,280,117,313,135,280,165,322,165,322,135,280,142,285,165,322,142,285,150,289,164,-6,135,34,116,3,259,34,255,83,243,18,243,18,255,83,243,60,243,18,243,60,226,6,226,6,243,60,225,41,226,6,225,41,206,0,206,0,225,41,203,28,206,0,203,28,186,-5,186,-5,203,28,177,23,169,24,160,25,164,-6,169,24,164,-6,186,-5,169,24,186,-5,177,23,164,-6,160,25,151,27,164,-6,151,27,142,30,164,-6,142,30,135,34,116,3,117,313,105,268,116,3,105,268,105,49,116,3,105,49,88,67,116,3,88,67,79,29,105,268,117,313,87,252,87,252,117,313,79,288,87,252,79,288,75,231,75,231,79,288,68,207,53,251,63,159,64,183,53,251,64,183,79,288,79,288,64,183,68,207,79,29,88,67,76,88,79,29,76,88,68,111,79,29,68,111,64,136,79,29,64,136,53,67,31,159,37,112,37,207,37,207,37,112,53,67,37,207,53,67,53,251,53,251,53,67,64,136,53,251,64,136,63,159,287,245,296,228,305,270,305,270,296,228,302,211,305,270,302,211,304,193,334,139,304,193,304,170,334,139,304,170,262,170,207,289,215,286,235,316,235,316,215,286,224,283,235,316,224,283,231,278,231, -278,262,170,235,316,235,316,262,170,262,270,235,316,262,270,274,298,274,298,262,270,276,259,274,298,276,259,305,270,305,270,276,259,287,245,334,139,334,191,327,234,334,139,327,234,305,270,334,139,305,270,304,193,145,31,135,36,137,1,135,277,135,36,135,139,135,170,135,139,334,139,135,170,334,139,231,170,231,170,334,139,262,170,231,170,262,170,231,278,156,285,167,288,192,322,192,322,167,288,179,291,192,322,179,291,190,291,190,291,198,291,192,322,192,322,198,291,235,316,137,1,135,36,105,266,105,266,135,36,135,277,105,266,135,277,138,314,138,314,135,277,145,281,138,314,145,281,192,322,192,322,145,281,156,285,137,1,105,266,105,50,137,1,105,50,92,23,92,23,105,50,88,68,92,23,88,68,76,88,93,292,60,258,69,206,93,292,69,206,77,228,93,292,77,228,89,248,93,292,89,248,105,266,93,292,105,266,138,314,69,206,60,258,64,182,64,182,60,258,63,159,64,135,63,159,59,58,64,135,59,58,68,111,68,111,59,58,92,23,68,111,92,23,76,88,31,159,38,104,39,213,39,213,38,104,59,58,39,213,59,58,60,258,60,258,59,58,63,159,327,66,302,83,307,39,307,39,302,83,284,60,307,39,284,60,283,18,283,18,284,60,265,43,283,18,265,43,256,4,256,4,265,43,243,32,256,4,243,32,225,-3,225,-3,243,32,218,25,225,-3,218,25,192,-6,192,-6,218,25,189,23,192,-6,189,23,179,24,192,-6,179,24,167,25,192,-6,167,25,156,28,192,-6,156,28,145,31,192,-6,145,31,137,1,235,316,198,291,207,289,38,376,70,407,38,478,38,478,70,407,70,448,38,478,70,448,142,478,142,478,70,448,111,448,142,478,111,448,142,376,142,376,111,448,111,407,142,376,111,407,70,407,38,0,70,30,38,315,38,315,70,30,70,284,38,315,70,284,142,315,142,315,70,284,111,284,142,315,111,284,142,0,142,0,111,284,111,30,142,0,111,30,70,30,70,30,38,0,142,0,70,407,38,376,142,376,75,376,105,407,75,478,75,478,105,407,105,448,75,478,105,448,175,478,175,478,105,448,145,448,175,478,145,448,175,376,175,376,145,448,145,407,175,376,145,407,105,407,68,-116,62,-118,90,-145,90,-145,62, --118,55,-119,90,-145,55,-119,48,-151,48,-151,55,-119,48,-119,48,-151,48,-119,41,-119,41,-119,32,-119,36,-150,36,-150,32,-119,24,-149,32,-119,24,-118,24,-149,24,-149,24,-118,15,-116,24,-149,15,-116,13,-147,13,-147,15,-116,7,-113,13,-147,7,-113,1,-144,1,-144,7,-113,0,-110,1,-144,0,-110,-9,-140,175,315,75,315,105,284,175,315,105,284,145,284,175,315,145,284,152,-104,175,315,152,-104,169,-70,175,315,169,-70,175,-28,125,-129,105,-106,90,-145,90,-145,105,-106,105,284,90,-145,105,284,75,315,75,-113,68,-116,90,-145,75,-113,90,-145,75,315,41,-119,36,-150,48,-151,152,-104,145,284,145,-40,152,-104,145,-40,143,-56,152,-104,143,-56,138,-71,152,-104,138,-71,130,-85,152,-104,130,-85,125,-129,119,-97,105,-106,125,-129,119,-97,125,-129,130,-85,105,407,75,376,175,376,323,382,274,387,274,340,274,340,274,387,204,387,274,340,204,387,204,340,204,185,204,138,276,138,204,46,204,484,158,484,204,46,158,484,158,387,204,46,158,387,158,340,204,46,158,340,158,0,204,46,158,0,391,0,204,46,391,0,391,46,370,293,375,262,375,263,375,263,375,262,395,181,395,181,375,262,370,232,395,181,370,232,364,157,364,157,370,232,355,210,364,157,355,210,333,196,370,293,375,263,395,341,395,341,375,263,395,181,395,341,395,181,414,307,414,307,395,181,414,216,414,307,414,216,421,262,364,366,323,382,334,329,364,366,334,329,356,315,364,366,356,315,370,293,364,366,370,293,395,341,323,382,274,340,306,337,323,382,306,337,334,329,364,157,333,196,324,143,324,143,333,196,306,188,324,143,306,188,276,138,276,138,306,188,273,185,276,138,273,185,204,185,31,214,77,214,31,387,31,387,77,214,77,340,31,387,77,340,158,387,158,387,77,340,158,340,92,195,80,187,198,166,198,166,80,187,65,182,198,166,65,182,47,180,193,307,217,340,201,359,201,359,219,433,195,452,201,359,195,452,181,382,181,382,195,452,172,464,181,382,172,464,162,400,162,400,172,464,149,471,162,400,149,471,141,413,141,413,149,471,125,473,141,413,125,473,119,421,119,421,125,473,98,470,119,421,98,470,95,423,55,411,66,418,73,460,73,460,66,418,79,422,73,460,79,422,98,470,98,470,79,422,95, -423,20,394,30,387,34,422,34,422,30,387,43,401,34,422,43,401,52,444,52,444,43,401,55,411,52,444,55,411,73,460,92,195,198,166,102,207,102,207,198,166,112,222,102,207,112,222,113,222,130,251,113,222,154,202,130,251,154,202,152,213,152,213,162,303,146,277,219,433,217,340,239,314,219,433,239,314,245,409,245,409,239,314,258,288,245,409,258,288,262,391,262,391,258,288,276,260,262,391,276,260,285,363,285,363,276,260,292,230,285,363,292,230,306,335,306,335,292,230,309,195,306,335,309,195,326,303,320,173,309,195,288,156,155,233,162,254,162,303,162,303,162,254,175,279,162,303,175,279,180,330,180,330,175,279,193,307,180,330,193,307,201,359,146,277,130,251,152,213,198,180,180,183,198,166,198,166,180,183,167,188,198,166,167,188,113,222,113,222,167,188,158,194,113,222,158,194,154,202,435,401,437,469,416,420,416,420,437,469,395,473,416,420,395,473,392,432,392,432,395,473,364,436,346,434,364,436,363,471,346,434,363,471,333,464,275,434,262,391,286,409,275,434,286,409,304,452,304,452,286,409,307,421,304,452,307,421,333,464,333,464,307,421,327,430,333,464,327,430,346,434,348,71,360,10,368,224,368,224,360,10,383,32,368,224,383,32,379,200,368,224,379,200,400,247,400,247,379,200,405,216,347,91,348,71,368,224,347,91,368,224,346,267,347,91,346,267,345,110,326,303,320,173,331,149,326,303,331,149,346,267,346,267,331,149,340,129,346,267,340,129,345,110,400,132,396,152,398,61,400,132,398,61,403,96,400,132,403,96,402,114,389,174,379,200,383,32,389,174,383,32,398,61,389,174,398,61,396,152,266,-5,297,-8,275,16,275,16,297,-8,293,13,311,16,293,13,297,-8,311,16,297,-8,331,-3,267,174,236,153,241,98,267,174,241,98,250,119,267,174,250,119,265,138,267,174,265,138,288,156,267,174,288,156,309,195,239,5,238,75,236,153,239,5,236,153,219,23,219,23,236,153,215,131,219,23,215,131,205,47,205,47,215,131,204,106,205,47,204,106,201,77,238,75,241,98,236,153,326,24,331,-3,338,36,338,36,331,-3,360,10,338,36,360,10,345,52,345,52,360,10,348,71,510,335,510,406,497,302,497,302,510,406,494,435,497, -302,494,435,474,271,474,271,494,435,470,457,474,271,470,457,451,342,451,342,470,457,447,375,437,469,435,401,447,375,437,469,447,375,470,457,395,473,363,471,364,436,474,271,451,342,448,315,474,271,448,315,444,242,444,242,448,315,439,291,444,242,439,291,423,269,423,269,400,247,405,216,423,269,405,216,444,242,266,-5,275,16,260,25,266,-5,260,25,248,38,266,-5,248,38,241,55,266,-5,241,55,239,5,238,75,239,5,241,55,510,406,510,335,515,368,311,16,331,-3,326,24,326,303,309,195,320,173,245,409,262,391,275,434,198,166,47,180,47,166,112,222,198,166,113,222,219,433,201,359,217,340,162,303,152,213,155,233,396,28,390,30,420,0,420,0,390,30,383,32,420,0,383,32,377,-4,377,-4,383,32,376,36,377,-4,376,36,367,42,383,135,386,135,395,163,395,163,386,135,387,135,395,163,387,135,388,135,388,135,410,133,395,163,395,163,410,133,413,174,395,163,369,153,377,134,395,163,377,134,383,135,336,205,347,221,350,262,350,262,347,221,358,232,350,262,358,232,369,274,369,274,358,232,370,240,369,274,370,240,389,282,389,282,370,240,382,244,389,282,382,244,396,245,396,245,409,244,413,284,413,284,409,244,420,240,413,284,420,240,437,282,437,282,420,240,428,233,437,282,428,233,433,223,334,243,319,218,336,205,334,243,336,205,350,262,449,61,442,48,457,12,457,12,442,48,432,37,457,12,432,37,420,0,420,0,432,37,419,31,420,0,419,31,403,28,403,28,396,28,420,0,437,282,435,212,440,114,437,282,440,114,458,273,458,273,440,114,447,169,458,273,447,169,464,179,413,284,389,282,396,245,485,245,474,261,476,190,485,245,476,190,483,202,485,245,483,202,487,214,485,245,487,214,488,226,474,261,458,273,464,179,474,261,464,179,476,190,447,167,447,169,440,114,447,167,440,114,448,97,447,167,448,97,469,159,433,198,426,185,427,125,433,198,427,125,440,114,433,198,440,114,435,212,413,174,410,133,427,125,413,174,427,125,426,185,502,59,508,91,505,111,502,59,505,111,498,129,502,59,498,129,486,146,502,59,486,146,484,33,449,61,457,12,451,77,451,77,457,12,469,159,469,159,457,12,484,33,469,159,484,33,486,146,451,77,469, -159,448,97,360,47,353,51,356,-3,360,47,356,-3,377,-4,360,47,377,-4,367,42,356,-3,353,51,348,53,356,-3,348,53,344,55,356,-3,344,55,339,55,356,-3,339,55,338,2,331,55,324,52,325,10,331,55,325,10,338,2,331,55,338,2,339,55,318,48,315,42,316,21,318,48,316,21,325,10,318,48,325,10,324,52,384,473,66,-9,101,-9,384,473,101,-9,416,473,58,214,51,210,152,189,152,189,51,210,41,207,152,189,41,207,25,205,43,425,49,427,102,473,102,473,49,427,53,427,102,473,53,427,56,427,56,427,58,427,102,473,102,473,58,427,60,425,102,473,60,425,61,421,136,207,124,210,152,189,152,189,124,210,116,215,152,189,116,215,63,229,63,229,116,215,112,223,63,229,112,223,63,407,62,415,63,407,102,473,62,415,102,473,61,421,36,422,43,425,102,473,36,422,102,473,27,434,36,422,27,434,27,418,111,233,111,470,102,473,111,233,102,473,63,407,111,233,63,407,112,223,62,220,58,214,152,189,62,220,152,189,63,229,152,189,25,205,25,189,136,207,152,189,152,205,377,134,369,153,369,133,316,21,315,42,313,34,437,282,433,223,435,212,400,28,394,30,424,0,424,0,394,30,387,32,424,0,387,32,380,-4,380,-4,387,32,380,36,380,-4,380,36,372,42,387,135,390,135,399,163,399,163,390,135,392,135,399,163,392,135,393,135,393,135,414,133,399,163,399,163,414,133,418,174,399,163,373,153,382,134,399,163,382,134,387,135,340,205,351,221,354,262,354,262,351,221,362,232,354,262,362,232,373,274,373,274,362,232,374,240,373,274,374,240,393,282,393,282,374,240,386,244,393,282,386,244,401,245,401,245,414,244,417,284,417,284,414,244,425,240,417,284,425,240,442,282,442,282,425,240,433,233,442,282,433,233,438,223,338,243,323,218,340,205,338,243,340,205,354,262,453,61,446,48,460,12,460,12,446,48,436,37,460,12,436,37,424,0,424,0,436,37,423,31,424,0,423,31,407,28,407,28,400,28,424,0,442,282,440,212,444,114,442,282,444,114,462,273,462,273,444,114,451,169,462,273,451,169,468,179,417,284,393,282,401,245,489,245,479,261,480,190,489,245,480,190,488,202,489,245,488,202,492,214,489,245,492,214,493, -226,479,261,462,273,468,179,479,261,468,179,480,190,451,167,451,169,444,114,451,167,444,114,452,97,451,167,452,97,473,159,438,198,430,185,431,125,438,198,431,125,444,114,438,198,444,114,440,212,418,174,414,133,431,125,418,174,431,125,430,185,506,59,512,91,509,111,506,59,509,111,502,129,506,59,502,129,490,146,506,59,490,146,488,33,453,61,460,12,455,77,455,77,460,12,473,159,473,159,460,12,488,33,473,159,488,33,490,146,455,77,473,159,452,97,364,47,358,51,360,-3,364,47,360,-3,380,-4,364,47,380,-4,372,42,360,-3,358,51,352,53,360,-3,352,53,348,55,360,-3,348,55,343,55,360,-3,343,55,342,2,335,55,328,52,329,10,335,55,329,10,342,2,335,55,342,2,343,55,322,48,319,42,320,21,322,48,320,21,329,10,322,48,329,10,328,52,414,473,97,-9,131,-9,414,473,131,-9,446,473,134,344,121,324,143,291,143,291,121,324,104,303,143,291,104,303,84,281,84,281,13,205,84,234,84,234,13,205,189,189,84,234,189,189,163,234,174,235,163,234,189,189,174,235,189,189,183,237,183,237,189,189,190,240,27,380,38,398,38,444,38,444,38,398,50,412,38,444,50,412,58,461,58,461,50,412,64,423,58,461,64,423,83,470,83,470,64,423,79,429,83,470,79,429,95,431,95,431,112,429,115,473,115,473,112,429,126,423,115,473,126,423,145,470,145,470,126,423,137,413,145,470,137,413,143,398,23,421,10,390,27,380,23,421,27,380,38,444,142,362,143,291,145,379,145,379,167,316,170,459,170,459,167,316,184,338,170,459,184,338,188,443,188,443,184,338,195,358,188,443,195,358,199,422,199,422,195,358,201,377,199,422,201,377,203,397,145,470,143,398,145,379,145,470,145,379,170,459,115,473,83,470,95,431,84,281,84,234,143,291,216,248,204,253,197,245,216,248,197,245,190,240,216,248,190,240,189,189,189,189,13,205,13,189,134,344,143,291,142,362,145,379,143,291,167,316,382,134,373,153,373,133,320,21,319,42,317,34,442,282,438,223,440,212,488,291,484,287,501,283,501,283,484,287,480,284,501,283,480,284,477,238,477,238,480,284,477,281,477,238,477,281,476,235,476,235,477,281,474,233,472,280,466,280,468,230,472, -280,468,230,471,231,472,280,471,231,474,233,472,280,474,233,477,281,362,212,373,230,375,280,375,280,373,230,464,230,375,280,464,230,466,280,466,280,464,230,468,230,375,280,316,172,317,159,375,280,317,159,320,158,375,280,320,158,323,158,375,280,323,158,346,157,375,280,346,157,362,212,316,161,317,159,316,172,316,161,316,172,316,171,316,161,316,171,316,170,316,161,316,170,316,163,316,163,316,170,316,169,316,163,316,169,316,168,316,163,316,168,316,166,383,30,410,0,388,28,388,28,410,0,394,28,411,31,394,28,410,0,411,31,410,0,445,14,416,201,415,138,427,129,416,201,427,129,433,194,433,194,427,129,436,120,433,194,436,120,447,187,447,187,436,120,442,109,447,187,442,109,446,98,367,155,386,151,392,206,392,206,386,151,402,145,392,206,402,145,416,201,416,201,402,145,415,138,362,212,346,157,367,155,362,212,367,155,392,206,487,66,493,102,492,123,487,66,492,123,487,140,487,66,487,140,480,154,487,66,480,154,471,36,480,154,471,166,471,36,471,36,471,166,459,178,471,36,459,178,448,85,448,85,445,14,471,36,445,14,448,85,445,65,445,14,445,65,437,50,445,14,437,50,426,38,445,14,426,38,411,31,447,187,446,98,448,85,447,187,448,85,459,178,383,30,377,32,410,0,410,0,377,32,370,35,410,0,370,35,366,-4,366,-4,370,35,363,40,366,-4,363,40,354,46,347,50,341,53,343,-2,347,50,343,-2,366,-4,347,50,366,-4,354,46,341,53,335,54,343,-2,343,-2,335,54,328,54,343,-2,328,54,326,2,326,2,328,54,320,53,326,2,320,53,315,11,315,11,320,53,314,50,315,11,314,50,310,45,308,21,315,11,310,45,308,21,310,45,307,39,308,21,307,39,306,31,384,473,67,-9,102,-9,384,473,102,-9,416,473,59,214,52,210,152,189,152,189,52,210,41,207,152,189,41,207,26,205,44,425,49,427,102,473,102,473,49,427,54,427,102,473,54,427,57,427,57,427,59,427,102,473,102,473,59,427,61,425,102,473,61,425,62,421,136,207,125,210,152,189,152,189,125,210,117,215,152,189,117,215,63,229,63,229,117,215,113,223,63,229,113,223,63,407,63,415,63,407,102,473,63,415,102,473,62,421,37,422,44, -425,102,473,37,422,102,473,27,434,37,422,27,434,27,418,112,233,112,470,102,473,112,233,102,473,63,407,112,233,63,407,113,223,62,220,59,214,152,189,62,220,152,189,63,229,152,189,26,205,26,189,136,207,152,189,152,205,491,291,487,287,504,283,504,283,487,287,484,284,504,283,484,284,481,238,481,238,484,284,480,281,481,238,480,281,480,235,480,235,480,281,478,233,475,280,469,280,472,230,475,280,472,230,475,231,475,280,475,231,478,233,475,280,478,233,480,281,366,212,376,230,379,280,379,280,376,230,468,230,379,280,468,230,469,280,469,280,468,230,472,230,379,280,320,172,320,163,379,280,320,163,320,161,379,280,320,161,321,159,379,280,321,159,323,158,379,280,323,158,327,158,379,280,327,158,350,157,379,280,350,157,366,212,320,163,320,172,320,171,320,163,320,171,320,170,320,163,320,170,320,169,320,163,320,169,320,168,320,163,320,168,320,166,386,30,413,0,392,28,392,28,413,0,398,28,415,31,398,28,413,0,415,31,413,0,449,14,419,201,419,138,430,129,419,201,430,129,437,194,437,194,430,129,439,119,437,194,439,119,450,187,450,187,439,119,446,109,450,187,446,109,449,98,371,155,389,151,396,206,396,206,389,151,405,145,396,206,405,145,419,201,419,201,405,145,419,138,366,212,350,157,371,155,366,212,371,155,396,206,491,66,496,102,495,123,491,66,495,123,491,140,491,66,491,140,484,154,491,66,484,154,474,36,484,154,474,166,474,36,474,36,474,166,462,178,474,36,462,178,451,85,451,85,449,14,474,36,449,14,451,85,448,65,449,14,448,65,441,50,449,14,441,50,429,38,449,14,429,38,415,31,450,187,449,98,451,85,450,187,451,85,462,178,386,30,380,32,413,0,413,0,380,32,374,35,413,0,374,35,370,-4,370,-4,374,35,367,40,370,-4,367,40,358,46,350,50,344,53,346,-2,350,50,346,-2,370,-4,350,50,370,-4,358,46,344,53,338,54,346,-2,346,-2,338,54,332,54,346,-2,332,54,329,2,329,2,332,54,324,53,329,2,324,53,318,50,329,2,318,50,318,11,318,11,318,50,313,45,318,11,313,45,311,21,311,21,313,45,310,39,311,21,310,39,309,31,414,473,97,-9,131,-9,414,473,131,-9,446, -473,129,346,119,326,143,291,143,291,119,326,103,304,143,291,103,304,84,281,84,281,13,205,84,234,84,234,13,205,189,189,84,234,189,189,163,234,174,235,163,234,189,189,174,235,189,189,183,237,183,237,189,189,190,240,27,380,37,398,38,444,38,444,37,398,48,412,38,444,48,412,58,461,58,461,48,412,61,423,58,461,61,423,83,470,83,470,61,423,74,429,83,470,74,429,89,431,89,431,105,428,115,473,115,473,105,428,119,421,115,473,119,421,145,470,145,470,119,421,129,409,145,470,129,409,136,395,23,421,10,390,27,380,23,421,27,380,38,444,136,364,143,291,138,378,138,378,143,291,145,470,145,470,143,291,167,316,145,470,167,316,170,459,170,459,167,316,184,338,170,459,184,338,188,443,188,443,184,338,195,358,188,443,195,358,199,422,199,422,195,358,201,377,199,422,201,377,203,397,145,470,136,395,138,378,115,473,83,470,89,431,84,281,84,234,143,291,216,248,204,253,197,245,216,248,197,245,190,240,216,248,190,240,189,189,189,189,13,205,13,189,129,346,143,291,136,364,491,291,487,287,504,283,504,283,487,287,484,284,504,283,484,284,481,238,481,238,484,284,480,281,481,238,480,281,480,235,480,235,480,281,478,233,475,280,469,280,472,230,475,280,472,230,475,231,475,280,475,231,478,233,475,280,478,233,480,281,366,212,376,230,379,280,379,280,376,230,468,230,379,280,468,230,469,280,469,280,468,230,472,230,379,280,320,172,320,163,379,280,320,163,320,161,379,280,320,161,321,159,379,280,321,159,323,158,379,280,323,158,327,158,379,280,327,158,350,157,379,280,350,157,366,212,320,163,320,172,320,171,320,163,320,171,320,170,320,163,320,170,320,169,320,163,320,169,320,168,320,163,320,168,320,166,386,30,413,0,392,28,392,28,413,0,398,28,415,31,398,28,413,0,415,31,413,0,449,14,419,201,419,138,430,129,419,201,430,129,437,194,437,194,430,129,439,119,437,194,439,119,450,187,450,187,439,119,446,109,450,187,446,109,449,98,371,155,389,151,396,206,396,206,389,151,405,145,396,206,405,145,419,201,419,201,405,145,419,138,366,212,350,157,371,155,366,212,371,155,396,206,491,66,496,102,495,123,491,66,495,123,491,140,491, -66,491,140,484,154,491,66,484,154,474,36,484,154,474,166,474,36,474,36,474,166,462,178,474,36,462,178,451,85,451,85,449,14,474,36,449,14,451,85,448,65,449,14,448,65,441,50,449,14,441,50,429,38,449,14,429,38,415,31,450,187,449,98,451,85,450,187,451,85,462,178,386,30,380,32,413,0,413,0,380,32,374,35,413,0,374,35,370,-4,370,-4,374,35,367,40,370,-4,367,40,358,46,350,50,344,53,346,-2,350,50,346,-2,370,-4,350,50,370,-4,358,46,344,53,338,54,346,-2,346,-2,338,54,332,54,346,-2,332,54,329,2,329,2,332,54,324,53,329,2,324,53,318,50,329,2,318,50,318,11,318,11,318,50,313,45,318,11,313,45,311,21,311,21,313,45,310,39,311,21,310,39,309,31,414,473,97,-9,131,-9,414,473,131,-9,446,473,92,218,86,219,116,188,116,188,86,219,79,221,116,188,79,221,73,184,73,184,79,221,72,225,73,184,72,225,64,231,79,324,82,324,91,352,91,352,82,324,84,324,84,324,106,322,91,352,91,352,106,322,109,363,91,352,65,342,73,323,91,352,73,323,79,324,32,394,43,410,47,451,47,451,43,410,54,421,47,451,54,421,65,464,65,464,54,421,66,429,65,464,66,429,85,471,85,471,66,429,78,433,85,471,78,433,92,434,92,434,106,433,109,473,109,473,106,433,117,429,109,473,117,429,133,470,133,470,117,429,125,422,133,470,125,422,130,412,30,432,15,407,32,394,30,432,32,394,47,451,145,250,138,237,153,201,153,201,138,237,128,226,153,201,128,226,116,188,116,188,128,226,115,220,116,188,115,220,99,217,99,217,92,218,116,188,133,470,131,401,136,303,133,470,136,303,154,462,154,462,136,303,143,358,154,462,143,358,160,368,109,473,85,471,92,434,181,434,171,450,172,379,181,434,172,379,180,391,181,434,180,391,184,403,181,434,184,403,185,415,171,450,154,462,160,368,171,450,160,368,172,379,143,356,143,358,136,303,143,356,136,303,144,287,143,356,144,287,166,348,129,387,122,374,123,314,129,387,123,314,136,303,129,387,136,303,131,401,109,363,106,322,123,314,109,363,123,314,122,374,198,248,204,280,202,300,198,248,202,300,195,318,198,248,195,318,183,335,198,248,183, -335,180,222,145,250,153,201,147,266,147,266,153,201,166,348,166,348,153,201,180,222,166,348,180,222,183,335,147,266,166,348,144,287,56,236,50,240,52,185,56,236,52,185,73,184,56,236,73,184,64,231,52,185,50,240,45,242,52,185,45,242,40,244,52,185,40,244,35,245,52,185,35,245,35,191,27,244,20,241,21,199,27,244,21,199,35,191,27,244,35,191,35,245,14,237,11,231,12,210,14,237,12,210,21,199,14,237,21,199,20,241,73,323,65,342,65,322,12,210,11,231,9,223,133,470,130,412,131,401,491,291,487,287,504,283,504,283,487,287,484,284,504,283,484,284,481,238,481,238,484,284,480,281,481,238,480,281,480,235,480,235,480,281,478,233,475,280,469,280,472,230,475,280,472,230,475,231,475,280,475,231,478,233,475,280,478,233,480,281,366,212,376,230,379,280,379,280,376,230,468,230,379,280,468,230,469,280,469,280,468,230,472,230,379,280,320,172,320,163,379,280,320,163,320,161,379,280,320,161,321,159,379,280,321,159,323,158,379,280,323,158,327,158,379,280,327,158,350,157,379,280,350,157,366,212,320,163,320,172,320,171,320,163,320,171,320,170,320,163,320,170,320,169,320,163,320,169,320,168,320,163,320,168,320,166,386,30,413,0,392,28,392,28,413,0,398,28,415,31,398,28,413,0,415,31,413,0,449,14,419,201,419,138,430,129,419,201,430,129,437,194,437,194,430,129,439,119,437,194,439,119,450,187,450,187,439,119,446,109,450,187,446,109,449,98,371,155,389,151,396,206,396,206,389,151,405,145,396,206,405,145,419,201,419,201,405,145,419,138,366,212,350,157,371,155,366,212,371,155,396,206,491,66,496,102,495,123,491,66,495,123,491,140,491,66,491,140,484,154,491,66,484,154,474,36,484,154,474,166,474,36,474,36,474,166,462,178,474,36,462,178,451,85,451,85,449,14,474,36,449,14,451,85,448,65,449,14,448,65,441,50,449,14,441,50,429,38,449,14,429,38,415,31,450,187,449,98,451,85,450,187,451,85,462,178,386,30,380,32,413,0,413,0,380,32,374,35,413,0,374,35,370,-4,370,-4,374,35,367,40,370,-4,367,40,358,46,350,50,344,53,346,-2,350,50,346,-2,370,-4,350,50,370,-4,358, -46,344,53,338,54,346,-2,346,-2,338,54,332,54,346,-2,332,54,329,2,329,2,332,54,324,53,329,2,324,53,318,50,329,2,318,50,318,11,318,11,318,50,313,45,318,11,313,45,311,21,311,21,313,45,310,39,311,21,310,39,309,31,414,473,97,-9,131,-9,414,473,131,-9,446,473,10,252,136,252,10,287,10,287,136,252,41,293,10,287,41,293,152,473,152,473,41,293,136,418,152,473,136,418,185,190,185,190,136,418,136,293,185,190,136,293,136,252,136,252,136,293,41,293,152,473,185,190,185,473,185,293,185,252,223,252,185,293,223,252,223,293,185,190,136,252,136,190,459,267,494,274,494,274,459,267,494,274,491,291,459,267,491,291,431,283,459,267,431,283,424,255,357,173,369,209,376,260,376,260,369,209,393,236,376,260,393,236,431,283,431,283,393,236,424,255,357,173,376,260,333,223,357,173,333,223,351,114,357,173,351,114,353,129,357,173,353,129,359,142,357,173,359,142,366,177,333,223,304,173,310,41,333,223,310,41,332,14,333,223,332,14,361,-3,333,223,361,-3,353,87,333,223,353,87,351,114,409,188,398,187,412,156,412,156,398,187,393,161,380,159,393,161,386,184,380,159,386,184,376,181,368,152,380,159,376,181,368,152,376,181,366,177,368,152,366,177,359,142,398,187,386,184,393,161,439,44,430,33,432,-4,432,-4,430,33,417,25,432,-4,417,25,402,22,402,22,383,27,399,-9,399,-9,383,27,369,42,399,-9,369,42,361,-3,361,-3,369,42,359,62,361,-3,359,62,353,87,304,173,293,112,297,75,304,173,297,75,310,41,502,91,498,123,496,58,496,58,498,123,486,150,496,58,486,150,482,30,482,30,486,150,467,170,482,30,467,170,460,8,460,8,467,170,446,77,444,99,446,77,467,170,444,99,467,170,441,183,444,99,441,183,437,122,441,183,409,188,412,156,441,183,412,156,427,142,441,183,427,142,437,122,460,8,446,77,444,59,460,8,444,59,439,44,460,8,439,44,432,-4,402,22,399,-9,432,-4,384,473,67,-9,102,-9,384,473,102,-9,416,473,59,214,52,210,152,189,152,189,52,210,41,207,152,189,41,207,26,205,44,425,49,427,102,473,102,473,49,427,54,427,102,473,54,427,57,427,57,427,59,427,102,473,102, -473,59,427,61,425,102,473,61,425,62,421,136,207,125,210,152,189,152,189,125,210,117,215,152,189,117,215,63,229,63,229,117,215,113,223,63,229,113,223,63,407,63,415,63,407,102,473,63,415,102,473,62,421,37,422,44,425,102,473,37,422,102,473,27,434,37,422,27,434,27,418,112,233,112,470,102,473,112,233,102,473,63,407,112,233,63,407,113,223,62,220,59,214,152,189,62,220,152,189,63,229,152,189,26,205,26,189,136,207,152,189,152,205,462,266,497,273,497,273,462,266,497,273,495,291,462,266,495,291,434,282,462,266,434,282,427,254,360,171,373,208,380,259,380,259,373,208,396,235,380,259,396,235,434,282,434,282,396,235,427,254,360,171,380,259,336,221,360,171,336,221,354,110,360,171,354,110,356,125,360,171,356,125,362,139,360,171,362,139,369,175,336,221,307,172,314,40,336,221,314,40,335,14,336,221,335,14,365,-3,336,221,365,-3,356,83,336,221,356,83,354,110,413,187,402,186,415,155,415,155,402,186,396,160,383,157,396,160,390,183,383,157,390,183,379,180,371,150,383,157,379,180,371,150,379,180,369,175,371,150,369,175,362,139,402,186,390,183,396,160,442,44,433,32,435,-4,435,-4,433,32,421,24,435,-4,421,24,406,21,406,21,387,26,402,-9,402,-9,387,26,372,39,402,-9,372,39,365,-3,365,-3,372,39,362,59,365,-3,362,59,356,83,307,172,297,111,301,73,307,172,301,73,314,40,505,90,501,122,500,57,500,57,501,122,490,149,500,57,490,149,486,29,486,29,490,149,471,169,486,29,471,169,464,8,464,8,471,169,449,76,447,99,449,76,471,169,447,99,471,169,445,182,447,99,445,182,441,121,445,182,413,187,415,155,445,182,415,155,430,141,445,182,430,141,441,121,464,8,449,76,447,59,464,8,447,59,442,44,464,8,442,44,435,-4,406,21,402,-9,435,-4,414,473,97,-9,131,-9,414,473,131,-9,446,473,202,473,198,469,215,465,215,465,198,469,195,466,215,465,195,466,192,420,192,420,195,466,191,463,192,420,191,463,191,417,191,417,191,463,188,415,186,462,180,462,182,412,186,462,182,412,186,413,186,462,186,413,188,415,186,462,188,415,191,463,77,394,87,412,90,462,90,462,87,412,178,412,90,462,178, -412,180,462,180,462,178,412,182,412,90,462,30,353,31,345,90,462,31,345,31,343,90,462,31,343,32,341,90,462,32,341,34,340,90,462,34,340,37,340,90,462,37,340,61,339,90,462,61,339,77,394,31,345,30,353,30,352,31,345,30,352,30,351,31,345,30,351,30,350,31,345,30,350,30,348,97,212,124,181,103,210,103,210,124,181,109,210,126,213,109,210,124,181,126,213,124,181,159,196,130,383,130,320,141,311,130,383,141,311,147,376,147,376,141,311,150,301,147,376,150,301,161,369,161,369,150,301,157,291,161,369,157,291,160,280,82,337,100,333,107,388,107,388,100,333,116,327,107,388,116,327,130,383,130,383,116,327,130,320,77,394,61,339,82,337,77,394,82,337,107,388,202,248,207,284,206,305,202,248,206,305,201,322,202,248,201,322,195,336,202,248,195,336,185,218,195,336,185,348,185,218,185,218,185,348,173,360,185,218,173,360,162,267,162,267,159,196,185,218,159,196,162,267,159,247,159,196,159,247,152,232,159,196,152,232,140,220,159,196,140,220,126,213,161,369,160,280,162,267,161,369,162,267,173,360,97,212,91,214,124,181,124,181,91,214,85,217,124,181,85,217,80,177,80,177,85,217,77,222,80,177,77,222,68,228,61,232,55,235,57,179,61,232,57,179,80,177,61,232,80,177,68,228,55,235,49,236,57,179,57,179,49,236,43,236,57,179,43,236,40,184,40,184,43,236,35,235,40,184,35,235,29,232,40,184,29,232,29,193,29,193,29,232,24,227,29,193,24,227,22,203,22,203,24,227,21,221,22,203,21,221,20,213,385,39,375,47,378,-2,378,-2,375,47,368,59,378,-2,368,59,353,5,353,5,368,59,366,75,397,127,419,113,412,167,397,127,412,167,394,177,397,127,394,177,385,117,385,117,394,177,380,186,385,117,380,186,376,107,376,107,380,186,373,140,373,140,349,123,353,5,373,140,353,5,367,86,373,140,367,86,370,97,373,140,370,97,376,107,333,18,353,5,349,123,333,18,349,123,333,107,333,18,333,107,323,92,333,18,323,92,321,36,318,76,316,59,321,36,318,76,321,36,323,92,373,140,380,186,372,195,373,140,372,195,367,205,373,140,367,205,366,216,373,140,366,216,357,272,373,140,357,272,350, -157,337,258,324,238,326,185,337,258,326,185,335,172,337,258,335,172,350,157,337,258,350,157,357,272,324,238,320,215,321,199,324,238,321,199,326,185,438,155,444,191,437,155,437,155,444,191,436,182,437,155,436,182,432,104,432,104,436,182,425,175,432,104,425,175,419,113,419,113,425,175,413,167,419,113,413,167,412,167,412,167,413,167,394,177,440,281,413,284,419,245,419,245,413,284,405,247,392,246,405,247,413,284,392,246,413,284,383,281,449,200,459,167,451,211,451,211,459,167,462,273,462,273,459,167,475,179,462,273,475,179,480,260,480,260,475,179,486,192,480,260,486,192,491,244,491,244,486,192,493,207,491,244,493,207,495,225,419,245,431,241,440,281,440,281,431,241,441,233,440,281,441,233,462,273,462,273,441,233,448,223,462,273,448,223,451,211,444,191,438,155,459,167,444,191,459,167,449,200,505,69,503,88,501,43,501,43,503,88,496,105,501,43,496,105,488,23,488,23,496,105,484,121,488,23,484,121,468,7,468,7,484,121,464,138,468,7,464,138,458,64,458,64,456,53,468,7,468,7,456,53,450,44,468,7,450,44,441,-1,441,-1,450,44,441,37,441,-1,441,37,429,33,464,138,437,155,443,94,464,138,443,94,451,84,464,138,451,84,456,74,464,138,456,74,458,64,441,-1,429,33,415,32,415,32,399,34,409,-4,409,-4,399,34,385,39,409,-4,385,39,378,-2,415,32,409,-4,441,-1,383,281,357,272,367,227,383,281,367,227,372,236,383,281,372,236,381,242,383,281,381,242,392,246,366,216,367,227,357,272,384,473,67,-9,102,-9,384,473,102,-9,416,473,59,214,52,210,152,189,152,189,52,210,41,207,152,189,41,207,26,205,44,425,49,427,102,473,102,473,49,427,54,427,102,473,54,427,57,427,57,427,59,427,102,473,102,473,59,427,61,425,102,473,61,425,62,421,136,207,125,210,152,189,152,189,125,210,117,215,152,189,117,215,63,229,63,229,117,215,113,223,63,229,113,223,63,407,63,415,63,407,102,473,63,415,102,473,62,421,37,422,44,425,102,473,37,422,102,473,27,434,37,422,27,434,27,418,112,233,112,470,102,473,112,233,102,473,63,407,112,233,63,407,113,223,62,220,59,214,152,189,62,220,152,189,63,229,152, -189,26,205,26,189,136,207,152,189,152,205,437,155,432,104,443,94,367,86,353,5,366,75,388,39,378,47,382,-2,382,-2,378,47,371,59,382,-2,371,59,356,5,356,5,371,59,369,75,401,127,422,113,416,167,401,127,416,167,397,177,401,127,397,177,388,117,388,117,397,177,384,186,388,117,384,186,379,107,379,107,384,186,376,140,376,140,353,123,356,5,376,140,356,5,370,86,376,140,370,86,373,97,376,140,373,97,379,107,337,18,356,5,353,123,337,18,353,123,336,107,337,18,336,107,326,92,337,18,326,92,324,36,321,76,320,59,324,36,321,76,324,36,326,92,376,140,384,186,375,195,376,140,375,195,370,205,376,140,370,205,369,216,376,140,369,216,360,272,376,140,360,272,354,157,340,258,328,238,329,185,340,258,329,185,339,172,340,258,339,172,354,157,340,258,354,157,360,272,328,238,323,215,325,199,328,238,325,199,329,185,441,155,448,191,440,182,441,155,440,182,436,104,436,104,440,182,429,175,436,104,429,175,422,113,422,113,429,175,416,167,443,281,416,284,422,245,422,245,416,284,409,247,395,246,409,247,416,284,395,246,416,284,386,281,453,200,462,167,455,211,455,211,462,167,466,273,466,273,462,167,479,179,466,273,479,179,483,260,483,260,479,179,490,192,483,260,490,192,494,244,494,244,490,192,496,207,494,244,496,207,498,225,422,245,435,241,443,281,443,281,435,241,445,233,443,281,445,233,466,273,466,273,445,233,452,223,466,273,452,223,455,211,448,191,441,155,462,167,448,191,462,167,453,200,509,69,507,88,504,43,504,43,507,88,500,105,504,43,500,105,491,23,491,23,500,105,487,121,491,23,487,121,471,7,471,7,487,121,468,138,471,7,468,138,461,64,461,64,459,53,471,7,471,7,459,53,453,44,471,7,453,44,445,-1,445,-1,453,44,444,37,445,-1,444,37,432,33,468,138,441,155,446,94,468,138,446,94,454,84,468,138,454,84,459,74,468,138,459,74,461,64,445,-1,432,33,419,32,419,32,402,34,412,-4,412,-4,402,34,388,39,412,-4,388,39,382,-2,419,32,412,-4,445,-1,386,281,360,272,371,227,386,281,371,227,376,236,386,281,376,236,384,242,386,281,384,242,395,246,369,216,371,227,360,272,414,473,97, --9,131,-9,414,473,131,-9,446,473,92,218,86,219,116,188,116,188,86,219,79,221,116,188,79,221,73,184,73,184,79,221,72,225,73,184,72,225,64,231,79,324,82,324,91,352,91,352,82,324,84,324,84,324,106,322,91,352,91,352,106,322,109,363,91,352,65,342,73,323,91,352,73,323,79,324,32,394,43,410,47,451,47,451,43,410,54,421,47,451,54,421,65,464,65,464,54,421,66,429,65,464,66,429,85,471,85,471,66,429,78,433,85,471,78,433,92,434,92,434,106,433,109,473,109,473,106,433,117,429,109,473,117,429,133,470,133,470,117,429,125,422,133,470,125,422,130,412,30,432,15,407,32,394,30,432,32,394,47,451,145,250,138,237,153,201,153,201,138,237,128,226,153,201,128,226,116,188,116,188,128,226,115,220,116,188,115,220,99,217,99,217,92,218,116,188,133,470,131,401,136,303,133,470,136,303,154,462,154,462,136,303,143,358,154,462,143,358,160,368,109,473,85,471,92,434,181,434,171,450,172,379,181,434,172,379,180,391,181,434,180,391,184,403,181,434,184,403,185,415,171,450,154,462,160,368,171,450,160,368,172,379,143,356,143,358,136,303,143,356,136,303,144,287,143,356,144,287,166,348,129,387,122,374,123,314,129,387,123,314,136,303,129,387,136,303,131,401,109,363,106,322,123,314,109,363,123,314,122,374,198,248,204,280,202,300,198,248,202,300,195,318,198,248,195,318,183,335,198,248,183,335,180,222,145,250,153,201,147,266,147,266,153,201,166,348,166,348,153,201,180,222,166,348,180,222,183,335,147,266,166,348,144,287,56,236,50,240,52,185,56,236,52,185,73,184,56,236,73,184,64,231,52,185,50,240,45,242,52,185,45,242,40,244,52,185,40,244,35,245,52,185,35,245,35,191,27,244,20,241,21,199,27,244,21,199,35,191,27,244,35,191,35,245,14,237,11,231,12,210,14,237,12,210,21,199,14,237,21,199,20,241,73,323,65,342,65,322,12,210,11,231,9,223,133,470,130,412,131,401,441,155,436,104,446,94,370,86,356,5,369,75,388,39,378,47,382,-2,382,-2,378,47,371,59,382,-2,371,59,356,5,356,5,371,59,369,75,401,127,422,113,416,167,401,127,416,167,397,177,401,127,397,177,388, -117,388,117,397,177,384,186,388,117,384,186,379,107,379,107,384,186,376,140,376,140,353,123,356,5,376,140,356,5,370,86,376,140,370,86,373,97,376,140,373,97,379,107,337,18,356,5,353,123,337,18,353,123,336,107,337,18,336,107,326,92,337,18,326,92,324,36,321,76,320,59,324,36,321,76,324,36,326,92,376,140,384,186,375,195,376,140,375,195,370,205,376,140,370,205,369,216,376,140,369,216,360,272,376,140,360,272,354,157,340,258,328,238,329,185,340,258,329,185,339,172,340,258,339,172,354,157,340,258,354,157,360,272,328,238,323,215,325,199,328,238,325,199,329,185,441,155,448,191,440,182,441,155,440,182,436,104,436,104,440,182,429,175,436,104,429,175,422,113,422,113,429,175,416,167,443,281,416,284,422,245,422,245,416,284,409,247,395,246,409,247,416,284,395,246,416,284,386,281,453,200,462,167,455,211,455,211,462,167,466,273,466,273,462,167,479,179,466,273,479,179,483,260,483,260,479,179,490,192,483,260,490,192,494,244,494,244,490,192,496,207,494,244,496,207,498,225,422,245,435,241,443,281,443,281,435,241,445,233,443,281,445,233,466,273,466,273,445,233,452,223,466,273,452,223,455,211,448,191,441,155,462,167,448,191,462,167,453,200,509,69,507,88,504,43,504,43,507,88,500,105,504,43,500,105,491,23,491,23,500,105,487,121,491,23,487,121,471,7,471,7,487,121,468,138,471,7,468,138,461,64,461,64,459,53,471,7,471,7,459,53,453,44,471,7,453,44,445,-1,445,-1,453,44,444,37,445,-1,444,37,432,33,468,138,441,155,446,94,468,138,446,94,454,84,468,138,454,84,459,74,468,138,459,74,461,64,445,-1,432,33,419,32,419,32,402,34,412,-4,412,-4,402,34,388,39,412,-4,388,39,382,-2,419,32,412,-4,445,-1,386,281,360,272,371,227,386,281,371,227,376,236,386,281,376,236,384,242,386,281,384,242,395,246,369,216,371,227,360,272,414,473,97,-9,131,-9,414,473,131,-9,446,473,202,473,198,469,215,465,215,465,198,469,195,466,215,465,195,466,192,420,192,420,195,466,191,463,192,420,191,463,191,417,191,417,191,463,188,415,186,462,180,462,182,412,186,462,182,412,186,413,186,462,186,413,188,415,186, -462,188,415,191,463,77,394,87,412,90,462,90,462,87,412,178,412,90,462,178,412,180,462,180,462,178,412,182,412,90,462,30,353,31,345,90,462,31,345,31,343,90,462,31,343,32,341,90,462,32,341,34,340,90,462,34,340,37,340,90,462,37,340,61,339,90,462,61,339,77,394,31,345,30,353,30,352,31,345,30,352,30,351,31,345,30,351,30,350,31,345,30,350,30,348,97,212,124,181,103,210,103,210,124,181,109,210,126,213,109,210,124,181,126,213,124,181,159,196,130,383,130,320,141,311,130,383,141,311,147,376,147,376,141,311,150,301,147,376,150,301,161,369,161,369,150,301,157,291,161,369,157,291,160,280,82,337,100,333,107,388,107,388,100,333,116,327,107,388,116,327,130,383,130,383,116,327,130,320,77,394,61,339,82,337,77,394,82,337,107,388,202,248,207,284,206,305,202,248,206,305,201,322,202,248,201,322,195,336,202,248,195,336,185,218,195,336,185,348,185,218,185,218,185,348,173,360,185,218,173,360,162,267,162,267,159,196,185,218,159,196,162,267,159,247,159,196,159,247,152,232,159,196,152,232,140,220,159,196,140,220,126,213,161,369,160,280,162,267,161,369,162,267,173,360,97,212,91,214,124,181,124,181,91,214,85,217,124,181,85,217,80,177,80,177,85,217,77,222,80,177,77,222,68,228,61,232,55,235,57,179,61,232,57,179,80,177,61,232,80,177,68,228,55,235,49,236,57,179,57,179,49,236,43,236,57,179,43,236,40,184,40,184,43,236,35,235,40,184,35,235,29,232,40,184,29,232,29,193,29,193,29,232,24,227,29,193,24,227,22,203,22,203,24,227,21,221,22,203,21,221,20,213,441,155,436,104,446,94,370,86,356,5,369,75,388,39,378,47,382,-2,382,-2,378,47,371,59,382,-2,371,59,356,5,356,5,371,59,369,75,401,127,422,113,416,167,401,127,416,167,397,177,401,127,397,177,388,117,388,117,397,177,384,186,388,117,384,186,379,107,379,107,384,186,376,140,376,140,353,123,356,5,376,140,356,5,370,86,376,140,370,86,373,97,376,140,373,97,379,107,337,18,356,5,353,123,337,18,353,123,336,107,337,18,336,107,326,92,337,18,326,92,324,36,321,76,320,59,324,36,321,76,324, -36,326,92,376,140,384,186,375,195,376,140,375,195,370,205,376,140,370,205,369,216,376,140,369,216,360,272,376,140,360,272,354,157,340,258,328,238,329,185,340,258,329,185,339,172,340,258,339,172,354,157,340,258,354,157,360,272,328,238,323,215,325,199,328,238,325,199,329,185,441,155,448,191,440,182,441,155,440,182,436,104,436,104,440,182,429,175,436,104,429,175,422,113,422,113,429,175,416,167,443,281,416,284,422,245,422,245,416,284,409,247,395,246,409,247,416,284,395,246,416,284,386,281,453,200,462,167,455,211,455,211,462,167,466,273,466,273,462,167,479,179,466,273,479,179,483,260,483,260,479,179,490,192,483,260,490,192,494,244,494,244,490,192,496,207,494,244,496,207,498,225,422,245,435,241,443,281,443,281,435,241,445,233,443,281,445,233,466,273,466,273,445,233,452,223,466,273,452,223,455,211,448,191,441,155,462,167,448,191,462,167,453,200,509,69,507,88,504,43,504,43,507,88,500,105,504,43,500,105,491,23,491,23,500,105,487,121,491,23,487,121,471,7,471,7,487,121,468,138,471,7,468,138,461,64,461,64,459,53,471,7,471,7,459,53,453,44,471,7,453,44,445,-1,445,-1,453,44,444,37,445,-1,444,37,432,33,468,138,441,155,446,94,468,138,446,94,454,84,468,138,454,84,459,74,468,138,459,74,461,64,445,-1,432,33,419,32,419,32,402,34,412,-4,412,-4,402,34,388,39,412,-4,388,39,382,-2,419,32,412,-4,445,-1,386,281,360,272,371,227,386,281,371,227,376,236,386,281,376,236,384,242,386,281,384,242,395,246,369,216,371,227,360,272,388,473,70,-9,105,-9,388,473,105,-9,420,473,124,178,225,449,174,416,174,416,225,449,225,462,174,416,225,462,86,416,72,416,86,416,225,462,72,416,225,462,62,414,62,414,225,462,51,462,62,414,51,462,54,409,54,409,51,462,46,402,51,462,20,398,37,391,51,462,37,391,46,402,124,178,174,416,84,178,441,155,436,104,446,94,370,86,356,5,369,75,170,203,166,206,167,147,167,147,166,206,164,210,167,147,164,210,164,143,164,143,164,210,163,214,163,138,157,252,157,102,157,102,157,252,124,225,157,102,124,225,124,130,124,130,124,225,89,200,124,130,89,200,89, -154,89,154,89,200,50,180,89,154,50,180,50,173,216,314,188,283,197,260,216,314,197,260,209,274,216,314,209,274,220,287,216,314,220,287,230,301,188,283,157,252,165,222,188,283,165,222,167,226,188,283,167,226,169,230,188,283,169,230,173,234,188,283,173,234,185,247,188,283,185,247,197,260,164,218,165,222,157,252,164,218,157,252,163,214,196,96,184,109,187,72,187,72,184,109,172,121,187,72,172,121,168,125,181,200,175,201,176,153,181,200,176,153,180,154,181,200,180,154,600,154,181,200,600,154,600,200,171,150,176,153,175,201,171,150,175,201,170,203,171,150,170,203,167,147,216,41,230,54,220,68,216,41,220,68,208,82,216,41,208,82,196,96,216,41,196,96,187,72,163,135,163,138,157,102,163,135,157,102,164,132,164,132,157,102,187,72,164,132,187,72,166,128,166,128,187,72,168,125,164,143,163,214,163,138,163,214,157,252,163,138,127,344,130,347,131,389,131,389,130,347,133,349,131,389,133,349,155,425,155,425,133,349,136,350,155,425,136,350,140,351,140,351,144,350,155,425,155,425,144,350,148,346,155,425,148,346,152,342,155,337,155,333,155,425,155,425,155,333,175,463,175,463,155,333,202,-108,175,463,202,-108,182,463,182,463,202,-108,202,332,182,463,202,332,202,425,202,425,202,332,202,339,202,425,202,339,204,344,123,341,127,344,131,389,123,341,131,389,110,328,110,328,131,389,103,356,110,328,103,356,97,316,97,316,103,356,83,305,73,326,42,298,55,284,73,326,55,284,69,294,73,326,69,294,83,305,73,326,83,305,103,356,204,344,208,347,226,389,226,389,208,347,211,349,226,389,211,349,216,350,216,350,219,350,226,389,226,389,219,350,223,348,226,389,223,348,227,346,262,316,275,304,284,325,284,325,275,304,289,293,284,325,289,293,316,297,316,297,289,293,302,283,254,356,226,389,227,346,254,356,227,346,231,344,254,356,231,344,235,340,254,356,235,340,248,328,254,356,248,328,262,316,254,356,262,316,284,325,155,333,155,-108,202,-108,202,425,204,344,226,389,155,425,152,342,155,337,485,136,492,101,486,140,486,140,492,101,487,216,487,216,492,101,492,252,492,252,492,101,525,129,492,252,525,129,525,224,525,224,525,129,561,154,525, -224,561,154,561,200,561,200,561,154,599,173,561,200,599,173,599,180,492,252,462,282,464,245,492,252,464,245,477,233,492,252,477,233,480,229,492,252,480,229,483,226,492,252,483,226,485,222,492,252,485,222,486,219,492,252,486,219,487,216,420,300,429,286,434,313,434,313,429,286,440,272,434,313,440,272,462,282,462,282,440,272,452,258,462,282,452,258,464,245,49,200,468,154,468,200,473,201,468,200,475,153,473,201,475,153,478,203,478,203,475,153,480,151,478,203,480,151,482,207,482,207,480,151,483,148,482,207,483,148,485,211,485,211,483,148,485,144,485,211,485,144,486,140,451,94,461,71,463,107,463,107,461,71,492,101,463,107,492,101,476,120,476,120,492,101,479,124,492,101,485,136,484,132,492,101,484,132,482,128,492,101,482,128,479,124,439,81,429,67,433,40,439,81,433,40,461,71,439,81,461,71,451,94,487,216,485,211,486,140,468,154,49,200,49,154,468,200,468,154,475,153,433,40,429,67,419,53,153,11,150,7,156,-70,156,-70,150,7,146,5,156,-70,146,5,142,4,142,4,139,4,156,-70,156,-70,139,4,135,6,156,-70,135,6,132,-34,132,-34,135,6,131,8,132,-34,131,8,127,11,209,8,206,12,227,-34,227,-34,206,12,203,17,227,-34,203,17,202,-70,202,-70,203,17,202,22,202,22,202,463,183,-108,183,-108,202,463,176,-108,202,463,156,463,176,-108,176,-108,156,463,156,23,176,-108,156,23,156,-70,156,-70,156,23,155,16,156,-70,155,16,153,11,228,7,225,5,227,-34,227,-34,225,5,221,4,227,-34,221,4,218,3,218,3,214,4,227,-34,227,-34,214,4,209,8,261,38,247,26,254,-1,254,-1,247,26,235,13,254,-1,235,13,231,10,289,61,275,50,284,28,289,61,284,28,316,57,289,61,316,57,302,70,261,38,254,-1,284,28,261,38,284,28,275,50,228,7,227,-34,254,-1,228,7,254,-1,231,10,127,11,123,14,132,-34,132,-34,123,14,109,27,132,-34,109,27,104,-1,104,-1,109,27,96,39,104,-1,96,39,83,50,74,28,104,-1,83,50,74,28,83,50,69,61,74,28,69,61,55,71,74,28,55,71,42,57,202,-70,202,22,183,-108,146,203,143,206,144,147,144,147,143,206,141,210,144,147,141,210,140,143,140,143,141, -210,140,214,139,138,134,252,134,102,134,102,134,252,101,225,134,102,101,225,101,130,101,130,101,225,65,200,101,130,65,200,65,154,65,154,65,200,27,180,65,154,27,180,27,173,193,314,164,283,175,260,193,314,175,260,186,274,193,314,186,274,197,287,193,314,197,287,207,301,164,283,134,252,142,222,164,283,142,222,144,226,164,283,144,226,147,230,164,283,147,230,150,234,164,283,150,234,163,247,164,283,163,247,175,260,140,218,142,222,134,252,140,218,134,252,140,214,174,96,162,109,164,72,164,72,162,109,149,121,164,72,149,121,145,125,192,41,206,54,197,68,192,41,197,68,186,82,192,41,186,82,174,96,192,41,174,96,164,72,508,140,514,101,509,216,509,216,514,101,515,252,515,252,514,101,548,129,515,252,548,129,548,224,548,224,548,129,583,154,548,224,583,154,583,200,583,200,583,154,622,173,583,200,622,173,622,180,515,252,484,282,487,245,515,252,487,245,499,233,515,252,499,233,503,229,515,252,503,229,506,226,515,252,506,226,507,222,515,252,507,222,508,219,515,252,508,219,509,216,441,300,451,286,455,313,455,313,451,286,463,272,455,313,463,272,484,282,484,282,463,272,475,258,484,282,475,258,487,245,490,154,497,153,491,200,495,201,491,200,497,153,495,201,497,153,500,203,500,203,497,153,502,151,500,203,502,151,504,207,504,207,502,151,505,148,504,207,505,148,507,211,507,211,505,148,507,144,507,211,507,144,508,140,474,94,484,71,486,107,486,107,484,71,514,101,486,107,514,101,498,120,498,120,514,101,502,124,507,136,506,132,514,101,507,136,514,101,508,140,504,128,502,124,514,101,504,128,514,101,506,132,462,81,451,67,455,40,462,81,455,40,484,71,462,81,484,71,474,94,509,216,507,211,508,140,490,154,491,200,158,154,158,154,491,200,158,200,158,154,158,200,153,153,151,201,146,203,148,150,151,201,148,150,153,153,151,201,153,153,158,200,139,135,139,138,134,102,139,135,134,102,141,132,141,132,134,102,164,72,141,132,164,72,143,128,143,128,164,72,145,125,140,143,140,214,139,138,146,203,144,147,148,150,455,40,451,67,441,53,140,214,134,252,139,138,96,-7,104,-48,109,-19,109,-19,104,-48,132,-81,109,-19,132,-81,123, --32,123,-32,132,-81,127,-35,127,392,131,395,132,437,132,437,131,395,134,397,132,437,134,397,156,472,156,472,134,397,137,398,156,472,137,398,141,398,141,398,145,397,156,472,156,472,145,397,149,394,156,472,149,394,153,389,153,-35,150,-39,156,-117,156,-117,150,-39,146,-41,156,-117,146,-41,142,-42,142,-42,139,-42,156,-117,156,-117,139,-42,135,-40,156,-117,135,-40,132,-81,132,-81,135,-40,131,-38,132,-81,131,-38,127,-35,153,389,155,385,156,472,156,472,155,385,156,380,156,380,176,-156,176,511,176,511,176,-156,183,-156,176,511,183,-156,183,511,183,511,183,-156,202,-117,183,511,202,-117,202,380,202,380,202,-117,202,-24,123,388,127,392,132,437,123,388,132,437,111,376,111,376,132,437,104,404,111,376,104,404,98,364,98,364,104,404,84,352,74,373,43,345,56,331,74,373,56,331,70,341,74,373,70,341,84,352,74,373,84,352,104,404,205,391,208,395,227,437,227,437,208,395,212,397,227,437,212,397,216,398,216,398,220,397,227,437,227,437,220,397,224,396,227,437,224,396,228,394,262,363,275,352,284,373,284,373,275,352,289,341,284,373,289,341,316,345,316,345,289,341,302,330,254,404,227,437,228,394,254,404,228,394,232,391,254,404,232,391,236,388,254,404,236,388,249,375,254,404,249,375,262,363,254,404,262,363,284,373,203,472,183,511,202,380,203,472,202,380,203,386,203,472,203,386,205,391,203,472,205,391,227,437,228,-39,225,-41,226,-81,226,-81,225,-41,221,-42,226,-81,221,-42,218,-43,218,-43,214,-41,226,-81,226,-81,214,-41,209,-38,226,-81,209,-38,206,-34,260,-8,247,-20,254,-48,254,-48,247,-20,235,-33,254,-48,235,-33,231,-36,288,14,274,3,284,-17,288,14,284,-17,315,10,288,14,315,10,302,23,260,-8,254,-48,284,-17,260,-8,284,-17,274,3,228,-39,226,-81,254,-48,228,-39,254,-48,231,-36,203,-29,202,-24,202,-117,203,-29,202,-117,226,-81,203,-29,226,-81,206,-34,156,-23,155,-30,156,-117,156,-23,156,-117,176,-156,156,-23,176,-156,156,380,83,3,69,14,74,-17,83,3,74,-17,104,-48,83,3,104,-48,96,-7,55,24,42,10,74,-17,55,24,74,-17,69,14,153,-35,156,-117,155,-30,236,387,236,388,232,391,156,472,156,380,176,511,67,399,72,368,84,453,84, -453,72,368,74,337,84,453,74,337,75,306,75,306,75,294,91,246,91,246,75,294,74,282,91,246,74,282,74,270,84,453,54,463,60,429,84,453,60,429,67,399,107,356,109,357,114,446,114,446,109,357,111,357,114,446,111,357,113,357,113,357,111,357,112,357,113,357,112,357,116,357,113,357,116,357,114,446,114,446,116,357,145,441,114,446,84,453,99,344,114,446,99,344,100,348,114,446,100,348,102,351,114,446,102,351,105,354,114,446,105,354,106,355,114,446,106,355,107,356,91,246,95,263,99,340,99,340,95,263,97,281,99,340,97,281,98,334,98,334,97,281,98,299,98,334,98,299,98,317,84,453,75,306,91,246,84,453,91,246,99,340,84,453,99,340,99,344,73,258,72,247,91,246,73,258,91,246,74,270,145,441,128,352,154,395,145,441,154,395,154,398,154,398,154,400,145,441,145,441,154,400,155,402,145,441,155,402,156,404,145,441,116,357,119,356,145,441,119,356,123,355,145,441,123,355,126,354,145,441,126,354,128,352,145,441,156,404,175,438,175,438,156,404,157,405,175,438,157,405,158,407,158,407,161,409,175,438,175,438,161,409,164,411,175,438,164,411,169,413,206,438,178,414,197,414,206,438,197,414,215,415,206,438,206,437,175,438,206,438,175,438,178,414,231,438,233,416,243,439,243,439,233,416,250,418,243,439,250,418,255,440,255,440,250,418,266,420,255,440,266,420,266,441,218,438,206,437,206,438,218,438,206,438,215,415,218,438,215,415,233,416,218,438,233,416,231,438,173,414,178,414,175,438,173,414,175,438,169,413,599,-76,165,380,566,-108,566,-108,165,380,161,384,566,-108,161,384,128,352,128,352,161,384,158,388,128,352,158,388,156,392,60,429,54,463,49,459,128,352,156,392,154,395,381,441,381,441,393,440,393,440,381,441,398,418,393,440,398,418,405,439,405,439,398,418,415,416,405,439,415,416,417,438,417,438,415,416,433,415,417,438,433,415,429,438,429,438,433,415,441,438,473,438,441,438,451,414,473,438,451,414,470,414,525,355,528,356,534,446,534,446,528,356,532,357,534,446,532,357,535,357,535,357,537,357,565,453,565,453,537,357,539,357,565,453,539,357,541,356,494,400,495,398,504,441,504,441,495,398,520,352,504,441,520, -352,534,446,534,446,520,352,522,354,534,446,522,354,525,355,520,352,495,398,494,395,520,352,494,395,493,392,520,352,493,392,491,388,520,352,491,388,487,384,520,352,487,384,483,380,520,352,483,380,83,-108,575,270,574,282,565,453,565,453,574,282,574,294,565,453,574,294,573,306,573,306,574,337,565,453,565,453,574,337,577,368,565,453,577,368,581,399,565,453,581,399,595,463,595,463,581,399,589,429,595,463,589,429,599,459,553,263,556,246,565,453,565,453,556,246,576,247,565,453,576,247,575,270,575,270,576,247,575,258,565,453,541,356,543,355,565,453,543,355,544,354,565,453,544,354,546,351,565,453,546,351,548,348,565,453,548,348,549,344,565,453,549,344,549,340,565,453,549,340,549,334,565,453,549,334,549,317,565,453,549,317,550,299,565,453,550,299,551,281,565,453,551,281,553,263,565,453,534,446,535,357,504,441,473,438,475,414,504,441,475,414,479,413,504,441,479,413,484,411,504,441,484,411,487,409,504,441,487,409,490,407,504,441,490,407,491,405,504,441,491,405,493,404,504,441,493,404,494,402,504,441,494,402,494,400,470,414,475,414,473,438,441,438,433,415,451,414,83,-108,483,380,49,-76,398,418,381,441,381,420,470,-58,451,-59,473,-83,473,-83,451,-59,441,-83,429,-83,441,-83,433,-60,429,-83,433,-60,417,-83,417,-83,433,-60,415,-61,417,-83,415,-61,405,-83,405,-83,415,-61,398,-63,405,-83,398,-63,393,-84,393,-84,398,-63,381,-65,393,-84,381,-65,381,-85,451,-59,433,-60,441,-83,494,-47,493,-49,504,-86,504,-86,493,-49,491,-50,504,-86,491,-50,490,-51,520,2,83,463,483,-24,520,2,483,-24,487,-29,520,2,487,-29,491,-33,520,2,491,-33,493,-37,520,2,493,-37,494,-40,520,2,494,-40,495,-43,520,2,495,-43,504,-86,520,2,504,-86,534,-91,520,2,534,-91,522,1,541,-1,539,-2,565,-98,565,-98,539,-2,537,-2,565,-98,537,-2,535,-2,535,-2,532,-2,534,-91,534,-91,532,-2,528,-1,534,-91,528,-1,525,0,504,-86,495,-43,494,-45,504,-86,494,-45,494,-47,550,55,549,37,565,-98,565,-98,549,37,549,20,565,-98,549,20,549,14,581,-44,577,-13,565,-98,565,-98,577,-13,574,17,565,-98,574,17,573,48,573,48,574,60,565,-98,565,-98,574,60,574, -72,565,-98,574,72,575,84,576,107,556,108,565,-98,576,107,565,-98,575,84,576,107,575,84,575,96,565,-98,556,108,553,91,565,-98,553,91,551,73,565,-98,551,73,550,55,565,-98,549,14,549,10,565,-98,549,10,548,6,565,-98,548,6,546,3,565,-98,546,3,544,0,565,-98,544,0,543,0,565,-98,543,0,541,-1,535,-2,534,-91,565,-98,595,-108,599,-104,589,-74,595,-108,589,-74,581,-44,595,-108,581,-44,565,-98,504,-86,490,-51,487,-54,504,-86,487,-54,484,-56,504,-86,484,-56,479,-57,504,-86,479,-57,475,-58,504,-86,475,-58,473,-83,475,-58,470,-58,473,-83,483,-24,83,463,49,430,522,1,534,-91,525,0,109,-2,114,-91,111,-2,111,-2,114,-91,112,-2,111,-2,112,-2,113,-2,116,-2,113,-2,114,-91,116,-2,114,-91,145,-86,156,-49,155,-47,145,-86,145,-86,155,-47,154,-45,145,-86,154,-45,154,-43,154,-43,154,-40,145,-86,145,-86,154,-40,128,2,145,-86,128,2,126,1,161,-29,165,-24,566,463,161,-29,566,463,128,2,566,463,165,-24,599,430,128,2,154,-40,156,-37,128,2,156,-37,158,-33,128,2,158,-33,161,-29,145,-86,126,1,123,0,145,-86,123,0,119,-1,145,-86,119,-1,116,-2,206,-83,197,-59,178,-58,206,-83,178,-58,175,-83,206,-83,215,-59,197,-59,218,-83,231,-83,233,-61,233,-61,231,-83,243,-83,233,-61,243,-83,250,-63,250,-63,243,-83,255,-84,250,-63,255,-84,266,-65,266,-65,255,-84,266,-85,218,-83,233,-61,215,-59,218,-83,215,-59,206,-83,169,-57,164,-56,175,-83,175,-83,164,-56,161,-54,175,-83,161,-54,158,-51,173,-58,169,-57,175,-83,173,-58,175,-83,178,-58,175,-83,158,-51,157,-50,175,-83,157,-50,156,-49,175,-83,156,-49,145,-86,114,-91,109,-2,107,-1,114,-91,107,-1,106,0,114,-91,106,0,105,0,114,-91,105,0,102,3,114,-91,102,3,100,6,114,-91,100,6,99,10,114,-91,99,10,84,-98,99,14,98,20,97,73,99,14,97,73,95,91,99,14,95,91,91,108,99,14,91,108,84,-98,99,14,84,-98,99,10,98,55,97,73,98,20,98,55,98,20,98,37,84,-98,91,108,75,48,84,-98,75,48,74,17,84,-98,74,17,72,-13,84,-98,72,-13,67,-44,84,-98,67,-44,60,-74,84,-98,60,-74,54,-108,74,84,74,72,91,108,91, -108,74,72,75,60,91,108,75,60,75,48,91,108,72,107,73,96,91,108,73,96,74,84,60,-74,49,-104,54,-108,112,-2,114,-91,113,-2,162,203,158,206,159,147,159,147,158,206,156,210,159,147,156,210,156,143,156,143,156,210,155,214,155,138,149,253,149,102,149,102,149,253,117,225,149,102,117,225,116,130,116,130,117,225,81,200,116,130,81,200,81,154,81,154,81,200,42,180,81,154,42,180,42,173,209,315,180,283,190,260,209,315,190,260,201,274,209,315,201,274,212,288,209,315,212,288,223,302,180,283,149,253,157,222,180,283,157,222,159,226,180,283,159,226,161,230,180,283,161,230,165,234,180,283,165,234,177,247,180,283,177,247,190,260,156,218,157,222,149,253,156,218,149,253,155,214,189,96,177,109,180,72,180,72,177,109,165,121,180,72,165,121,161,125,173,200,168,153,173,154,173,200,173,154,353,154,173,200,353,154,380,200,380,200,353,154,394,154,380,200,394,154,448,315,448,315,394,154,420,200,448,315,420,200,488,315,167,201,162,203,163,150,167,201,163,150,168,153,167,201,168,153,173,200,353,154,286,41,327,41,353,154,327,41,394,154,420,200,394,154,606,154,420,200,606,154,606,200,208,41,222,54,212,68,208,41,212,68,201,82,208,41,201,82,189,96,208,41,189,96,180,72,155,135,155,138,149,102,155,135,149,102,156,132,156,132,149,102,180,72,156,132,180,72,158,128,158,128,180,72,161,125,156,143,155,214,155,138,162,203,159,147,163,150,155,214,149,253,155,138,492,132,490,128,499,102,499,102,490,128,487,125,499,102,487,125,484,121,484,121,471,109,499,102,499,102,471,109,469,72,499,253,468,283,470,247,499,253,470,247,483,234,499,253,483,234,486,230,499,253,486,230,489,226,499,253,489,226,491,221,499,253,491,221,493,218,499,253,493,218,493,214,499,253,493,214,494,138,499,253,494,138,499,102,499,253,499,102,532,225,426,302,436,288,440,315,440,315,436,288,447,274,440,315,447,274,468,283,468,283,447,274,458,260,468,283,458,260,470,247,606,173,606,180,568,154,568,154,606,180,568,200,568,154,568,200,532,130,532,130,568,200,532,225,532,130,532,225,499,102,499,102,494,138,493,135,499,102,493,135,492,132,471,109,459, -96,469,72,469,72,459,96,447,82,469,72,447,82,441,41,441,41,447,82,436,68,441,41,436,68,427,54,494,138,493,214,492,143,492,143,493,214,492,210,492,143,492,210,490,206,475,154,480,153,481,201,481,201,480,153,485,150,481,201,485,150,487,203,487,203,485,150,489,147,487,203,489,147,490,206,490,206,489,147,492,143,475,154,481,201,474,200,475,154,474,200,290,200,475,154,290,200,263,154,263,154,290,200,316,315,263,154,316,315,249,200,222,154,155,41,196,41,222,154,196,41,263,154,222,154,263,154,249,200,222,154,249,200,42,200,222,154,42,200,42,154,316,315,290,200,357,315,107,71,121,147,120,165,120,165,121,171,118,271,118,271,121,171,133,270,161,271,133,270,134,180,161,271,134,180,135,180,122,175,123,179,133,270,133,270,123,179,126,181,133,270,126,181,129,181,129,181,130,181,133,270,133,270,130,181,131,181,133,270,131,181,133,181,118,271,101,273,102,113,118,271,102,113,107,71,118,271,107,71,120,165,181,204,165,219,168,161,168,161,165,219,159,234,147,173,159,234,161,271,147,173,161,271,135,180,226,255,243,259,244,282,244,282,243,259,259,264,244,282,259,264,271,288,271,288,259,264,275,269,216,277,189,273,192,248,216,277,192,248,210,251,216,277,210,251,226,255,216,277,226,255,244,282,461,178,480,177,486,223,461,178,486,223,455,225,461,178,455,225,427,173,427,173,455,225,417,220,427,173,417,220,395,162,395,162,417,220,383,208,395,162,383,208,362,148,362,148,383,208,350,194,362,148,350,194,323,136,323,136,350,194,314,182,323,136,314,182,276,131,276,131,314,182,274,177,486,223,502,172,515,217,515,217,502,172,525,164,515,217,525,164,543,206,543,206,525,164,549,151,543,206,549,151,571,189,571,189,549,151,573,131,571,189,573,131,599,166,181,204,196,147,207,191,207,191,196,147,233,136,207,191,233,136,238,181,238,181,233,136,276,131,238,181,276,131,274,177,167,242,175,245,189,273,189,273,175,245,184,247,189,273,184,247,192,248,161,271,159,234,161,239,161,271,161,239,167,242,161,271,167,242,189,273,133,270,133,181,134,180,126,74,125,94,124,112,126,74,124,112,122,130,126,74,122,130,121,147,126,74,121,147,107, -71,69,237,84,197,85,275,85,275,84,197,95,155,85,275,95,155,101,273,101,273,95,155,102,113,68,278,53,281,69,237,68,278,69,237,85,275,69,237,53,281,49,275,168,161,159,234,147,173,181,204,168,161,196,147,486,223,480,177,502,172,133,270,121,171,122,175,168,177,187,178,188,178,194,225,188,178,221,173,194,225,221,173,231,220,231,220,221,173,253,162,231,220,253,162,265,208,265,208,253,162,287,148,265,208,287,148,298,194,298,194,287,148,325,136,298,194,325,136,333,182,333,182,325,136,373,131,333,182,373,131,373,177,373,177,373,131,415,136,373,177,415,136,409,181,409,181,415,136,441,191,441,191,415,136,452,147,441,191,452,147,466,204,466,204,452,147,480,161,466,204,480,161,483,219,483,219,480,161,501,173,483,219,501,173,489,234,489,234,501,173,515,270,515,270,501,173,513,180,515,270,513,180,514,180,487,239,489,234,515,270,487,239,515,270,487,271,487,239,487,271,481,242,530,271,515,270,515,181,530,271,515,181,517,181,439,251,456,248,459,273,459,273,456,248,464,247,459,273,464,247,487,271,487,271,464,247,473,245,487,271,473,245,481,242,432,277,405,282,406,259,432,277,406,259,422,255,432,277,422,255,439,251,432,277,439,251,459,273,405,282,377,288,390,264,405,282,390,264,406,259,525,179,530,271,523,181,523,181,530,271,520,181,518,181,520,181,530,271,518,181,530,271,517,181,526,130,541,71,527,147,527,147,541,71,528,165,530,271,528,165,541,71,530,271,541,71,547,273,547,273,541,71,546,113,547,273,546,113,554,155,530,271,525,179,527,175,530,271,527,175,528,171,530,271,528,171,528,165,580,278,564,275,564,197,580,278,564,197,579,237,580,278,579,237,599,275,580,278,599,275,595,281,564,275,547,273,554,155,564,275,554,155,564,197,541,71,526,130,524,112,541,71,524,112,523,94,541,71,523,94,522,74,515,270,514,180,515,181,49,166,76,131,78,189,78,189,76,131,99,151,78,189,99,151,105,206,105,206,99,151,123,164,105,206,123,164,133,217,133,217,123,164,146,172,133,217,146,172,162,223,162,223,146,172,168,177,162,223,168,177,194,225,194,225,168,177,188,178,390,264,377,288,373,269,221,173,188,178,187,178,169, -203,165,206,166,147,166,147,165,206,163,210,166,147,163,210,163,143,163,143,163,210,163,214,162,138,156,252,156,102,156,102,156,252,124,225,156,102,124,225,123,130,123,130,124,225,88,200,123,130,88,200,88,154,88,154,88,200,49,180,88,154,49,180,49,173,216,314,187,283,197,260,216,314,197,260,208,274,216,314,208,274,219,287,216,314,219,287,230,301,187,283,156,252,164,222,187,283,164,222,166,226,187,283,166,226,169,230,187,283,169,230,172,234,187,283,172,234,184,247,187,283,184,247,197,260,163,218,164,222,156,252,163,218,156,252,163,214,196,96,184,109,187,72,187,72,184,109,172,121,187,72,172,121,168,125,215,41,229,54,219,68,215,41,219,68,208,82,215,41,208,82,196,96,215,41,196,96,187,72,307,218,314,264,288,113,288,113,314,264,288,241,288,113,288,241,261,135,261,135,288,241,261,220,261,135,261,220,233,154,233,154,261,220,232,200,310,128,308,132,314,90,314,90,308,132,307,135,314,90,307,135,288,113,288,113,307,135,306,138,307,214,308,143,308,210,308,210,308,143,311,147,308,210,311,147,310,206,310,206,311,147,314,203,360,314,338,289,342,260,360,314,342,260,353,274,360,314,353,274,364,287,360,314,364,287,374,301,338,289,314,264,314,230,338,289,314,230,317,234,338,289,317,234,330,247,338,289,330,247,342,260,314,264,307,218,309,222,314,264,309,222,311,226,314,264,311,226,314,230,307,214,307,218,288,113,307,214,288,113,306,138,326,200,319,201,320,153,326,200,320,153,325,154,326,200,325,154,599,154,326,200,599,154,599,200,315,150,320,153,319,201,315,150,319,201,314,203,315,150,314,203,311,147,360,41,373,54,364,68,360,41,364,68,353,82,360,41,353,82,341,96,360,41,341,96,338,66,341,96,329,109,338,66,338,66,329,109,316,121,338,66,316,121,314,90,314,90,316,121,313,125,314,90,313,125,310,128,180,200,174,201,175,153,180,200,175,153,180,154,180,200,180,154,233,154,180,200,233,154,232,200,170,150,175,153,174,201,170,150,174,201,169,203,170,150,169,203,166,147,162,135,162,138,156,102,162,135,156,102,163,132,163,132,156,102,187,72,163,132,187,72,165,128,165,128,187,72,168,125,163,143,163, -214,162,138,308,143,307,214,306,138,163,214,156,252,162,138,130,202,133,204,136,251,136,251,133,204,136,205,136,251,136,205,140,205,140,205,144,204,155,280,155,280,144,204,148,201,155,280,148,201,152,197,97,171,110,184,115,224,115,224,110,184,123,196,115,224,123,196,136,251,136,251,123,196,127,200,136,251,127,200,130,202,92,199,67,175,69,148,92,199,69,148,83,160,92,199,83,160,97,171,92,199,97,171,115,224,67,175,42,152,55,138,67,175,55,138,69,148,127,344,130,347,131,389,131,389,130,347,133,349,131,389,133,349,155,425,155,425,133,349,136,350,155,425,136,350,140,351,140,351,144,350,155,425,155,425,144,350,148,346,155,425,148,346,152,342,175,463,155,425,155,333,202,-107,155,333,155,280,202,-107,155,280,155,188,155,188,155,187,202,-107,202,-107,155,187,155,-107,155,280,152,197,155,192,155,280,155,192,155,187,155,280,136,251,140,205,155,425,152,342,155,337,155,425,155,337,155,333,123,341,127,344,131,389,123,341,131,389,110,328,110,328,131,389,103,356,110,328,103,356,97,316,97,316,103,356,83,305,73,326,42,298,55,284,73,326,55,284,69,294,73,326,69,294,83,305,73,326,83,305,103,356,182,463,202,-107,202,280,202,280,202,193,221,251,221,251,202,193,204,199,221,251,204,199,208,202,204,344,208,347,226,389,226,389,208,347,211,349,226,389,211,349,216,350,216,350,219,350,226,389,226,389,219,350,223,348,226,389,223,348,227,346,221,251,211,205,216,205,216,205,219,205,221,251,221,251,219,205,223,204,221,251,223,204,242,224,242,224,223,204,227,202,242,224,227,202,231,199,262,171,266,199,248,183,248,183,266,199,242,224,248,183,242,224,235,195,235,195,242,224,231,199,262,316,275,304,284,325,284,325,275,304,289,293,284,325,289,293,316,297,316,297,289,293,302,283,254,356,226,389,227,346,254,356,227,346,231,344,254,356,231,344,235,340,254,356,235,340,248,328,254,356,248,328,262,316,254,356,262,316,284,325,202,425,182,463,202,332,202,425,202,332,202,339,202,425,202,339,204,344,202,425,204,344,226,389,202,332,182,463,202,280,290,175,266,199,275,159,290,175,275,159,289,148,290,175,289,148,302,138,290,175,302,138,316, -152,202,280,202,187,202,193,175,463,155,333,202,-107,175,463,202,-107,182,463,221,251,208,202,211,205,266,199,262,171,275,159,311,66,335,90,320,109,320,109,335,90,332,121,336,125,332,121,335,90,336,125,335,90,360,113,416,200,415,154,468,154,416,200,468,154,468,200,475,201,468,200,473,153,475,201,473,153,478,150,415,154,387,220,387,135,387,135,387,220,360,241,387,135,360,241,360,113,360,113,360,241,341,138,337,226,339,221,360,241,360,241,339,221,340,218,360,241,340,218,341,214,341,214,341,138,360,241,335,230,337,226,360,241,335,230,360,241,335,264,335,230,335,264,331,234,485,132,483,128,492,102,492,102,483,128,480,125,492,102,480,125,477,121,477,121,464,109,492,102,492,102,464,109,462,72,492,252,461,283,463,247,492,252,463,247,476,234,492,252,476,234,479,230,492,252,479,230,482,226,492,252,482,226,484,221,492,252,484,221,485,218,492,252,485,218,486,214,492,252,486,214,487,138,492,252,487,138,492,102,492,252,492,102,525,225,419,301,429,287,433,314,433,314,429,287,440,274,433,314,440,274,461,283,461,283,440,274,451,260,461,283,451,260,463,247,599,173,599,180,561,154,561,154,599,180,561,200,561,154,561,200,525,130,525,130,561,200,525,225,525,130,525,225,492,102,492,102,487,138,486,135,492,102,486,135,485,132,464,109,452,96,462,72,462,72,452,96,440,82,462,72,440,82,434,41,434,41,440,82,429,68,434,41,429,68,420,54,487,138,486,214,485,143,485,143,486,214,485,210,485,143,485,210,483,206,475,201,478,150,480,203,480,203,478,150,482,147,480,203,482,147,483,206,483,206,482,147,485,143,360,113,341,138,341,135,360,113,341,135,340,132,360,113,340,132,338,128,360,113,338,128,336,125,340,143,341,138,341,214,340,143,341,214,340,210,340,143,340,210,338,206,340,143,338,206,337,147,323,154,328,153,329,201,329,201,328,153,333,150,329,201,333,150,334,203,334,203,333,150,337,147,334,203,337,147,338,206,323,154,329,201,323,200,323,154,323,200,49,200,323,154,49,200,49,154,320,109,307,96,311,66,311,66,307,96,295,82,311,66,295,82,288,41,288,41,295,82,284,68,288,41,284,68,274,54,295,274,307,260,310,289,310, -289,307,260,319,247,310,289,319,247,335,264,335,264,319,247,331,234,288,314,273,301,284,287,288,314,284,287,295,274,288,314,295,274,310,289,288,314,310,289,287,314,468,200,468,154,473,153,415,154,416,200,387,220,152,11,148,7,155,-68,155,-68,148,7,144,5,155,-68,144,5,140,5,140,5,136,5,155,-68,155,-68,136,5,133,6,155,-68,133,6,131,-33,131,-33,133,6,130,8,131,-33,130,8,127,11,152,155,148,152,155,77,155,77,148,152,144,150,155,77,144,150,140,150,140,150,136,150,136,105,136,105,136,150,133,151,136,105,133,151,130,153,130,153,127,156,136,105,136,105,127,156,123,159,136,105,123,159,115,131,115,131,123,159,110,172,115,131,110,172,97,184,92,157,115,131,97,184,92,157,97,184,83,196,92,157,83,196,69,207,92,157,69,207,67,181,55,217,42,203,67,181,55,217,67,181,69,207,202,463,155,463,155,77,202,463,155,77,175,-107,202,463,175,-107,182,-107,202,463,182,-107,202,23,155,168,155,77,155,463,155,160,152,155,155,77,155,160,155,77,155,168,140,150,136,105,155,77,227,9,223,7,226,-32,226,-32,223,7,219,6,226,-32,219,6,216,5,216,5,211,6,226,-32,226,-32,211,6,208,8,226,-32,208,8,204,12,231,157,227,154,243,131,243,131,227,154,223,152,243,131,223,152,221,104,221,104,223,152,219,151,221,104,219,151,216,151,216,151,211,151,221,104,221,104,211,151,208,154,221,104,208,154,204,157,262,40,248,28,254,0,254,0,248,28,235,16,254,0,235,16,231,12,275,197,262,185,266,157,266,157,262,185,248,173,266,157,248,173,243,131,243,131,248,173,235,160,243,131,235,160,231,157,290,181,316,204,302,218,290,181,302,218,289,208,290,181,289,208,275,197,290,181,275,197,266,157,202,162,202,169,202,76,202,162,202,76,221,104,202,162,221,104,204,157,289,63,275,52,284,30,289,63,284,30,316,59,289,63,316,59,302,73,262,40,254,0,284,30,262,40,284,30,275,52,227,9,226,-32,254,0,227,9,254,0,231,12,202,-68,226,-32,204,12,202,-68,204,12,202,17,202,-68,202,17,202,23,202,-68,202,23,182,-107,155,23,155,16,155,-68,155,23,155,-68,175,-107,155,23,175,-107,155,77,127,11,123, -15,131,-33,131,-33,123,15,110,27,131,-33,110,27,103,0,103,0,110,27,97,39,103,0,97,39,83,51,73,30,103,0,83,51,73,30,83,51,69,62,73,30,69,62,55,72,73,30,55,72,42,58,152,11,155,-68,155,16,169,203,165,206,166,147,166,147,165,206,163,210,166,147,163,210,163,143,163,143,163,210,163,214,162,138,156,252,156,102,156,102,156,252,124,225,156,102,124,225,123,130,123,130,124,225,88,200,123,130,88,200,88,154,88,154,88,200,49,180,88,154,49,180,49,173,216,314,187,283,197,260,216,314,197,260,208,274,216,314,208,274,219,287,216,314,219,287,230,301,187,283,156,252,164,222,187,283,164,222,166,226,187,283,166,226,169,230,187,283,169,230,172,234,187,283,172,234,184,247,187,283,184,247,197,260,163,218,164,222,156,252,163,218,156,252,163,214,196,96,184,109,187,72,187,72,184,109,172,121,187,72,172,121,168,125,215,41,229,54,219,68,215,41,219,68,208,82,215,41,208,82,196,96,215,41,196,96,187,72,513,113,523,160,522,177,522,177,523,190,513,113,513,113,523,190,513,241,513,113,513,241,486,135,486,135,513,241,486,220,486,135,486,220,458,154,458,154,486,220,457,200,588,68,577,82,584,41,584,41,577,82,565,95,584,41,565,95,562,66,562,66,565,95,553,108,562,66,553,108,541,121,541,121,537,127,538,90,538,90,537,127,531,136,538,90,531,136,527,147,523,160,513,113,538,90,523,160,538,90,527,147,526,203,531,215,539,264,539,264,531,215,536,225,539,264,536,225,542,234,542,234,554,248,563,289,563,289,554,248,566,261,563,289,566,261,585,314,585,314,566,261,577,274,585,314,577,274,589,287,539,264,513,241,523,190,539,264,523,190,526,203,563,289,539,264,542,234,541,121,538,90,562,66,180,200,174,201,175,153,180,200,175,153,180,154,180,200,180,154,458,154,180,200,458,154,457,200,170,150,175,153,174,201,170,150,174,201,169,203,170,150,169,203,166,147,162,135,162,138,156,102,162,135,156,102,163,132,163,132,156,102,187,72,163,132,187,72,165,128,165,128,187,72,168,125,163,143,163,214,162,138,588,68,584,41,598,54,585,314,589,287,599,301,163,214,156,252,162,138,135,241,110,264,112, -225,112,225,110,264,106,234,95,248,106,234,110,264,95,248,110,264,86,289,49,301,59,287,63,314,63,314,59,287,71,274,63,314,71,274,86,289,86,289,71,274,83,261,86,289,83,261,95,248,86,66,110,90,95,108,95,108,110,90,107,121,112,127,107,121,110,90,112,127,110,90,135,113,191,200,191,154,468,154,191,200,468,154,468,200,475,201,468,200,473,153,475,201,473,153,478,150,191,154,162,220,162,135,162,135,162,220,135,241,162,135,135,241,135,113,135,113,135,241,127,177,117,215,122,203,135,241,135,241,122,203,125,190,135,241,125,190,127,177,485,132,483,128,492,102,492,102,483,128,480,125,492,102,480,125,477,121,477,121,464,109,492,102,492,102,464,109,462,72,492,252,461,283,463,247,492,252,463,247,476,234,492,252,476,234,479,230,492,252,479,230,482,226,492,252,482,226,484,221,492,252,484,221,485,218,492,252,485,218,486,214,492,252,486,214,487,138,492,252,487,138,492,102,492,252,492,102,525,225,419,301,429,287,433,314,433,314,429,287,440,274,433,314,440,274,461,283,461,283,440,274,451,260,461,283,451,260,463,247,599,173,599,180,561,154,561,154,599,180,561,200,561,154,561,200,525,130,525,130,561,200,525,225,525,130,525,225,492,102,492,102,487,138,486,135,492,102,486,135,485,132,464,109,452,96,462,72,462,72,452,96,440,82,462,72,440,82,434,41,434,41,440,82,429,68,434,41,429,68,420,54,487,138,486,214,485,143,485,143,486,214,485,210,485,143,485,210,483,206,475,201,478,150,480,203,480,203,478,150,482,147,480,203,482,147,483,206,483,206,482,147,485,143,135,113,127,177,125,160,135,113,125,160,122,147,135,113,122,147,117,136,135,113,117,136,112,127,95,108,83,95,86,66,86,66,83,95,71,82,86,66,71,82,64,41,64,41,71,82,60,68,64,41,60,68,50,54,468,200,468,154,473,153,191,154,191,200,162,220,135,241,112,225,117,215,163,210,163,214,164,147,164,147,163,214,162,143,162,143,163,214,162,138,162,138,156,253,156,101,156,101,156,253,124,225,156,101,124,225,123,129,123,129,124,225,88,200,123,129,88,200,88,154,88,154,88,200,49,180,88,154,49,180,49,173,163,214,163,218,156,253,156, -253,163,218,164,222,156,253,164,222,187,283,187,283,164,222,166,226,187,283,166,226,169,230,216,315,187,283,197,260,216,315,197,260,208,274,216,315,208,274,219,288,216,315,219,288,230,302,187,283,169,230,172,234,187,283,172,234,184,247,187,283,184,247,197,260,196,95,184,109,187,71,187,71,184,109,172,121,187,71,172,121,168,125,215,40,229,53,219,67,215,40,219,67,208,82,215,40,208,82,196,95,215,40,196,95,187,71,162,135,162,138,156,101,162,135,156,101,163,132,163,132,156,101,187,71,163,132,187,71,165,128,165,128,187,71,168,125,600,315,565,315,600,40,600,40,565,315,565,200,600,40,565,200,565,154,565,154,565,200,180,200,565,154,180,200,180,154,173,153,180,154,174,201,173,153,174,201,169,203,163,210,164,147,165,206,165,206,164,147,168,150,165,206,168,150,169,203,169,203,168,150,173,153,600,40,565,154,565,40,180,154,180,200,174,201,163,214,156,253,162,138,127,344,130,347,131,389,131,389,130,347,133,349,131,389,133,349,155,425,155,425,133,349,136,350,155,425,136,350,140,351,140,351,144,350,155,425,155,425,144,350,148,346,155,425,148,346,152,342,155,337,155,333,155,425,155,425,155,333,175,463,175,463,155,333,202,-72,175,463,202,-72,182,463,182,463,202,-72,202,332,182,463,202,332,202,425,202,425,202,332,202,339,202,425,202,339,204,344,123,341,127,344,131,389,123,341,131,389,110,328,110,328,131,389,103,356,110,328,103,356,97,316,97,316,103,356,83,305,73,326,42,298,55,284,73,326,55,284,69,294,73,326,69,294,83,305,73,326,83,305,103,356,204,344,208,347,226,389,226,389,208,347,211,349,226,389,211,349,216,350,216,350,219,350,226,389,226,389,219,350,223,348,226,389,223,348,227,346,262,316,275,304,284,325,284,325,275,304,289,293,284,325,289,293,316,297,316,297,289,293,302,283,254,356,226,389,227,346,254,356,227,346,231,344,254,356,231,344,235,340,254,356,235,340,248,328,254,356,248,328,262,316,254,356,262,316,284,325,202,-72,155,333,155,-72,202,-72,155,-72,316,-107,202,-72,316,-107,316,-72,42,-72,42,-107,316,-107,42,-72,316,-107,155,-72,202,425,204,344,226,389,155,425,152,342,155,337,49,315,84, -40,84,315,84,200,84,154,468,154,84,200,468,154,469,200,469,200,468,154,475,153,469,200,475,153,475,201,487,211,487,140,493,101,487,211,493,101,488,216,488,216,493,101,493,253,493,253,493,101,526,129,493,253,526,129,526,225,526,225,526,129,561,154,526,225,561,154,561,200,561,200,561,154,600,173,561,200,600,173,600,180,493,253,463,283,465,245,493,253,465,245,477,233,493,253,477,233,481,229,493,253,481,229,484,226,493,253,484,226,486,222,493,253,486,222,487,219,493,253,487,219,488,216,420,302,430,288,434,315,434,315,430,288,441,273,434,315,441,273,463,283,463,283,441,273,453,259,463,283,453,259,465,245,452,94,462,71,464,107,464,107,462,71,493,101,464,107,493,101,477,120,477,120,493,101,480,124,487,140,487,211,486,144,486,144,487,211,484,207,486,144,484,207,484,148,484,148,484,207,481,203,484,148,481,203,480,151,480,151,481,203,475,201,480,151,475,201,475,153,493,101,487,140,486,136,493,101,486,136,485,132,493,101,485,132,483,128,493,101,483,128,480,124,440,81,429,67,434,40,440,81,434,40,462,71,440,81,462,71,452,94,434,40,429,67,420,53,84,40,49,315,49,40,153,12,149,8,155,-68,155,-68,149,8,146,6,155,-68,146,6,141,5,141,5,138,6,155,-68,155,-68,138,6,134,7,155,-68,134,7,131,-32,131,-32,134,7,130,9,131,-32,130,9,126,12,316,428,316,463,202,428,202,428,316,463,155,428,202,428,155,428,175,-107,175,-107,155,428,155,23,175,-107,155,23,155,-68,155,-68,155,23,155,17,155,-68,155,17,153,12,209,9,205,14,226,-33,226,-33,205,14,203,19,226,-33,203,19,202,-68,202,-68,203,19,202,23,202,23,202,428,182,-107,182,-107,202,428,175,-107,42,463,42,428,155,428,42,463,155,428,316,463,227,8,224,6,226,-33,226,-33,224,6,221,5,226,-33,221,5,217,5,217,5,213,6,226,-33,226,-33,213,6,209,9,260,39,247,27,254,0,254,0,247,27,234,15,254,0,234,15,230,11,288,62,274,51,284,30,288,62,284,30,315,58,288,62,315,58,302,72,260,39,254,0,284,30,260,39,284,30,274,51,227,8,226,-33,254,0,227,8,254,0,230,11,126,12,122,16,131,-32,131,-32,122,16,109, -28,131,-32,109,28,103,0,103,0,109,28,95,40,103,0,95,40,82,52,73,30,103,0,82,52,73,30,82,52,68,63,73,30,68,63,55,73,73,30,55,73,41,59,202,-68,202,23,182,-107,95,75,103,35,109,63,109,63,103,35,131,2,109,63,131,2,122,51,122,51,131,2,126,47,127,344,130,347,131,389,131,389,130,347,133,349,131,389,133,349,155,425,155,425,133,349,136,350,155,425,136,350,140,351,140,351,144,350,155,425,155,425,144,350,148,349,155,425,148,349,152,345,153,47,149,43,155,-33,155,-33,149,43,146,41,155,-33,146,41,141,41,141,41,138,41,155,-33,155,-33,138,41,134,42,155,-33,134,42,131,2,131,2,134,42,130,44,131,2,130,44,126,47,204,344,208,347,226,389,226,389,208,347,211,349,226,389,211,349,216,350,216,350,219,350,226,389,226,389,219,350,223,348,226,389,223,348,227,346,262,316,275,304,284,325,284,325,275,304,289,293,284,325,289,293,316,297,316,297,289,293,302,283,254,356,226,389,227,346,254,356,227,346,231,344,254,356,231,344,235,340,254,356,235,340,248,328,254,356,248,328,262,316,254,356,262,316,284,325,202,425,182,463,202,332,202,425,202,332,202,339,202,425,202,339,204,344,202,425,204,344,226,389,209,43,205,47,226,2,226,2,205,47,203,52,226,2,203,52,202,-33,202,-33,203,52,202,58,202,58,202,332,182,463,227,43,224,41,226,2,226,2,224,41,221,40,226,2,221,40,217,40,217,40,213,41,226,2,226,2,213,41,209,43,260,74,247,62,254,34,254,34,247,62,234,50,254,34,234,50,230,46,288,97,274,86,284,65,288,97,284,65,315,93,288,97,315,93,302,107,260,74,254,34,284,65,260,74,284,65,274,86,227,43,226,2,254,34,227,43,254,34,230,46,42,-72,316,-107,175,-72,175,-72,316,-107,182,-72,175,-72,182,-72,182,463,182,463,182,-72,202,-33,182,463,202,-33,202,58,155,340,155,333,155,425,155,425,155,333,175,463,175,463,155,333,175,-72,175,463,175,-72,182,463,123,341,127,344,131,389,123,341,131,389,110,328,110,328,131,389,103,356,110,328,103,356,97,316,97,316,103,356,83,305,73,326,42,298,55,284,73,326,55,284,69,294,73,326,69,294,83,305,73, -326,83,305,103,356,175,-72,155,333,155,59,175,-72,155,59,155,-33,155,-33,155,59,155,52,155,-33,155,52,153,47,82,87,68,98,73,65,82,87,73,65,103,35,82,87,103,35,95,75,55,108,41,94,73,65,55,108,73,65,68,98,316,-107,42,-72,42,-107,182,-72,316,-107,316,-72,155,425,152,345,155,340,49,180,49,180,88,200,88,200,49,180,88,154,88,200,88,154,123,224,123,224,88,154,124,129,123,224,124,129,156,252,156,252,124,129,156,101,156,252,156,101,162,216,163,212,163,140,163,144,163,212,163,144,165,207,165,207,163,144,164,147,165,207,164,147,167,151,215,313,187,282,196,258,215,313,196,258,208,272,215,313,208,272,219,286,215,313,219,286,229,300,187,282,156,252,163,222,187,282,163,222,165,226,187,282,165,226,168,229,187,282,168,229,172,233,187,282,172,233,184,245,187,282,184,245,196,258,162,219,163,222,156,252,162,219,156,252,162,216,197,94,184,107,187,71,187,71,184,107,172,120,187,71,172,120,168,124,216,40,230,53,219,67,216,40,219,67,208,81,216,40,208,81,197,94,216,40,197,94,187,71,488,387,420,387,486,341,488,387,486,341,509,337,488,387,509,337,520,382,599,270,593,311,592,228,592,228,593,311,575,343,592,228,575,343,572,195,572,195,575,343,553,270,550,367,520,382,527,328,550,367,527,328,541,313,550,367,541,313,550,293,550,367,550,293,553,270,550,367,553,270,575,343,549,245,537,225,543,172,549,245,543,172,572,195,549,245,572,195,553,270,473,200,476,154,498,203,498,203,476,154,510,158,498,203,510,158,519,211,519,211,510,158,543,172,519,211,543,172,537,225,165,207,167,151,168,204,168,204,167,151,171,153,168,204,171,153,173,201,173,201,171,153,178,154,173,201,178,154,178,200,178,200,178,154,473,200,473,200,178,154,476,154,163,136,163,140,156,101,163,136,156,101,164,132,164,132,156,101,187,71,164,132,187,71,166,128,166,128,187,71,168,124,162,216,163,140,163,212,156,101,163,140,162,216,520,382,509,337,527,328,486,341,420,387,420,341,88,154,49,180,49,173,77,195,105,172,95,270,95,270,98,367,77,195,77,195,98,367,73,343,77,195,73,343,57,228,57,228,73,343,56,311,57,228,56, -311,49,270,229,341,229,387,163,341,140,337,163,341,160,387,140,337,160,387,128,382,128,382,98,367,98,293,128,382,98,293,107,313,128,382,107,313,121,328,128,382,121,328,140,337,129,211,138,158,151,203,151,203,138,158,172,154,151,203,172,154,175,200,175,200,172,154,470,154,175,200,470,154,470,200,476,201,470,200,470,154,476,201,470,154,476,153,111,225,100,245,105,172,111,225,105,172,138,158,111,225,138,158,129,211,484,132,492,101,485,136,485,136,492,101,486,140,486,212,486,140,492,101,486,212,492,101,487,216,487,216,492,101,492,252,492,252,492,101,525,129,492,252,525,129,525,224,525,224,525,129,561,154,525,224,561,154,561,200,561,200,561,154,599,173,561,200,599,173,599,180,492,252,462,282,464,245,492,252,464,245,477,233,492,252,477,233,480,229,492,252,480,229,483,226,492,252,483,226,485,222,492,252,485,222,486,219,492,252,486,219,487,216,420,300,429,286,434,313,434,313,429,286,440,272,434,313,440,272,462,282,462,282,440,272,452,258,462,282,452,258,464,245,451,94,461,71,463,107,463,107,461,71,492,101,463,107,492,101,476,120,476,120,492,101,479,124,476,153,481,151,481,204,481,204,481,151,484,147,481,204,484,147,484,207,484,207,484,147,485,144,484,207,485,144,486,212,486,212,485,144,486,140,482,128,479,124,492,101,482,128,492,101,484,132,439,81,429,67,433,40,439,81,433,40,461,71,439,81,461,71,451,94,433,40,429,67,419,53,476,201,476,153,481,204,95,270,105,172,100,245,163,341,229,387,160,387,98,367,95,270,98,293,49,180,49,180,88,200,88,200,49,180,88,154,88,200,88,154,123,224,123,224,88,154,124,129,123,224,124,129,156,252,156,252,124,129,156,101,156,252,156,101,162,216,163,212,163,140,163,144,163,212,163,144,166,208,166,208,163,144,165,147,166,208,165,147,168,150,215,313,187,282,196,258,215,313,196,258,208,272,215,313,208,272,219,286,215,313,219,286,229,300,187,282,156,252,163,222,187,282,163,222,165,226,187,282,165,226,168,229,187,282,168,229,172,233,187,282,172,233,184,245,187,282,184,245,196,258,162,219,163,222,156,252,162,219,156,252,162,216,197,94,184,107,187,71,187,71,184,107,172, -120,187,71,172,120,168,124,377,305,370,260,416,0,416,0,370,260,370,200,416,0,370,200,370,154,370,154,370,200,178,154,172,152,178,154,174,201,172,152,174,201,170,204,170,204,166,208,168,150,170,204,168,150,172,152,178,200,174,201,178,154,178,200,178,154,370,200,488,387,486,341,509,337,488,387,509,337,520,382,520,382,509,337,527,328,520,382,527,328,550,367,550,367,527,328,541,313,550,367,541,313,550,293,599,270,593,311,592,228,592,228,593,311,575,343,592,228,575,343,572,195,572,195,575,343,553,270,550,367,550,293,553,270,550,367,553,270,575,343,549,245,537,225,543,172,549,245,543,172,572,195,549,245,572,195,553,270,473,200,476,154,498,203,498,203,476,154,510,158,498,203,510,158,519,211,519,211,510,158,543,172,519,211,543,172,537,225,430,312,445,328,453,381,453,381,445,328,464,337,453,381,464,337,488,387,488,387,464,337,486,341,420,366,394,340,416,262,420,366,416,262,420,290,420,366,420,290,430,312,420,366,430,312,453,381,394,340,416,0,416,262,416,200,416,154,476,154,416,200,476,154,473,200,216,40,230,53,219,67,216,40,219,67,208,81,216,40,208,81,197,94,216,40,197,94,187,71,163,136,163,140,156,101,163,136,156,101,164,132,164,132,156,101,187,71,164,132,187,71,166,128,166,128,187,71,168,124,156,101,163,140,162,216,416,0,370,154,370,0,377,305,416,0,394,340,162,216,163,140,163,212,88,154,49,180,49,173,218,312,228,366,203,328,203,328,228,366,196,381,203,328,196,381,184,337,184,337,196,381,163,341,184,337,163,341,162,341,162,341,163,341,140,337,140,337,163,341,160,387,140,337,160,387,128,382,128,382,98,367,98,293,128,382,98,293,107,313,128,382,107,313,121,328,128,382,121,328,140,337,100,245,95,270,105,172,105,172,95,270,77,195,77,195,95,270,98,367,98,367,95,270,98,293,73,343,56,311,57,228,73,343,57,228,77,195,73,343,77,195,98,367,129,211,138,158,151,203,151,203,138,158,172,154,151,203,172,154,175,200,175,200,172,154,232,154,175,200,232,154,232,200,232,200,232,154,278,0,232,200,278,0,232,262,228,290,232,262,254,340,228,290,254,340,228,366,111,225,100,245,105,172,111, -225,105,172,138,158,111,225,138,158,129,211,196,381,160,387,163,341,470,154,470,200,278,200,470,154,278,200,278,154,278,0,278,260,272,305,278,0,272,305,254,340,486,140,492,101,487,216,487,216,492,101,492,252,492,252,492,101,525,129,492,252,525,129,525,224,525,224,525,129,561,154,525,224,561,154,561,200,561,200,561,154,599,173,561,200,599,173,599,180,492,252,462,282,464,245,492,252,464,245,477,233,492,252,477,233,480,229,492,252,480,229,483,226,492,252,483,226,485,222,492,252,485,222,486,219,492,252,486,219,487,216,420,300,429,286,434,313,434,313,429,286,440,272,434,313,440,272,462,282,462,282,440,272,452,258,462,282,452,258,464,245,451,94,461,71,463,107,463,107,461,71,492,101,463,107,492,101,476,120,476,120,492,101,479,124,485,136,484,132,492,101,485,136,492,101,486,140,482,128,479,124,492,101,482,128,492,101,484,132,439,81,429,67,433,40,439,81,433,40,461,71,439,81,461,71,451,94,484,147,485,144,486,212,486,212,485,144,486,140,486,212,486,140,487,216,470,200,470,154,474,201,474,201,470,154,476,152,474,201,476,152,479,204,479,204,476,152,481,150,479,204,481,150,483,208,483,208,481,150,484,147,483,208,484,147,486,212,433,40,429,67,419,53,278,0,232,154,232,0,232,262,278,0,254,340,228,366,218,312,228,290,57,228,56,311,49,270,154,203,150,206,151,146,151,146,150,206,148,210,151,146,148,210,148,142,148,142,148,210,148,214,147,138,142,252,141,102,141,102,142,252,109,225,141,102,109,225,109,130,109,130,109,225,73,200,109,130,73,200,73,154,73,154,73,200,34,180,73,154,34,180,34,173,201,314,172,283,182,260,201,314,182,260,194,274,201,314,194,274,205,287,201,314,205,287,215,301,172,283,142,252,149,222,172,283,149,222,152,226,172,283,152,226,154,230,172,283,154,230,158,234,172,283,158,234,170,247,172,283,170,247,182,260,148,218,149,222,142,252,148,218,142,252,148,214,181,96,169,109,172,72,172,72,169,109,157,121,172,72,157,121,153,125,200,41,214,54,204,68,200,41,204,68,193,82,200,41,193,82,181,96,200,41,181,96,172,72,166,200,159,201,160,153,166,200,160,153,164,154,166,200,164, -154,208,154,166,200,208,154,208,200,420,230,441,214,454,260,420,230,454,260,420,276,420,230,420,276,399,214,399,214,420,276,386,260,399,214,386,260,381,177,381,177,386,260,362,223,381,177,362,223,362,132,362,132,362,223,344,179,362,132,344,179,338,95,338,95,344,179,327,141,338,95,327,141,307,80,307,80,327,141,307,126,632,154,632,200,611,146,611,146,632,200,604,192,611,146,604,192,593,128,593,128,604,192,583,174,593,128,583,174,575,106,575,106,583,174,566,152,575,106,566,152,556,87,556,87,566,152,551,133,556,87,551,133,534,80,534,80,551,133,534,126,659,96,668,72,671,109,671,109,668,72,698,102,671,109,698,102,683,121,683,121,698,102,687,125,698,252,668,283,670,247,698,252,670,247,683,234,698,252,683,234,686,230,698,252,686,230,689,226,698,252,689,226,691,221,698,252,691,221,692,218,698,252,692,218,692,214,698,252,692,214,693,138,698,252,693,138,698,102,698,252,698,102,731,225,625,301,635,287,639,314,639,314,635,287,646,274,639,314,646,274,668,283,668,283,646,274,658,260,668,283,658,260,670,247,805,173,805,180,767,154,767,154,805,180,767,200,767,154,767,200,731,130,731,130,767,200,731,225,731,130,731,225,698,102,698,102,693,138,693,135,698,102,693,135,691,132,698,102,691,132,689,128,698,102,689,128,687,125,647,82,636,68,640,41,647,82,640,41,668,72,647,82,668,72,659,96,693,138,692,214,692,142,692,142,692,214,692,210,692,142,692,210,689,206,677,154,680,153,681,201,681,201,680,153,685,150,681,201,685,150,686,203,686,203,685,150,689,146,686,203,689,146,689,206,689,206,689,146,692,142,677,154,681,201,674,200,677,154,674,200,632,200,677,154,632,200,632,154,454,260,459,177,478,223,478,223,459,177,478,132,478,223,478,132,496,179,496,179,478,132,502,95,496,179,502,95,513,141,513,141,502,95,534,80,513,141,534,80,534,126,208,154,229,146,236,192,236,192,229,146,247,128,236,192,247,128,257,174,257,174,247,128,265,106,257,174,265,106,274,152,274,152,265,106,284,87,274,152,284,87,290,134,290,134,284,87,307,80,290,134,307,80,307,126,155,150,160,153,159,201,155,150,159,201,154,203,155,150,154,203,151, -146,147,135,147,138,141,102,147,135,141,102,148,132,148,132,141,102,172,72,148,132,172,72,150,128,150,128,172,72,153,125,148,142,148,214,147,138,208,200,208,154,236,192,454,260,441,214,459,177,640,41,636,68,626,54,148,214,142,252,147,138,146,203,143,206,144,147,144,147,143,206,141,210,144,147,141,210,140,143,140,143,141,210,140,214,139,138,134,253,134,102,134,102,134,253,101,225,134,102,101,225,101,130,101,130,101,225,65,200,101,130,65,200,65,154,65,154,65,200,27,180,65,154,27,180,27,173,193,315,164,283,175,260,193,315,175,260,186,274,193,315,186,274,197,288,193,315,197,288,207,302,164,283,134,253,142,222,164,283,142,222,144,226,164,283,144,226,147,230,164,283,147,230,150,234,164,283,150,234,163,247,164,283,163,247,175,260,140,218,142,222,134,253,140,218,134,253,140,214,174,96,162,109,164,72,164,72,162,109,149,121,164,72,149,121,145,125,286,41,334,154,296,154,296,154,334,154,316,200,296,154,316,200,158,154,158,154,316,200,158,200,158,154,158,200,153,153,151,201,146,203,148,150,151,201,148,150,153,153,151,201,153,153,158,200,353,200,402,315,364,315,353,200,364,315,334,154,353,200,334,154,490,154,353,200,490,154,491,200,508,140,514,102,509,216,509,216,514,102,515,253,515,253,514,102,548,130,515,253,548,130,548,225,548,225,548,130,583,154,548,225,583,154,583,200,583,200,583,154,622,173,583,200,622,173,622,180,515,253,484,283,487,245,515,253,487,245,499,233,515,253,499,233,503,229,515,253,503,229,506,226,515,253,506,226,507,222,515,253,507,222,508,219,515,253,508,219,509,216,441,302,451,288,455,315,455,315,451,288,463,273,455,315,463,273,484,283,484,283,463,273,475,259,484,283,475,259,487,245,490,154,497,153,491,200,495,201,491,200,497,153,495,201,497,153,500,203,500,203,497,153,502,151,500,203,502,151,504,207,504,207,502,151,505,148,504,207,505,148,507,211,507,211,505,148,507,144,507,211,507,144,508,140,474,94,484,72,486,107,486,107,484,72,514,102,486,107,514,102,498,120,498,120,514,102,502,124,507,136,506,132,514,102,507,136,514,102,508,140,504,128,502,124,514,102,504,128,514,102,506,132,462, -81,451,68,455,41,462,81,455,41,484,72,462,81,484,72,474,94,509,216,507,211,508,140,192,41,206,54,197,68,192,41,197,68,186,82,192,41,186,82,174,96,192,41,174,96,164,72,139,135,139,138,134,102,139,135,134,102,141,132,141,132,134,102,164,72,141,132,164,72,143,128,143,128,164,72,145,125,455,41,451,68,441,54,286,41,296,154,248,41,316,200,334,154,364,315,140,143,140,214,139,138,146,203,144,147,148,150,140,214,134,253,139,138,67,97,62,113,63,-32,62,-32,63,-32,62,-46,62,-32,62,-46,99,-86,99,-86,62,-46,61,-60,99,-86,61,-60,61,-107,61,-107,61,-60,60,-74,61,-107,60,-74,58,-88,62,113,42,109,49,82,62,113,49,82,54,54,62,113,54,54,59,25,62,113,59,25,61,-3,62,113,61,-3,63,-32,91,11,87,16,99,-86,99,-86,87,16,85,21,99,-86,85,21,84,27,109,10,106,8,139,-70,139,-70,106,8,103,7,139,-70,103,7,100,6,100,6,95,7,99,-86,99,-86,95,7,91,11,99,-86,84,27,80,45,99,-86,80,45,76,63,99,-86,76,63,72,80,99,-86,72,80,67,97,99,-86,67,97,63,-32,99,-86,63,-32,62,-32,58,-88,55,-102,61,-107,145,224,315,436,273,463,145,224,273,463,42,178,145,224,42,178,225,178,145,224,225,178,316,224,161,-37,156,-35,181,-60,181,-60,156,-35,153,-32,181,-60,153,-32,139,-70,139,-70,153,-32,150,-27,139,-70,150,-27,149,-22,149,-22,149,-19,139,-70,139,-70,149,-19,150,-16,139,-70,150,-16,115,16,115,16,150,-16,150,-14,115,16,150,-14,151,-12,151,-12,152,-11,225,178,151,-12,225,178,115,16,225,178,152,-11,316,224,112,13,109,10,139,-70,112,13,139,-70,115,16,100,6,99,-86,139,-70,171,-37,169,-37,181,-60,181,-60,169,-37,168,-37,181,-60,168,-37,166,-37,166,-37,161,-37,181,-60,263,-29,252,-29,265,-47,265,-47,252,-29,237,-29,265,-47,237,-29,223,-52,223,-52,237,-29,221,-30,223,-52,221,-30,205,-32,189,-34,173,-36,181,-60,189,-34,181,-60,223,-52,189,-34,223,-52,205,-32,172,-37,171,-37,181,-60,172,-37,181,-60,173,-36,21,336,60,310,60,355,60,355,60,310,95,287,60,355,95,287,95,378,95,378,95,287,128,261,95,378,128,261,128,404,128,404,128, -261,141,290,128,404,141,290,141,294,141,294,141,370,128,404,128,404,141,370,142,373,128,404,142,373,143,378,144,362,142,365,143,302,143,302,142,365,141,370,141,298,141,370,141,294,188,463,159,432,163,405,188,463,163,405,173,416,188,463,173,416,183,426,188,463,183,426,192,437,188,463,192,437,202,450,159,432,128,404,143,378,159,432,143,378,145,384,159,432,145,384,148,389,159,432,148,389,152,393,159,432,152,393,163,405,182,242,173,253,187,202,187,202,173,253,162,265,187,202,162,265,159,233,159,233,162,265,151,277,159,233,151,277,147,280,192,229,182,242,187,202,192,229,187,202,201,216,159,233,147,280,144,284,159,233,144,284,142,287,159,233,142,287,141,290,159,233,141,290,128,261,297,-108,297,355,251,309,251,309,297,355,159,355,251,309,159,355,159,309,152,308,159,309,153,356,152,308,153,356,148,358,147,306,152,308,148,358,147,306,148,358,144,362,147,306,144,362,143,302,60,310,21,336,21,329,297,-108,251,309,251,-108,159,309,159,355,153,356,143,302,141,370,141,298,184,294,183,290,184,294,184,294,183,290,196,261,184,294,196,261,196,404,184,294,196,404,183,298,183,298,196,404,183,370,183,298,183,370,182,365,183,298,182,365,181,302,181,302,182,365,180,362,181,302,180,362,177,306,177,306,180,362,177,358,177,306,177,358,172,308,172,308,177,358,172,356,172,308,172,356,165,355,165,309,165,355,73,309,173,277,162,265,166,233,173,277,166,233,196,261,173,277,196,261,177,280,179,384,181,378,196,404,196,404,181,378,182,373,196,404,182,373,183,370,150,416,161,405,165,432,165,432,161,405,173,393,165,432,173,393,196,404,196,404,173,393,176,389,196,404,176,389,179,384,123,450,132,437,137,463,137,463,132,437,141,426,137,463,141,426,165,432,165,432,141,426,150,416,196,404,196,261,229,378,229,378,196,261,229,287,229,378,229,287,264,355,264,355,229,287,264,310,264,355,264,310,303,336,303,336,264,310,303,329,196,261,183,290,182,287,196,261,182,287,180,284,196,261,180,284,177,280,162,265,151,253,166,233,166,233,151,253,142,242,166,233,142,242,138,202,138,202,142,242,132,229,138,202,132,229,123,216,27,355,27,-108,73,-108,27,355,73,-108,73, -309,27,355,73,309,165,355,165,355,165,309,172,308,140,-22,139,-17,125,-47,125,-47,139,-17,138,-13,125,-47,138,-13,138,62,138,62,138,65,125,-47,125,-47,138,65,125,94,125,-47,125,94,92,-21,92,-21,125,94,92,68,92,-21,92,68,56,0,56,0,92,68,56,45,56,0,56,45,17,27,184,153,155,123,158,91,184,153,158,91,169,102,184,153,169,102,179,114,184,153,179,114,188,127,184,153,188,127,198,140,155,123,125,94,139,68,155,123,139,68,141,72,155,123,141,72,143,75,155,123,143,75,147,79,155,123,147,79,158,91,139,-9,140,53,138,-13,138,-13,138,57,138,62,156,-76,184,-107,159,-48,156,-76,159,-48,148,-36,148,-36,144,-31,156,-76,156,-76,144,-31,142,-27,156,-76,142,-27,140,-22,293,463,247,463,293,0,293,0,247,463,247,46,293,0,247,46,156,0,156,0,247,46,155,46,156,0,155,46,150,0,150,0,155,46,149,47,150,0,149,47,145,-2,145,-2,149,47,144,50,145,-2,144,50,141,-5,141,-5,144,50,140,53,141,-5,140,53,139,-9,184,-107,198,-94,189,-81,184,-107,189,-81,180,-69,184,-107,180,-69,170,-59,184,-107,170,-59,159,-48,140,-22,125,-47,156,-76,138,57,138,-13,140,53,56,0,17,27,17,20,125,94,138,65,139,68,73,46,73,463,27,463,73,46,27,463,27,0,73,46,27,0,165,0,73,46,165,0,165,46,184,62,196,-47,196,94,196,94,196,-47,229,-21,196,94,229,-21,229,68,229,68,229,-21,264,0,229,68,264,0,264,46,264,46,264,0,303,20,264,46,303,20,303,27,180,72,182,68,196,94,196,94,182,68,183,65,196,94,183,65,184,62,151,102,162,91,166,123,166,123,162,91,173,79,166,123,173,79,196,94,196,94,173,79,177,75,196,94,177,75,180,72,123,140,132,127,138,153,138,153,132,127,142,114,138,153,142,114,166,123,166,123,142,114,151,102,173,-36,161,-48,165,-76,173,-36,165,-76,196,-47,173,-36,196,-47,176,-31,165,46,172,0,172,47,172,47,172,0,177,-2,172,47,177,-2,177,50,177,50,177,-2,180,-5,177,50,180,-5,181,53,181,53,180,-5,182,-9,181,53,182,-9,183,57,183,57,182,-9,183,-13,196,-47,183,-13,182,-17,196,-47,182,-17,181,-22,183,57,183,-13,196,-47,183, -57,196,-47,184,62,179,-27,176,-31,196,-47,179,-27,196,-47,181,-22,161,-48,150,-59,165,-76,165,-76,150,-59,141,-69,165,-76,141,-69,137,-107,137,-107,141,-69,132,-81,137,-107,132,-81,123,-94,165,46,165,0,172,0,138,153,166,123,137,153,436,11,432,7,439,-68,439,-68,432,7,428,5,439,-68,428,5,423,5,423,5,420,5,439,-68,439,-68,420,5,417,6,439,-68,417,6,415,-33,415,-33,417,6,414,8,415,-33,414,8,410,11,488,11,486,16,486,-68,486,-68,486,16,485,23,485,23,485,463,466,-107,466,-107,485,463,459,-107,485,463,439,417,459,-107,459,-107,439,417,439,23,459,-107,439,23,439,-68,439,-68,439,23,438,16,439,-68,438,16,436,11,49,463,49,417,439,417,49,463,439,417,485,463,511,9,507,7,510,-32,510,-32,507,7,503,6,510,-32,503,6,499,5,499,5,495,6,510,-32,510,-32,495,6,491,8,510,-32,491,8,488,11,545,40,532,28,538,0,538,0,532,28,519,16,538,0,519,16,515,12,572,63,558,52,568,30,572,63,568,30,599,59,572,63,599,59,586,73,545,40,538,0,568,30,545,40,568,30,558,52,511,9,510,-32,538,0,511,9,538,0,515,12,410,11,406,15,415,-33,415,-33,406,15,394,27,415,-33,394,27,387,0,387,0,394,27,381,39,387,0,381,39,367,51,357,30,387,0,367,51,357,30,367,51,353,62,357,30,353,62,339,72,357,30,339,72,326,58,486,-68,485,23,466,-107,488,11,486,-68,510,-32,49,27,49,27,88,46,88,46,49,27,88,0,88,46,88,0,123,69,123,69,88,0,124,-22,123,69,124,-22,156,95,156,95,124,-22,156,-48,156,95,156,-48,162,62,162,62,163,-13,162,57,162,57,163,-13,164,53,164,53,163,-13,163,-9,163,68,165,72,187,124,187,124,165,72,168,75,187,124,168,75,172,79,172,79,184,91,187,124,187,124,184,91,196,103,187,124,196,103,215,155,215,155,196,103,208,115,215,155,208,115,219,128,162,65,163,68,156,95,162,65,156,95,162,62,216,-108,230,-95,219,-82,216,-108,219,-82,208,-69,216,-108,208,-69,197,-57,216,-108,197,-57,187,-77,187,-77,197,-57,184,-45,187,-77,184,-45,172,-33,187,-77,172,-33,168,-29,187,-77,168,-29,166,-25,187,-77,166,-25,164,-20,187,-77,164, --20,156,-48,163,-13,162,62,156,-48,163,-13,156,-48,163,-17,599,0,599,463,553,463,599,0,553,463,553,46,599,0,553,46,180,46,599,0,180,46,180,0,180,0,180,46,174,0,174,0,180,46,173,47,174,0,173,47,168,-2,168,-2,173,47,168,50,168,-2,168,50,165,-5,165,-5,168,50,164,53,165,-5,164,53,163,-9,163,-17,156,-48,164,-20,88,0,49,27,49,20,156,95,163,68,187,124,215,155,219,128,229,141,124,113,121,114,138,39,138,39,121,114,118,116,138,39,118,116,116,74,116,74,118,116,115,119,116,74,115,119,111,123,111,123,99,135,116,74,116,74,99,135,90,107,136,122,134,117,138,39,138,39,134,117,131,114,138,39,131,114,127,113,127,113,124,113,138,39,164,0,183,39,184,275,184,275,183,39,184,135,184,127,184,135,183,39,184,127,183,39,186,120,186,120,183,39,205,74,186,120,205,74,189,116,189,116,205,74,192,114,380,373,377,327,439,318,380,373,439,318,454,361,454,361,439,318,492,290,454,361,492,290,519,327,519,327,492,290,534,249,519,327,534,249,571,275,571,275,534,249,561,196,571,275,561,196,571,134,571,134,617,134,605,210,571,134,605,210,571,275,193,196,221,249,236,327,236,327,221,249,263,290,236,327,263,290,303,361,303,361,263,290,316,318,303,361,316,318,380,373,380,373,316,318,377,327,184,275,184,135,193,196,184,275,193,196,236,327,138,134,137,128,138,39,138,134,138,39,150,210,150,210,138,39,157,0,150,210,157,0,184,275,184,275,157,0,164,0,204,117,201,115,205,74,205,74,201,115,198,114,205,74,198,114,196,113,196,113,192,114,205,74,263,171,250,160,260,138,263,171,260,138,291,166,263,171,291,166,277,180,237,148,223,136,231,107,237,148,231,107,260,138,237,148,260,138,250,160,204,117,205,74,207,120,207,120,205,74,231,107,207,120,231,107,210,123,210,123,231,107,223,136,99,135,86,147,90,107,90,107,86,147,72,159,90,107,72,159,61,137,61,137,72,159,58,170,61,137,58,170,44,180,61,137,44,180,30,166,136,122,138,39,137,128,455,196,464,275,427,249,427,249,464,275,412,327,427,249,412,327,386,290,386,290,412,327,345,361,386,290,345,361,332,318,332,318,345,361,271, -327,210,318,271,327,269,373,210,318,269,373,194,361,87,196,115,249,129,327,129,327,115,249,157,290,129,327,157,290,194,361,194,361,157,290,210,318,77,275,43,210,77,134,77,275,77,134,87,196,77,275,87,196,129,327,462,120,460,116,465,39,465,39,460,116,456,114,465,39,456,114,452,113,452,113,450,114,465,39,465,39,450,114,447,115,465,39,447,115,445,117,530,116,527,114,533,74,533,74,527,114,525,113,533,74,525,113,522,113,522,113,517,114,533,74,533,74,517,114,514,117,533,74,514,117,510,39,510,39,514,117,512,122,510,39,512,122,511,128,533,119,530,116,533,74,533,119,533,74,558,107,533,119,558,107,537,123,590,170,576,159,587,137,590,170,587,137,617,166,590,170,617,166,604,180,562,147,549,135,558,107,562,147,558,107,587,137,562,147,587,137,576,159,484,0,491,0,499,210,499,210,491,0,510,39,499,210,510,39,511,134,511,134,510,39,511,128,465,39,484,0,499,210,465,39,499,210,465,135,465,39,465,135,464,127,465,39,464,127,462,120,464,275,455,196,465,135,464,275,465,135,499,210,345,361,269,373,271,327,443,74,465,39,445,117,443,74,445,117,442,120,443,74,442,120,438,123,443,74,438,123,425,136,443,74,425,136,417,107,425,136,412,148,417,107,417,107,412,148,398,160,417,107,398,160,389,138,389,138,398,160,385,171,389,138,385,171,371,180,389,138,371,180,358,166,537,123,558,107,549,135,77,134,43,210,30,134,44,513,44,466,599,466,44,513,599,466,599,513,55,400,60,370,73,453,73,453,60,370,63,339,73,453,63,339,64,309,64,309,64,296,82,245,82,245,64,296,64,284,82,245,64,284,63,272,73,453,44,463,48,430,73,453,48,430,55,400,89,343,90,347,103,446,103,446,90,347,91,350,103,446,91,350,94,354,94,354,96,355,103,446,103,446,96,355,98,356,103,446,98,356,100,357,110,357,133,441,107,357,107,357,133,441,105,358,102,358,105,358,103,446,102,358,103,446,100,357,85,263,87,281,89,343,89,343,87,281,88,298,89,343,88,298,89,338,89,338,88,298,89,316,89,338,89,316,89,334,82,245,85,263,89,343,82,245,89,343,73,453,82,245,73,453,64,309,63,259,62,247,82,245,63, -259,82,245,63,272,133,441,117,352,144,394,133,441,144,394,144,397,144,397,144,399,133,441,133,441,144,399,144,401,133,441,144,401,145,403,133,441,110,357,112,355,133,441,112,355,115,353,133,441,115,353,117,352,133,441,103,446,105,358,133,441,145,403,164,438,164,438,145,403,146,405,164,438,146,405,148,406,195,438,168,413,186,414,195,438,186,414,203,415,195,438,164,438,168,413,220,438,221,416,232,439,232,439,221,416,239,418,232,439,239,418,244,439,244,439,239,418,256,420,244,439,256,420,256,441,207,438,195,438,203,415,207,438,203,415,221,416,207,438,221,416,220,438,154,411,159,413,164,438,164,438,159,413,164,413,164,438,164,413,168,413,164,438,148,406,151,409,164,438,151,409,154,411,610,-76,151,383,577,-108,577,-108,151,383,149,385,577,-108,149,385,117,352,117,352,149,385,147,388,117,352,147,388,145,391,48,430,44,463,38,459,117,352,145,391,144,394,73,453,89,343,103,446,42,419,77,159,77,293,77,293,115,267,115,312,115,312,115,267,149,244,115,312,149,244,149,334,149,334,149,244,179,218,149,334,179,218,179,360,179,360,179,218,192,249,179,360,192,249,191,252,77,419,42,419,77,293,235,419,208,388,212,357,235,419,212,357,222,368,235,419,222,368,232,380,235,419,232,380,240,392,235,419,240,392,249,405,208,388,179,360,192,331,208,388,192,331,193,334,208,388,193,334,194,338,208,388,194,338,197,341,208,388,197,341,201,345,208,388,201,345,212,357,191,327,192,331,179,360,191,327,179,360,191,252,232,197,223,208,235,159,235,159,223,208,212,220,235,159,212,220,207,190,207,190,212,220,201,232,207,190,201,232,197,236,241,185,232,197,235,159,241,185,235,159,249,173,448,9,436,-1,441,-33,448,9,441,-33,469,-4,448,9,469,-4,451,13,571,-63,606,-63,571,62,571,62,571,69,533,88,571,62,533,88,533,43,533,43,533,88,500,111,533,43,500,111,500,20,500,20,500,111,469,137,500,20,469,137,469,-4,469,-4,469,137,457,102,457,27,457,23,469,-4,469,-4,457,23,456,20,469,-4,456,20,454,17,439,88,443,42,446,89,446,89,443,42,448,40,446,89,448,40,451,91,451,91,448,40,452,37,451,91,452,37,454,94,454,94,452, -37,456,32,454,94,456,32,456,98,456,98,456,32,457,27,456,98,457,27,457,102,571,62,606,-63,606,195,571,62,606,195,571,195,571,62,571,195,571,69,454,114,456,110,469,137,469,137,456,110,457,106,469,137,457,106,457,102,426,146,436,134,441,165,441,165,436,134,448,122,441,165,448,122,469,137,469,137,448,122,451,118,469,137,451,118,454,114,399,181,408,169,413,195,413,195,408,169,417,158,413,195,417,158,441,165,441,165,417,158,426,146,457,27,469,-4,457,102,436,-1,426,-13,441,-33,441,-33,426,-13,417,-24,441,-33,417,-24,413,-63,413,-63,417,-24,408,-37,413,-63,408,-37,399,-50,438,42,443,42,439,88,438,42,439,88,42,88,438,42,42,88,42,42,207,190,197,236,195,240,207,190,195,240,193,245,207,190,193,245,192,249,207,190,192,249,179,218,77,293,77,286,115,267,606,266,210,313,209,266,203,265,209,266,206,313,203,265,206,313,201,315,191,327,191,252,192,256,191,327,192,256,193,322,193,322,192,256,194,260,193,322,194,260,196,317,196,317,194,260,198,263,196,317,198,263,201,315,201,315,198,263,203,265,209,266,210,313,206,313,210,313,606,266,606,313,77,159,42,419,42,159,451,13,469,-4,454,17,215,6,168,52,188,-30,188,-30,168,52,138,110,188,-30,138,110,131,25,131,25,138,110,127,177,114,304,127,177,134,230,114,304,134,230,151,356,151,356,134,230,154,280,151,356,154,280,201,398,201,398,154,280,186,324,201,398,186,324,228,359,228,359,277,383,261,426,228,359,261,426,201,398,555,178,544,111,551,25,551,25,544,111,513,53,551,25,513,53,494,-30,494,-30,513,53,466,7,494,-30,466,7,423,-67,423,-67,466,7,407,-23,423,-67,407,-23,341,-80,341,-80,407,-23,340,-33,389,387,411,350,415,429,415,429,411,350,430,312,415,429,430,312,455,437,455,437,430,312,449,334,459,230,449,334,446,272,467,350,482,407,465,350,465,350,482,407,463,350,459,349,463,350,482,410,459,349,482,410,495,449,495,449,482,410,483,412,495,449,483,412,485,414,471,348,500,322,481,402,471,348,481,402,481,405,481,405,482,407,471,348,516,431,532,438,534,464,534,464,532,438,548,446,534,464,548,446,572,480,572,480,548,446,564,454,572,480,564,454,580, -463,492,419,494,421,495,449,495,449,494,421,497,422,495,449,497,422,534,464,534,464,497,422,500,423,534,464,500,423,516,431,495,449,485,414,487,416,495,449,487,416,489,418,495,449,489,418,492,419,482,407,467,350,468,349,482,407,468,349,470,348,482,407,470,348,471,348,482,410,463,350,482,407,455,437,449,334,450,339,455,437,450,339,452,344,455,437,452,344,455,347,455,437,455,347,459,349,455,437,459,349,495,449,449,334,430,312,446,272,389,387,415,429,373,427,389,387,373,427,365,427,389,387,365,427,362,420,508,377,498,386,500,322,500,322,498,386,487,395,500,322,487,395,485,396,590,250,577,285,588,96,588,96,577,285,560,318,588,96,560,318,555,178,555,178,551,25,588,96,560,318,538,348,540,254,560,318,540,254,551,216,560,318,551,216,555,178,529,358,519,368,523,290,529,358,523,290,540,254,529,358,540,254,538,348,508,377,500,322,523,290,508,377,523,290,519,368,500,322,485,396,483,398,500,322,483,398,482,400,500,322,482,400,481,402,590,250,588,96,601,178,590,250,601,178,598,215,474,254,469,271,477,237,477,237,469,271,464,288,477,237,464,288,459,230,459,230,464,288,459,304,459,230,459,304,453,321,459,230,453,321,452,324,459,230,452,324,451,327,459,230,451,327,450,329,459,230,450,329,449,332,459,230,449,332,449,334,273,-23,215,6,259,-67,273,-23,259,-67,341,-80,273,-23,341,-80,340,-33,114,304,90,243,95,96,114,304,95,96,131,25,114,304,131,25,127,177,95,96,90,243,81,178,215,6,188,-30,259,-67,215,7,169,53,188,-30,188,-30,169,53,138,111,188,-30,138,111,131,25,131,25,138,111,127,178,122,318,127,178,131,216,122,318,131,216,144,348,144,348,131,216,142,254,144,348,142,254,159,290,118,454,134,446,148,464,148,464,134,446,150,438,148,464,150,438,187,449,187,449,150,438,166,431,187,449,166,431,182,423,182,423,185,422,187,449,187,449,185,422,188,421,187,449,188,421,226,437,226,437,188,421,190,419,226,437,190,419,193,418,200,400,199,398,211,348,211,348,199,398,197,396,211,348,197,396,195,395,195,395,184,386,211,348,211,348,184,386,182,322,213,349,215,350,226,437,226,437,215,350,217,350,226,437,217,350,219,350,219, -350,223,349,226,437,226,437,223,349,227,347,226,437,227,347,267,429,267,429,227,347,230,344,267,429,230,344,231,339,231,329,231,327,236,272,236,272,231,327,230,324,236,272,230,324,229,321,229,321,223,304,236,272,236,272,223,304,223,230,309,427,267,429,271,350,309,427,271,350,293,387,309,427,293,387,320,420,309,427,320,420,317,427,232,332,236,272,232,334,232,334,236,272,267,429,267,429,236,272,252,312,267,429,252,312,271,350,232,334,267,429,231,339,226,437,193,418,195,416,226,437,195,416,197,414,226,437,197,414,199,412,226,437,199,412,200,410,226,437,200,410,201,407,226,437,201,407,201,405,226,437,201,405,211,348,226,437,211,348,212,349,226,437,212,349,213,349,211,348,201,405,201,402,211,348,201,402,200,400,110,480,102,463,118,454,110,480,118,454,148,464,223,230,223,304,218,288,223,230,218,288,213,271,223,230,213,271,208,254,223,230,208,254,205,237,184,386,173,377,182,322,182,322,173,377,163,368,182,322,163,368,159,290,159,290,163,368,153,358,159,290,153,358,144,348,555,177,544,110,551,25,551,25,544,110,514,52,551,25,514,52,494,-30,494,-30,514,52,467,6,494,-30,467,6,423,-67,423,-67,467,6,408,-23,423,-67,408,-23,341,-33,341,-33,274,-23,341,-80,341,-80,274,-23,259,-67,215,7,188,-30,259,-67,215,7,259,-67,274,-23,127,178,122,318,131,25,131,25,122,318,105,285,131,25,105,285,95,96,95,96,105,285,92,250,95,96,92,250,84,215,551,25,588,96,555,177,555,177,568,304,548,230,548,230,568,304,530,356,548,230,530,356,528,280,528,280,530,356,496,324,480,398,420,426,454,359,480,398,454,359,496,324,480,398,496,324,530,356,588,96,601,178,592,243,588,96,592,243,568,304,588,96,568,304,555,177,341,-33,341,-80,423,-67,454,359,420,426,405,383,95,96,84,215,81,178,231,329,236,272,232,332,185,205,180,210,130,232,130,232,180,210,178,216,130,232,178,216,169,269,169,269,178,216,177,223,207,307,177,223,182,237,207,307,182,237,196,255,246,346,207,307,215,278,246,346,215,278,238,303,246,346,238,303,263,330,630,154,630,200,207,200,630,154,207,200,193,201,630,154,193,201,87,195,630,154,87,195,38,157,630,154,38, -157,38,154,87,195,193,201,185,205,87,195,185,205,130,232,87,195,37,157,38,157,169,269,177,223,207,307,207,307,196,255,215,278,196,99,182,117,207,48,207,48,182,117,177,131,169,85,177,131,178,138,169,85,178,138,130,122,130,122,178,138,180,144,130,122,180,144,185,149,630,154,630,200,207,154,193,153,207,154,630,200,193,153,630,200,87,159,87,159,630,200,38,200,87,159,38,200,38,198,185,149,193,153,87,159,185,149,87,159,130,122,196,99,207,48,215,76,215,76,207,48,246,9,215,76,246,9,238,51,238,51,246,9,263,23,207,48,177,131,169,85,203,337,205,340,210,388,210,388,205,340,208,342,210,388,208,342,212,343,212,343,215,343,243,354,243,354,215,343,218,341,243,354,218,341,221,339,202,-108,202,325,182,424,182,424,202,325,202,332,182,424,202,332,210,388,210,388,202,332,203,337,159,463,155,463,202,-108,159,463,202,-108,182,424,282,292,295,283,309,297,282,292,309,297,276,324,282,292,276,324,268,302,228,333,241,321,243,354,243,354,241,321,255,311,243,354,255,311,276,324,276,324,255,311,268,302,225,337,228,333,243,354,225,337,243,354,221,339,243,354,210,388,212,343,202,-108,155,463,155,-108,136,339,139,341,147,388,147,388,139,341,142,343,147,388,142,343,145,343,145,343,149,342,147,388,147,388,149,342,175,424,147,388,114,354,116,321,147,388,116,321,129,333,147,388,129,333,132,337,147,388,132,337,136,339,62,283,75,292,81,324,81,324,75,292,89,302,81,324,89,302,114,354,114,354,89,302,102,311,114,354,102,311,116,321,81,324,48,297,62,283,152,340,154,337,175,424,175,424,154,337,155,332,175,424,155,332,155,325,202,-108,155,325,155,-108,202,-108,202,463,198,463,202,-108,198,463,175,424,202,-108,175,424,155,325,175,424,149,342,152,340,489,210,483,205,630,154,630,154,483,205,475,201,630,154,475,201,461,200,630,154,461,200,38,200,630,154,38,200,38,154,431,303,454,278,462,307,462,307,454,278,473,255,462,307,473,255,500,269,500,269,473,255,486,237,500,269,486,237,491,223,491,223,491,216,630,154,630,154,491,216,489,210,422,346,406,330,431,303,422,346,431,303,462,307,582,195,539,232,491,223,582,195,491,223,630, -154,582,195,630,154,630,157,491,223,539,232,500,269,630,200,38,200,461,154,630,200,461,154,475,153,630,200,475,153,483,149,630,200,483,149,489,144,630,200,489,144,491,138,630,200,491,138,491,131,630,200,491,131,582,159,630,200,582,159,630,198,491,131,500,85,539,122,491,131,539,122,582,159,454,76,462,48,473,99,473,99,462,48,500,85,473,99,500,85,486,117,486,117,500,85,491,131,431,51,406,23,422,9,431,51,422,9,462,48,431,51,462,48,454,76,461,154,38,200,38,154,205,14,203,18,210,-33,210,-33,203,18,202,23,210,-33,202,23,182,-69,182,-69,202,23,202,30,182,-69,202,30,202,463,159,-108,182,-69,202,463,159,-108,202,463,155,463,159,-108,155,463,155,-108,221,15,218,13,243,0,243,0,218,13,215,11,243,0,215,11,212,11,212,11,208,12,210,-33,210,-33,208,12,205,14,282,62,268,53,276,30,282,62,276,30,309,57,282,62,309,57,295,71,255,43,241,33,243,0,255,43,243,0,276,30,255,43,276,30,268,53,243,0,241,33,228,21,243,0,228,21,225,18,243,0,225,18,221,15,212,11,210,-33,243,0,139,12,147,-33,142,11,142,11,147,-33,145,10,149,11,145,10,147,-33,149,11,147,-33,175,-69,202,463,155,463,175,-69,202,463,175,-69,198,-108,202,463,198,-108,202,-108,175,-69,155,463,155,28,175,-69,155,28,155,21,175,-69,155,21,154,16,175,-69,154,16,152,13,175,-69,152,13,149,11,147,-33,139,12,136,14,147,-33,136,14,132,16,147,-33,132,16,129,20,147,-33,129,20,116,31,147,-33,116,31,114,0,75,61,62,70,81,29,75,61,81,29,89,51,89,51,81,29,114,0,89,51,114,0,102,42,102,42,114,0,116,31,81,29,62,70,48,56,50,69,50,69,89,88,89,88,50,69,89,43,89,88,89,43,124,111,124,111,89,43,124,20,124,111,124,20,156,137,156,137,124,20,157,-4,156,137,157,-4,166,102,166,102,157,-4,166,27,166,102,166,106,156,137,156,137,166,106,167,110,156,137,167,110,186,165,186,165,167,110,170,114,186,165,170,114,172,118,215,195,186,165,188,134,215,195,188,134,199,146,215,195,199,146,209,158,215,195,209,158,219,169,215,195,219,169,229,181,176,122,188,134,186,165,176, -122,186,165,172,118,209,-24,199,-13,215,-63,215,-63,199,-13,188,-1,215,-63,188,-1,187,-33,187,-33,188,-1,176,9,187,-33,176,9,172,13,593,42,593,88,185,42,185,42,593,88,184,88,185,42,184,88,180,42,180,42,184,88,178,89,180,42,178,89,175,40,175,40,178,89,172,91,175,40,172,91,170,37,170,37,172,91,169,94,170,37,169,94,167,32,167,32,169,94,166,98,167,32,166,98,166,102,219,-37,209,-24,215,-63,219,-37,215,-63,229,-50,481,245,479,240,493,218,493,218,479,240,477,236,493,218,477,236,473,232,473,232,461,220,463,190,463,190,461,220,450,208,463,190,450,208,440,197,434,159,463,190,440,197,434,159,440,197,430,185,434,159,430,185,420,173,480,338,482,334,493,360,493,360,482,334,483,331,493,360,483,331,483,327,483,327,483,252,493,218,493,218,483,252,482,249,483,252,483,327,482,256,482,256,483,327,482,322,482,256,482,322,480,260,480,260,482,322,478,317,480,260,478,317,477,263,477,263,478,317,474,315,477,263,474,315,472,265,472,265,474,315,469,313,472,265,469,313,465,266,465,266,469,313,464,313,450,368,462,357,462,388,462,388,462,357,473,345,462,388,473,345,493,360,493,360,473,345,477,341,493,360,477,341,480,338,420,405,430,392,434,419,434,419,430,392,440,380,434,419,440,380,462,388,462,388,440,380,450,368,599,286,599,293,561,267,561,267,599,293,561,312,561,267,561,312,525,244,525,244,561,312,525,334,525,244,525,334,493,218,493,218,525,334,493,360,493,218,493,360,483,327,473,232,463,190,493,218,56,313,56,266,465,266,56,313,465,266,464,313,166,23,166,27,157,-4,166,23,157,-4,167,20,167,20,157,-4,187,-33,167,20,187,-33,169,17,169,17,187,-33,172,13,166,102,166,27,167,32,481,245,493,218,482,249,89,43,50,69,50,62,301,38,307,-1,314,26,314,26,307,-1,335,-34,314,26,335,-34,327,13,327,13,335,-34,330,10,106,344,110,347,111,389,111,389,110,347,113,349,111,389,113,349,135,425,135,425,113,349,116,350,135,425,116,350,120,351,120,351,124,350,135,425,135,425,124,350,128,348,135,425,128,348,132,345,134,340,135,333,135,425,135,425,135,333,155,463,155,463,135,333,181,-101,155,463,181, --101,162,463,162,463,181,-101,181,332,162,463,181,332,182,425,182,425,181,332,182,339,182,425,182,339,184,344,102,341,106,344,111,389,102,341,111,389,90,328,90,328,111,389,83,356,90,328,83,356,77,316,77,316,83,356,63,305,53,326,22,298,35,284,53,326,35,284,49,294,53,326,49,294,63,305,53,326,63,305,83,356,184,344,187,348,206,389,206,389,187,348,191,349,206,389,191,349,195,350,195,350,199,350,206,389,206,389,199,350,203,348,206,389,203,348,207,346,241,316,255,304,264,325,264,325,255,304,268,293,264,325,268,293,295,297,295,297,268,293,282,283,234,356,206,389,207,346,234,356,207,346,211,344,234,356,211,344,215,340,234,356,215,340,228,328,234,356,228,328,241,316,234,356,241,316,264,325,356,10,352,6,359,-70,359,-70,352,6,348,4,359,-70,348,4,344,3,344,3,340,4,359,-70,359,-70,340,4,337,5,359,-70,337,5,335,-34,335,-34,337,5,334,7,335,-34,334,7,330,10,408,11,406,16,406,-70,406,-70,406,16,405,23,405,23,405,456,386,-108,386,-108,405,456,379,-108,405,456,359,456,379,-108,379,-108,359,456,359,22,379,-108,359,22,359,-70,359,-70,359,22,358,15,359,-70,358,15,356,10,431,8,427,6,430,-34,430,-34,427,6,423,4,430,-34,423,4,420,4,420,4,415,5,430,-34,430,-34,415,5,412,7,430,-34,412,7,408,11,465,39,452,27,458,-1,458,-1,452,27,439,14,458,-1,439,14,435,11,492,61,479,50,488,28,492,61,488,28,520,57,492,61,520,57,506,71,465,39,458,-1,488,28,465,39,488,28,479,50,431,8,430,-34,458,-1,431,8,458,-1,435,11,287,50,273,61,277,28,287,50,277,28,307,-1,287,50,307,-1,301,38,259,70,245,57,277,28,259,70,277,28,273,61,135,333,135,-101,181,-101,406,-70,405,23,386,-108,408,11,406,-70,430,-34,182,425,184,344,206,389,135,425,132,345,134,340,172,236,170,240,186,190,186,190,170,240,167,245,186,190,167,245,156,218,156,218,167,245,166,249,156,218,166,249,166,252,167,334,169,338,187,388,187,388,169,338,172,341,187,388,172,341,176,345,176,345,188,357,187,388,187,388,188,357,215,419,166,252,166,327,157,360,166,252,157,360,156,218,156,218,157,360,124, -334,156,218,124,334,124,244,124,244,124,334,89,312,124,244,89,312,89,267,89,267,89,312,50,293,89,267,50,293,50,286,157,360,166,327,166,331,157,360,166,331,167,334,157,360,167,334,187,388,215,419,188,357,199,368,215,419,199,368,209,380,215,419,209,380,219,392,215,419,219,392,229,405,215,159,229,173,219,185,215,159,219,185,209,197,215,159,209,197,199,208,215,159,199,208,188,220,215,159,188,220,186,190,482,20,480,17,493,-4,493,-4,480,17,477,13,493,-4,477,13,473,9,473,9,462,-1,462,-33,462,-33,462,-1,450,-13,462,-33,450,-13,440,-24,434,-63,462,-33,440,-24,434,-63,440,-24,430,-37,434,-63,430,-37,420,-50,440,158,450,146,463,165,463,165,450,146,461,134,463,165,461,134,473,122,473,122,477,118,493,137,493,137,477,118,479,114,493,137,479,114,481,110,434,195,420,181,430,169,434,195,430,169,440,158,434,195,440,158,463,165,481,110,482,106,493,137,493,137,482,106,483,102,493,137,483,102,493,-4,493,-4,483,102,483,27,483,27,483,102,482,98,483,27,482,98,482,32,482,32,482,98,480,94,482,32,480,94,478,37,478,37,480,94,477,91,478,37,477,91,474,40,474,40,477,91,472,89,474,40,472,89,469,42,469,42,472,89,465,88,483,27,483,23,493,-4,473,9,462,-33,493,-4,493,137,525,20,525,111,525,111,525,20,561,43,525,111,561,43,561,88,561,88,561,43,599,62,561,88,599,62,599,69,493,137,463,165,473,122,464,42,469,42,465,88,464,42,465,88,56,88,464,42,56,88,56,42,176,232,172,236,186,190,176,232,186,190,188,220,593,266,185,313,184,266,178,265,184,266,180,313,178,265,180,313,175,315,166,327,166,252,166,256,166,327,166,256,167,322,167,322,166,256,169,260,167,322,169,260,170,317,170,317,169,260,172,263,170,317,172,263,175,315,175,315,172,263,178,265,184,266,185,313,180,313,185,313,593,266,593,313,493,137,493,-4,525,20,482,20,493,-4,483,23,173,151,145,127,166,106,166,106,145,127,166,102,166,27,166,102,156,-4,156,-4,166,102,145,127,156,-4,145,127,123,20,123,20,145,127,115,105,123,20,115,105,88,43,88,43,115,105,83,85,88,43,83,85,49,69,49,293,84,269,88,312,88, -312,84,269,115,250,88,312,115,250,124,334,124,334,115,250,145,228,124,334,145,228,156,360,156,360,145,228,166,247,156,360,166,247,166,251,202,207,192,217,198,177,198,177,192,217,183,225,198,177,183,225,175,233,175,233,171,237,173,204,173,204,171,237,169,240,173,204,169,240,167,244,166,247,145,228,173,204,166,247,173,204,167,244,209,-24,199,-13,215,-63,215,-63,199,-13,188,-1,215,-63,188,-1,187,-33,187,-33,188,-1,176,9,187,-33,176,9,172,13,202,207,198,177,203,150,202,207,203,150,214,194,214,194,203,150,214,163,214,194,214,163,227,177,175,233,173,204,198,177,198,177,173,151,176,122,198,177,176,122,184,131,198,177,184,131,193,140,198,177,193,140,203,150,167,110,170,114,173,151,173,151,170,114,172,118,173,151,172,118,176,122,167,334,170,338,187,389,187,389,170,338,172,342,187,389,172,342,176,346,176,346,188,358,187,389,187,389,188,358,216,420,166,327,166,330,156,360,166,327,156,360,166,251,167,334,187,389,156,360,167,334,156,360,166,330,216,420,188,358,199,370,216,420,199,370,210,381,216,420,210,381,220,393,216,420,220,393,230,406,166,102,166,31,166,98,166,98,166,31,168,35,166,98,168,35,169,94,169,94,168,35,172,39,169,94,172,39,172,91,172,91,172,39,177,41,172,91,177,41,178,89,178,89,177,41,184,42,178,89,184,42,184,88,184,88,184,42,599,42,184,88,599,42,599,88,184,313,178,313,179,265,184,313,179,265,184,266,184,313,184,266,599,266,184,313,599,266,599,313,179,265,178,313,174,262,174,262,178,313,172,315,174,262,172,315,170,259,170,259,172,315,169,319,170,259,169,319,167,255,167,255,169,319,166,322,167,255,166,322,166,327,166,327,166,251,167,255,219,-37,209,-24,215,-63,219,-37,215,-63,229,-50,166,23,166,27,156,-4,166,23,156,-4,167,20,167,20,156,-4,187,-33,167,20,187,-33,169,17,169,17,187,-33,172,13,84,269,49,293,49,286,166,102,166,27,166,31,88,43,49,69,49,62,173,151,166,106,167,110,128,344,136,425,124,346,124,346,136,425,120,347,116,346,120,347,136,425,116,346,136,425,113,389,128,344,132,341,136,425,136,425,132,341,134,336,136,425,134,336,135,329,181,-108,135, -329,135,-108,113,389,88,356,91,325,113,389,91,325,102,337,113,389,102,337,106,340,113,389,106,340,110,343,113,389,110,343,113,345,113,389,113,345,116,346,42,284,55,293,59,326,59,326,55,293,68,303,59,326,68,303,88,356,88,356,68,303,79,314,88,356,79,314,91,325,59,326,29,298,42,284,178,429,162,463,181,-108,178,429,181,-108,181,328,178,429,181,328,182,335,178,429,182,335,198,397,184,340,187,344,198,397,198,397,187,344,191,346,198,397,191,346,195,347,195,347,199,346,198,397,198,397,199,346,220,367,181,-108,162,463,155,463,181,-108,155,463,136,425,181,-108,136,425,135,329,243,309,255,298,244,339,244,339,255,298,270,313,297,339,270,313,270,285,297,339,270,285,287,299,211,340,215,337,220,367,220,367,215,337,224,328,220,367,224,328,244,339,244,339,224,328,233,319,244,339,233,319,243,309,220,367,199,346,203,345,220,367,203,345,207,343,220,367,207,343,211,340,300,310,310,320,321,367,321,367,310,320,319,329,321,367,319,329,327,338,327,338,330,341,343,397,343,397,330,341,334,344,343,397,334,344,337,346,297,339,287,299,300,310,297,339,300,310,321,367,352,343,362,429,348,346,348,346,362,429,344,347,340,347,344,347,343,397,340,347,343,397,337,346,343,397,321,367,327,338,352,343,356,338,362,429,362,429,356,338,358,333,362,429,358,333,359,329,405,-108,359,329,359,-108,362,429,343,397,344,347,405,425,386,463,405,-108,405,425,405,-108,405,328,405,425,405,328,406,335,405,425,406,335,427,389,408,340,412,344,427,389,427,389,412,344,415,346,427,389,415,346,420,347,420,347,423,346,427,389,427,389,423,346,427,345,427,389,427,345,431,343,463,313,474,303,482,325,482,325,474,303,486,293,482,325,486,293,513,297,513,297,486,293,499,283,453,356,427,389,431,343,453,356,431,343,435,340,453,356,435,340,439,337,453,356,439,337,451,325,453,356,451,325,463,313,453,356,463,313,482,325,405,-108,386,463,379,463,405,-108,379,463,362,429,405,-108,362,429,359,329,270,313,255,298,270,285,427,389,406,335,408,340,198,397,182,335,184,340,475,151,449,177,455,140,456,217,449,177,475,204,456,217,475,204,465,225,465,225,475,204,473,233,477,237,473,233,475, -204,477,237,475,204,503,228,465,266,469,265,471,313,465,266,471,313,464,313,465,266,464,313,49,313,465,266,49,313,49,266,481,20,479,17,492,-4,492,-4,479,17,476,13,492,-4,476,13,473,9,473,9,461,-1,462,-33,462,-33,461,-1,449,-13,462,-33,449,-13,439,-24,434,-63,462,-33,439,-24,434,-63,439,-24,429,-37,434,-63,429,-37,420,-50,503,127,475,151,476,118,476,118,475,151,473,122,464,131,473,122,475,151,464,131,475,151,455,140,438,381,449,370,461,389,461,389,449,370,460,358,461,389,460,358,473,346,473,346,476,342,492,360,492,360,476,342,479,338,492,360,479,338,481,334,433,420,419,406,428,393,433,420,428,393,438,381,433,420,438,381,461,389,445,150,455,140,449,177,445,150,449,177,446,207,445,150,446,207,434,194,445,150,434,194,434,162,481,20,492,-4,482,23,482,23,492,-4,482,27,482,102,492,-4,503,127,503,127,492,-4,525,20,503,127,525,20,533,105,533,105,525,20,561,43,533,105,561,43,565,85,565,85,561,43,599,62,565,85,599,62,599,69,464,88,465,42,471,89,471,89,465,42,471,41,471,89,471,41,476,91,476,91,471,41,476,39,476,91,476,39,479,94,479,94,476,39,480,35,479,94,480,35,481,98,481,98,480,35,481,31,481,98,481,31,482,102,482,102,481,31,482,27,482,27,492,-4,482,102,473,9,462,-33,492,-4,479,114,481,110,503,127,503,127,481,110,482,106,503,127,482,106,482,102,481,334,482,330,492,360,492,360,482,330,482,327,492,360,482,327,503,228,503,228,482,327,482,251,482,251,482,247,503,228,503,228,482,247,481,244,503,228,481,244,479,240,482,251,482,327,481,322,482,251,481,322,481,255,481,255,481,322,479,319,481,255,479,319,478,259,478,259,479,319,476,315,478,259,476,315,474,262,474,262,476,315,471,313,474,262,471,313,469,265,492,360,461,389,473,346,492,360,503,228,525,334,525,334,503,228,533,250,525,334,533,250,561,312,561,312,533,250,565,269,561,312,565,269,599,293,599,293,565,269,599,286,49,88,49,42,465,42,49,88,465,42,464,88,449,177,456,217,446,207,477,237,503,228,479,240,503,127,476,118,479,114,434,162,434,194,420,177,113,9,110,11,113,-34,113,-34,110,11,106,14,113, --34,106,14,102,17,102,17,91,29,113,-34,113,-34,91,29,88,-1,132,14,128,10,136,-70,136,-70,128,10,124,8,136,-70,124,8,120,8,120,8,116,8,136,-70,136,-70,116,8,113,-34,181,463,135,463,136,-70,181,463,136,-70,155,-108,181,463,155,-108,162,-108,181,463,162,-108,178,-74,181,463,178,-74,181,26,136,-70,135,463,135,25,136,-70,135,25,134,18,136,-70,134,18,132,14,91,29,79,40,88,-1,88,-1,79,40,68,51,88,-1,68,51,59,28,59,28,68,51,55,61,59,28,55,61,42,70,187,11,198,-42,191,8,191,8,198,-42,195,8,199,8,195,8,198,-42,199,8,198,-42,220,-13,207,11,220,-13,211,14,211,14,220,-13,215,17,224,26,215,17,220,-13,224,26,220,-13,244,14,319,25,310,34,321,-12,321,-12,310,34,300,44,321,-12,300,44,297,15,297,15,300,44,287,55,297,15,287,55,270,41,270,41,287,55,270,70,270,41,270,70,255,56,270,41,255,56,244,14,244,14,255,56,243,45,244,14,243,45,233,35,327,17,319,25,321,-12,327,17,321,-12,343,-42,327,17,343,-42,330,14,356,16,352,12,362,-74,362,-74,352,12,348,9,362,-74,348,9,344,8,344,8,340,8,343,-42,343,-42,340,8,337,9,343,-42,337,9,334,11,405,463,359,463,362,-74,405,463,362,-74,379,-108,405,463,379,-108,386,-108,405,463,386,-108,405,-70,405,463,405,-70,405,26,362,-74,359,463,359,25,362,-74,359,25,358,21,362,-74,358,21,356,16,344,8,343,-42,362,-74,431,11,427,9,427,-34,427,-34,427,9,423,8,427,-34,423,8,420,8,420,8,415,8,427,-34,427,-34,415,8,412,11,427,-34,412,11,408,14,486,62,474,51,482,28,482,28,474,51,463,41,482,28,463,41,453,-1,453,-1,463,41,451,29,453,-1,451,29,439,17,439,17,435,14,453,-1,453,-1,435,14,431,11,453,-1,431,11,427,-34,513,57,499,71,486,62,513,57,486,62,482,28,406,19,405,26,405,-70,406,19,405,-70,427,-34,406,19,427,-34,408,14,203,9,199,8,220,-13,203,9,220,-13,207,11,181,26,178,-74,182,19,182,19,178,-74,198,-42,182,19,198,-42,184,14,184,14,198,-42,187,11,330,14,343,-42,334,11,224,26,244,14,233,35,59,28,42,70,29,57,113,9,113, --34,116,8,176,272,172,273,125,279,125,279,172,273,170,276,125,279,170,276,158,311,158,311,170,276,170,280,201,323,211,337,216,377,216,377,211,337,220,350,216,377,220,350,230,364,201,323,216,377,191,310,191,310,216,377,189,345,191,310,189,345,179,297,179,297,189,345,176,293,189,345,158,311,170,283,189,345,170,283,171,287,189,345,171,287,173,290,189,345,173,290,176,293,599,224,599,270,188,270,599,224,188,270,181,271,599,224,181,271,88,250,599,224,88,250,49,227,599,224,49,227,49,224,125,279,88,250,181,271,125,279,181,271,176,272,477,68,475,65,490,43,490,43,475,65,472,61,490,43,472,61,469,57,469,57,457,44,460,9,460,9,457,44,447,31,460,9,447,31,437,18,428,4,419,-9,433,-22,428,4,433,-22,437,18,437,18,433,-22,460,9,599,130,49,130,461,84,599,130,461,84,468,84,599,130,468,84,473,83,599,130,473,83,476,81,599,130,476,81,478,78,599,130,478,78,479,74,599,130,479,74,560,104,599,130,560,104,599,127,479,74,490,43,524,75,479,74,524,75,560,104,478,71,477,68,490,43,478,71,490,43,479,74,469,57,460,9,490,43,461,84,49,130,49,84,170,283,158,311,170,280,476,273,473,272,599,224,599,224,473,272,468,271,599,224,468,271,461,270,599,224,461,270,49,270,599,224,49,270,49,224,475,290,477,287,490,311,490,311,477,287,478,283,490,311,478,283,479,280,479,280,478,276,599,224,599,224,478,276,476,273,447,323,457,310,460,345,460,345,457,310,469,297,460,345,469,297,490,311,490,311,469,297,472,293,490,311,472,293,475,290,419,364,428,350,433,377,433,377,428,350,437,337,433,377,437,337,460,345,460,345,437,337,447,323,560,250,524,279,479,280,560,250,479,280,599,224,560,250,599,224,599,227,173,65,171,68,189,9,189,9,171,68,170,71,189,9,170,71,158,43,158,43,170,71,170,74,599,84,599,130,188,84,181,84,188,84,599,130,181,84,599,130,88,104,88,104,599,130,49,130,88,104,49,130,49,127,211,18,201,31,216,-22,216,-22,201,31,191,44,216,-22,191,44,189,9,189,9,191,44,179,57,189,9,179,57,176,61,170,78,172,81,125,75,170,78,125,75,158,43,170,78,158,43,170, -74,125,75,172,81,176,83,125,75,176,83,181,84,125,75,181,84,88,104,220,4,211,18,216,-22,220,4,216,-22,230,-9,173,65,189,9,176,61,479,280,524,279,490,311,263,270,257,271,463,224,463,224,257,271,163,224,149,216,163,224,197,297,149,216,197,297,145,257,197,297,163,224,257,271,197,297,257,271,252,274,197,297,252,274,248,278,197,297,248,278,246,282,197,297,246,282,245,286,197,297,245,286,248,340,145,257,93,219,94,135,145,257,94,135,123,187,145,257,123,187,129,197,145,257,129,197,138,207,145,257,138,207,149,216,138,148,129,158,146,97,146,97,129,158,123,167,146,97,123,167,94,135,94,135,123,167,121,177,42,180,42,173,94,135,42,180,94,135,93,219,247,57,246,62,249,15,249,15,246,62,245,69,198,57,245,69,246,72,198,57,246,72,248,77,298,386,248,340,251,304,298,386,251,304,255,309,298,386,255,309,260,314,298,386,260,314,271,325,298,386,271,325,282,337,298,386,282,337,292,348,298,386,292,348,303,360,298,386,303,360,313,372,248,340,245,286,246,293,248,340,246,293,248,299,248,340,248,299,251,304,138,148,146,97,149,139,149,139,146,97,198,57,149,139,198,57,162,130,162,130,198,57,257,83,162,130,257,83,420,130,420,130,257,83,263,84,420,130,263,84,399,84,252,80,257,83,198,57,252,80,198,57,248,77,463,224,420,130,438,84,463,224,438,84,459,130,463,224,459,130,502,224,463,224,502,224,484,270,463,224,484,270,263,270,522,270,576,386,537,386,522,270,537,386,502,224,522,270,502,224,606,224,522,270,606,224,606,270,399,84,347,-29,386,-29,399,84,386,-29,438,84,399,84,438,84,420,130,459,130,438,84,606,84,459,130,606,84,606,130,247,57,249,15,250,51,250,51,249,15,298,-30,250,51,298,-30,255,46,255,46,298,-30,261,39,298,-30,313,-16,302,-4,298,-30,302,-4,290,9,298,-30,290,9,278,22,298,-30,278,22,268,32,298,-30,268,32,261,39,249,15,245,69,198,57,484,270,502,224,537,386,123,187,94,135,121,177,237,362,184,315,206,294,206,294,184,315,202,284,204,278,202,284,184,315,204,278,184,315,134,224,237,362,206,294,215,306,237,362,215,306,228,320,237,362,228,320,241,333,237, -362,241,333,252,346,184,40,237,-6,206,61,184,40,206,61,204,71,204,71,205,77,184,40,184,40,205,77,133,130,184,40,133,130,131,85,131,85,133,130,120,139,131,85,120,139,109,149,207,81,212,83,299,130,299,130,212,83,219,84,299,130,219,84,228,84,299,130,228,84,291,84,299,130,291,84,311,-6,311,-6,291,84,275,-6,133,130,205,77,207,81,133,130,207,81,299,130,109,149,100,158,131,85,131,85,100,158,94,168,131,85,94,168,82,124,82,124,94,168,92,177,316,224,299,130,311,-6,316,224,311,-6,327,84,316,224,327,84,323,270,316,224,323,270,226,270,316,224,226,270,219,271,316,224,219,271,213,272,316,224,213,272,207,274,316,224,207,274,134,224,340,362,323,270,327,84,340,362,327,84,334,130,340,362,334,130,352,224,340,362,352,224,359,270,340,362,359,270,376,362,237,-6,252,9,237,26,237,-6,237,26,224,40,237,-6,224,40,213,51,237,-6,213,51,206,61,553,167,567,124,555,177,555,177,567,124,568,231,568,231,567,124,607,154,568,231,607,154,607,200,607,200,607,154,634,173,607,200,634,173,634,180,539,206,547,196,568,231,568,231,547,196,553,187,568,231,553,187,555,177,539,206,568,231,527,215,527,215,568,231,520,270,527,215,520,270,515,224,515,224,520,270,467,315,515,224,467,315,441,285,441,285,467,315,438,299,515,224,441,285,441,281,515,224,441,281,439,277,515,224,439,277,435,274,515,224,435,274,429,271,515,224,429,271,422,270,515,224,422,270,359,270,515,224,359,270,352,224,395,345,406,334,414,362,414,362,406,334,418,323,414,362,418,323,467,315,467,315,418,323,430,311,467,315,430,311,438,299,514,130,443,73,465,41,514,130,465,41,518,86,514,130,438,82,441,80,514,130,441,80,443,77,514,130,443,77,443,73,465,41,443,73,439,60,465,41,439,60,430,46,514,130,334,130,422,84,514,130,422,84,432,84,514,130,432,84,438,82,567,124,553,167,547,157,567,124,547,157,538,148,567,124,538,148,527,139,567,124,527,139,518,86,527,139,514,130,518,86,418,32,405,19,414,-6,418,32,414,-6,465,41,418,32,465,41,430,46,41,201,14,180,41,155,41,201,41,155,82,232,82,232,41,155,82,124,82,232,82, -124,92,177,130,271,82,232,95,187,130,271,95,187,101,197,130,271,101,197,109,207,130,271,109,207,121,216,130,271,121,216,134,224,130,271,134,224,184,315,41,155,14,180,14,173,82,232,92,177,95,187,414,-6,405,19,395,8,422,84,334,130,327,84,134,224,207,274,204,278,400,278,397,274,486,224,486,224,397,274,392,271,486,224,392,271,385,270,486,224,385,270,248,270,486,224,248,270,227,224,227,224,248,270,263,386,227,224,263,386,209,270,401,57,398,51,400,15,400,15,398,51,393,46,400,15,393,46,387,39,393,309,397,304,400,340,400,340,397,304,401,299,400,340,401,299,451,297,451,297,401,299,402,293,451,297,402,293,403,286,403,286,402,282,486,224,486,224,402,282,400,278,400,340,350,386,356,348,400,340,356,348,367,337,400,340,367,337,377,325,400,340,377,325,388,314,400,340,388,314,393,309,403,69,403,62,451,57,403,69,451,57,487,130,403,69,487,130,402,72,402,72,487,130,400,77,400,77,487,130,397,80,188,224,163,84,184,130,184,130,163,84,385,84,184,130,385,84,487,130,487,130,385,84,392,83,487,130,392,83,397,80,525,167,519,158,554,135,554,135,519,158,510,148,554,135,510,148,503,97,503,97,510,148,499,139,503,97,499,139,487,130,555,219,503,257,510,207,555,219,510,207,519,197,555,219,519,197,525,187,555,219,525,187,527,177,555,219,527,177,554,135,555,219,554,135,606,173,555,219,606,173,606,180,525,167,554,135,527,177,503,257,451,297,486,224,503,257,486,224,499,216,503,257,499,216,510,207,403,286,486,224,451,297,487,130,451,57,503,97,401,57,400,15,451,57,401,57,451,57,403,62,400,15,387,39,380,32,400,15,380,32,370,22,400,15,370,22,359,9,400,15,359,9,350,-30,346,-4,335,-16,350,-30,346,-4,350,-30,359,9,350,386,335,372,346,360,350,386,346,360,356,348,124,84,73,-30,111,-30,124,84,111,-30,163,84,124,84,163,84,145,130,124,84,145,130,42,130,124,84,42,130,42,84,188,224,184,130,227,224,188,224,227,224,209,270,188,224,209,270,42,270,188,224,42,270,42,224,145,130,163,84,188,224,263,386,248,270,301,386,138,148,129,158,146,97,146,97,129,158,123,167,146,97,123,167,94, -135,94,135,123,167,121,177,606,270,263,270,606,224,606,224,263,270,163,224,149,216,163,224,197,297,149,216,197,297,145,257,197,297,163,224,257,271,197,297,257,271,252,274,197,297,252,274,248,278,197,297,248,278,246,282,197,297,246,282,245,286,197,297,245,286,248,340,145,257,93,219,94,135,145,257,94,135,123,187,145,257,123,187,129,197,145,257,129,197,138,207,145,257,138,207,149,216,42,180,42,173,94,135,42,180,94,135,93,219,247,57,246,62,249,15,249,15,246,62,245,69,198,57,245,69,246,72,198,57,246,72,248,77,245,286,246,293,248,340,298,386,248,340,251,304,298,386,251,304,255,309,298,386,255,309,260,314,298,386,260,314,271,325,298,386,271,325,282,337,298,386,282,337,292,348,298,386,292,348,303,360,298,386,303,360,313,372,248,340,246,293,248,299,248,340,248,299,251,304,248,77,252,80,198,57,198,57,252,80,257,83,198,57,257,83,162,130,162,130,257,83,263,84,162,130,263,84,606,130,606,130,263,84,606,84,149,139,138,148,146,97,149,139,146,97,198,57,149,139,198,57,162,130,247,57,249,15,250,51,250,51,249,15,298,-30,250,51,298,-30,255,46,255,46,298,-30,261,39,298,-30,313,-16,302,-4,298,-30,302,-4,290,9,298,-30,290,9,278,22,298,-30,278,22,268,32,298,-30,268,32,261,39,163,224,263,270,257,271,249,15,245,69,198,57,123,187,94,135,121,177,139,257,160,360,135,259,135,259,160,360,131,260,125,260,131,260,160,360,125,260,160,360,120,308,147,242,193,-108,160,360,160,360,193,-108,193,344,160,360,193,344,198,412,198,412,193,344,202,357,198,412,202,357,237,463,237,463,202,357,211,368,237,463,211,368,220,377,160,360,139,257,143,254,160,360,143,254,146,249,160,360,146,249,147,242,120,308,78,257,85,228,120,308,85,228,95,238,120,308,95,238,102,245,120,308,102,245,109,251,120,308,109,251,114,255,120,308,114,255,120,258,120,308,120,258,125,260,78,257,31,207,45,192,78,257,45,192,58,203,78,257,58,203,72,216,78,257,72,216,85,228,244,463,240,384,250,382,244,463,250,382,282,412,282,412,250,382,260,377,282,412,260,377,269,368,237,463,220,377,230,382,237,463,230,382,240,384,237, -463,240,384,244,463,269,368,278,356,282,412,282,412,278,356,287,343,320,360,287,343,333,-108,320,360,333,-108,333,242,337,254,341,257,360,308,360,308,341,257,345,259,360,308,345,259,348,260,348,260,355,260,360,308,360,308,355,260,361,258,360,308,361,258,402,257,402,257,361,258,366,256,402,257,366,256,371,251,402,257,371,251,377,245,377,245,388,235,402,257,402,257,388,235,399,224,402,257,399,224,411,213,448,207,402,257,411,213,448,207,411,213,423,203,448,207,423,203,434,192,334,249,337,254,360,308,334,249,360,308,320,360,334,249,320,360,333,242,287,343,287,-108,333,-108,282,412,287,343,320,360,193,-108,147,242,147,-108,400,278,397,274,486,224,486,224,397,274,392,271,486,224,392,271,385,270,486,224,385,270,42,270,486,224,42,270,42,224,401,57,398,51,400,15,400,15,398,51,393,46,400,15,393,46,387,39,393,309,397,304,400,340,400,340,397,304,401,299,400,340,401,299,451,297,451,297,401,299,402,293,451,297,402,293,403,286,403,286,402,282,486,224,486,224,402,282,400,278,400,340,350,386,356,348,400,340,356,348,367,337,400,340,367,337,377,325,400,340,377,325,388,314,400,340,388,314,393,309,403,69,403,62,451,57,403,69,451,57,487,130,403,69,487,130,402,72,402,72,487,130,400,77,400,77,487,130,397,80,487,130,42,130,385,84,487,130,385,84,392,83,487,130,392,83,397,80,525,167,519,158,554,135,554,135,519,158,510,148,554,135,510,148,503,97,503,97,510,148,499,139,503,97,499,139,487,130,555,219,503,257,510,207,555,219,510,207,519,197,555,219,519,197,525,187,555,219,525,187,527,177,555,219,527,177,554,135,555,219,554,135,606,173,555,219,606,173,606,180,525,167,554,135,527,177,503,257,451,297,486,224,503,257,486,224,499,216,503,257,499,216,510,207,403,286,486,224,451,297,487,130,451,57,503,97,401,57,400,15,451,57,401,57,451,57,403,62,400,15,387,39,380,32,400,15,380,32,370,22,400,15,370,22,359,9,400,15,359,9,350,-30,346,-4,335,-16,350,-30,346,-4,350,-30,359,9,350,386,335,372,346,360,350,386,346,360,356,348,385,84,42,130,42,84,143,100,139,96,160,-5,160,-5,139,96,135,94,160,-5,135, -94,131,94,131,94,125,94,160,-5,160,-5,125,94,120,46,220,-21,211,-13,237,-108,237,-108,211,-13,202,-1,237,-108,202,-1,198,-57,198,-57,202,-1,193,10,198,-57,193,10,160,-5,193,463,147,463,160,-5,193,463,160,-5,193,10,160,-5,147,463,147,112,160,-5,147,112,146,105,160,-5,146,105,143,100,120,46,125,94,120,96,120,46,120,96,114,99,120,46,114,99,109,104,120,46,109,104,102,110,120,46,102,110,95,117,120,46,95,117,85,127,120,46,85,127,78,97,78,97,85,127,72,138,78,97,72,138,58,151,78,97,58,151,45,162,78,97,45,162,31,147,220,-21,237,-108,230,-27,230,-27,237,-108,240,-29,250,-27,240,-29,244,-108,250,-27,244,-108,282,-57,341,96,337,100,360,46,360,46,337,100,334,105,360,46,334,105,320,-5,320,-5,334,105,333,112,320,-5,333,112,333,463,333,463,287,463,320,-5,320,-5,287,463,287,11,320,-5,287,11,282,-57,282,-57,287,11,278,-1,282,-57,278,-1,269,-12,260,-21,250,-27,282,-57,260,-21,282,-57,269,-12,371,103,366,99,402,97,402,97,366,99,361,96,402,97,361,96,360,46,360,46,361,96,355,94,360,46,355,94,348,94,348,94,345,94,360,46,360,46,345,94,341,96,399,130,388,120,402,97,402,97,388,120,377,109,402,97,377,109,371,103,448,147,434,162,423,151,448,147,423,151,411,141,448,147,411,141,402,97,240,-29,237,-108,244,-108,399,130,402,97,411,141,237,362,184,315,206,294,206,294,184,315,202,284,204,278,202,284,184,315,204,278,184,315,134,224,237,362,206,294,215,306,237,362,215,306,228,320,237,362,228,320,241,333,237,362,241,333,252,346,184,40,237,-6,206,61,184,40,206,61,204,71,204,71,205,77,184,40,184,40,205,77,133,130,184,40,133,130,131,85,131,85,133,130,120,139,131,85,120,139,109,149,205,77,207,81,133,130,133,130,207,81,212,83,133,130,212,83,514,130,514,130,212,83,219,84,514,130,219,84,228,84,514,130,228,84,422,84,514,130,422,84,432,84,237,-6,252,9,237,26,237,-6,237,26,224,40,237,-6,224,40,213,51,237,-6,213,51,206,61,439,277,435,274,515,224,515,224,435,274,429,271,515,224,429,271,422,270,515,224,422,270,226,270,515,224,226,270,219, -271,418,323,430,311,467,315,467,315,430,311,438,299,467,315,438,299,441,285,441,285,441,281,515,224,515,224,441,281,439,277,414,362,395,345,406,334,414,362,406,334,418,323,414,362,418,323,467,315,514,130,443,73,465,41,514,130,465,41,518,86,514,130,438,82,441,80,514,130,441,80,443,77,514,130,443,77,443,73,465,41,443,73,439,60,465,41,439,60,430,46,109,149,100,158,131,85,131,85,100,158,94,168,131,85,94,168,82,124,82,124,94,168,92,177,567,124,607,154,568,231,567,124,568,231,555,177,567,124,555,177,553,167,567,124,553,167,547,157,567,124,547,157,538,148,567,124,538,148,527,139,567,124,527,139,518,86,527,139,514,130,518,86,539,206,547,196,568,231,568,231,547,196,553,187,568,231,553,187,555,177,418,32,405,19,414,-6,418,32,414,-6,465,41,418,32,465,41,430,46,607,200,568,231,607,154,607,200,607,154,634,173,607,200,634,173,634,180,539,206,568,231,527,215,527,215,568,231,520,270,527,215,520,270,515,224,515,224,520,270,467,315,515,224,467,315,441,285,134,224,515,224,219,271,134,224,219,271,213,272,134,224,213,272,207,274,134,224,207,274,204,278,41,201,14,180,41,155,41,201,41,155,82,232,82,232,41,155,82,124,82,232,82,124,92,177,130,271,82,232,95,187,130,271,95,187,101,197,130,271,101,197,109,207,130,271,109,207,121,216,130,271,121,216,134,224,130,271,134,224,184,315,41,155,14,180,14,173,82,232,92,177,95,187,414,-6,405,19,395,8,514,130,432,84,438,82,143,52,139,49,160,-52,160,-52,139,49,135,47,160,-52,135,47,131,46,131,46,125,47,160,-52,160,-52,125,47,120,0,139,305,160,407,135,307,135,307,160,407,131,308,125,307,131,308,160,407,125,307,160,407,120,356,193,-36,193,391,160,-52,160,-52,193,391,160,407,160,-52,160,407,147,290,147,290,160,407,146,297,160,407,139,305,143,302,160,407,143,302,146,297,120,356,78,305,85,275,120,356,85,275,95,285,120,356,95,285,102,292,120,356,102,292,109,298,120,356,109,298,114,303,120,356,114,303,120,306,120,356,120,306,125,307,78,305,31,255,45,240,78,305,45,240,58,251,78,305,58,251,72,263,78,305,72,263,85,275,220, --69,237,-156,230,-74,230,-74,237,-156,240,-76,250,-74,240,-76,244,-156,250,-74,244,-156,282,-105,193,-36,198,-104,202,-49,202,-49,198,-104,237,-156,202,-49,237,-156,211,-60,211,-60,237,-156,220,-69,211,415,220,424,237,511,237,511,220,424,230,430,237,511,230,430,240,432,240,432,250,430,244,511,244,511,250,430,282,460,160,407,193,391,198,459,198,459,193,391,202,404,198,459,202,404,237,511,237,511,202,404,211,415,160,-52,147,290,147,64,160,-52,147,64,146,57,160,-52,146,57,143,52,120,0,125,47,120,48,120,0,120,48,114,52,120,0,114,52,109,56,120,0,109,56,102,63,120,0,102,63,95,69,120,0,95,69,85,79,120,0,85,79,78,49,78,49,85,79,72,91,78,49,72,91,58,103,78,49,58,103,45,114,78,49,45,114,31,99,337,302,341,305,360,356,360,356,341,305,345,307,360,356,345,307,348,308,348,308,355,307,360,356,360,356,355,307,361,306,360,356,361,306,402,305,402,305,361,306,366,303,402,305,366,303,371,299,402,305,371,299,377,293,377,293,388,282,402,305,402,305,388,282,399,271,402,305,399,271,411,261,399,83,388,72,402,49,402,49,388,72,377,62,402,49,377,62,371,56,448,255,402,305,411,261,448,255,411,261,423,250,448,255,423,250,434,240,337,302,360,356,334,297,334,297,360,356,320,408,334,297,320,408,333,290,333,290,320,408,320,-53,333,290,320,-53,333,64,333,64,320,-53,334,57,278,404,287,391,282,460,282,460,287,391,320,408,320,408,287,391,320,-53,320,-53,287,391,287,-36,282,-105,320,-53,287,-36,282,-105,287,-36,278,-49,282,-105,278,-49,269,-60,282,-105,269,-60,260,-69,282,-105,260,-69,250,-74,448,99,434,114,423,104,448,99,423,104,411,93,448,99,411,93,402,49,371,56,366,51,402,49,402,49,366,51,361,48,402,49,361,48,360,-1,360,-1,361,48,355,47,360,-1,355,47,348,46,348,46,345,47,360,-1,360,-1,345,47,341,49,360,-1,341,49,337,52,334,57,320,-53,360,-1,334,57,360,-1,337,52,282,460,250,430,260,424,282,460,260,424,269,415,282,460,269,415,278,404,244,511,237,511,240,432,240,-76,237,-156,244,-156,399,83,402,49,411,93,198,-104,193,-36,160,-52,89,364,89,371,95,132,95,132,89, -371,88,377,75,132,88,377,89,384,75,132,89,384,72,200,72,200,89,384,66,266,90,390,91,396,107,454,107,454,91,396,94,400,107,454,94,400,98,405,98,405,102,408,107,454,107,454,102,408,107,411,107,454,107,411,113,413,107,454,113,413,171,444,171,444,113,413,119,414,171,444,119,414,126,414,126,414,132,414,171,444,171,444,132,414,139,413,171,444,139,413,145,412,263,370,171,444,580,-9,580,-9,171,444,159,409,152,411,159,409,171,444,152,411,171,444,145,412,44,463,48,395,107,454,107,454,48,395,58,331,107,454,58,331,90,390,90,390,58,331,66,266,90,390,66,266,89,384,260,376,259,378,236,436,236,436,259,378,258,381,236,436,258,381,258,384,258,384,258,386,236,436,236,436,258,386,258,388,236,436,258,388,259,391,302,430,236,436,266,398,266,398,236,436,261,394,260,392,261,394,236,436,260,392,236,436,259,391,370,427,302,430,308,403,370,427,308,403,323,404,370,427,323,404,338,405,370,427,338,405,354,406,370,427,354,406,370,407,302,430,266,398,270,401,302,430,270,401,276,403,302,430,276,403,283,403,302,430,283,403,293,403,302,430,293,403,308,403,171,444,263,370,261,373,171,444,261,373,260,376,171,444,260,376,236,436,100,229,104,237,92,343,92,343,104,237,109,242,92,343,109,242,118,245,118,245,121,244,92,343,92,343,121,244,123,244,92,343,123,244,126,242,129,241,131,239,92,343,129,241,92,343,126,242,131,239,480,-108,513,-76,131,239,513,-76,92,343,98,209,99,219,95,132,98,209,95,132,97,149,98,209,97,149,97,167,98,209,97,167,98,184,98,209,98,184,98,199,92,343,91,350,95,132,92,343,95,132,99,219,92,343,99,219,100,229,90,357,89,364,95,132,90,357,95,132,91,350,95,132,88,377,75,132,263,370,580,-9,612,23,48,395,44,463,38,459,387,370,38,23,70,-9,387,370,70,-9,491,409,387,370,491,409,389,373,391,391,392,388,415,436,415,436,392,388,393,386,415,436,393,386,393,384,393,384,393,381,491,409,491,409,393,381,392,378,491,409,392,378,391,376,415,436,348,430,358,403,415,436,358,403,367,403,415,436,367,403,374,403,415,436,374,403,380,401,415,436,380,401,384,398,415,436,384,398,389, -394,415,436,389,394,390,392,415,436,390,392,391,391,348,430,280,427,296,406,348,430,296,406,312,405,348,430,312,405,327,404,348,430,327,404,343,403,348,430,343,403,358,403,505,412,512,413,544,454,544,454,512,413,518,414,544,454,518,414,524,414,524,414,531,414,544,454,544,454,531,414,538,413,544,454,538,413,544,411,524,242,527,244,558,343,558,343,527,244,530,244,558,343,530,244,532,245,532,245,541,242,558,343,558,343,541,242,546,237,558,343,546,237,550,229,544,454,544,411,607,463,607,463,544,411,549,408,607,463,549,408,553,405,553,405,557,400,607,463,607,463,557,400,559,396,607,463,559,396,561,390,558,343,550,229,551,219,558,343,551,219,552,209,558,343,552,209,552,199,558,343,552,199,552,184,558,343,552,184,553,167,558,343,553,167,554,149,558,343,554,149,555,132,558,343,555,132,576,132,558,343,138,-76,170,-108,558,343,170,-108,519,239,558,343,519,239,521,241,558,343,521,241,524,242,561,364,560,357,576,132,576,132,560,357,559,350,576,132,559,350,558,343,607,463,561,390,562,384,607,463,562,384,562,377,607,463,562,377,584,266,607,463,584,266,592,331,607,463,592,331,602,395,607,463,602,395,612,459,562,377,576,132,578,200,562,377,578,200,584,266,544,454,480,444,491,409,544,454,491,409,498,411,544,454,498,411,505,412,491,409,480,444,415,436,491,409,415,436,393,384,562,371,561,364,576,132,562,371,576,132,562,377,296,406,280,427,280,407,389,373,491,409,391,376,392,-33,391,-35,415,-81,415,-81,391,-35,390,-37,415,-81,390,-37,389,-39,389,-39,384,-43,415,-81,415,-81,384,-43,380,-46,415,-81,380,-46,374,-48,491,-54,415,-81,480,-89,491,-54,480,-89,544,-99,491,-54,393,-29,415,-81,391,-20,392,-23,491,-54,491,-54,392,-23,393,-26,491,-54,393,-26,393,-29,393,-29,393,-31,415,-81,415,-81,393,-31,392,-33,491,-54,70,365,387,-15,491,-54,387,-15,389,-18,491,-54,389,-18,391,-20,544,-56,538,-57,544,-99,544,-99,538,-57,531,-58,544,-99,531,-58,524,-58,524,-58,518,-58,544,-99,544,-99,518,-58,512,-58,544,-99,512,-58,505,-57,550,126,546,118,558,11,558,11,546,118,541,112,558,11,541,112,532,110,532,110,530,110,558,11,558,11,530,110,527,111,558, -11,527,111,524,112,552,170,552,155,558,11,558,11,552,155,552,145,558,11,552,145,551,135,561,-35,559,-40,607,-108,607,-108,559,-40,557,-45,607,-108,557,-45,553,-50,553,-50,549,-53,607,-108,607,-108,549,-53,544,-56,607,-108,544,-56,544,-99,560,-2,561,-9,576,222,576,222,561,-9,562,-16,576,222,562,-16,562,-22,562,-22,561,-29,607,-108,607,-108,561,-29,561,-35,576,222,555,222,558,11,576,222,558,11,559,4,576,222,559,4,560,-2,558,11,555,222,554,205,558,11,554,205,553,187,558,11,553,187,552,170,558,11,524,112,521,113,558,11,521,113,519,116,558,11,519,116,170,463,558,11,170,463,138,431,607,-108,612,-104,602,-40,607,-108,602,-40,592,23,607,-108,592,23,584,88,607,-108,584,88,562,-22,578,154,576,222,562,-22,578,154,562,-22,584,88,498,-55,491,-54,544,-99,498,-55,544,-99,505,-57,374,-48,367,-48,415,-81,415,-81,367,-48,358,-48,415,-81,358,-48,348,-74,348,-74,358,-48,343,-48,348,-74,343,-48,327,-49,348,-74,327,-49,312,-50,348,-74,312,-50,296,-50,348,-74,296,-50,280,-51,348,-74,280,-51,280,-72,550,126,558,11,551,135,387,-15,70,365,38,332,89,-16,95,222,88,-22,88,-22,75,222,89,-29,89,-29,75,222,72,154,89,-29,72,154,66,88,113,-57,107,-56,107,-99,107,-99,107,-56,102,-53,107,-99,102,-53,98,-50,98,-50,94,-45,107,-99,107,-99,94,-45,91,-40,107,-99,91,-40,90,-35,126,112,123,111,92,11,92,11,123,111,121,110,92,11,121,110,118,110,118,110,109,112,92,11,92,11,109,112,104,118,92,11,104,118,100,126,145,-57,139,-58,171,-89,171,-89,139,-58,132,-58,171,-89,132,-58,126,-58,126,-58,119,-58,171,-89,171,-89,119,-58,113,-57,171,-89,113,-57,107,-99,259,-35,258,-33,236,-81,236,-81,258,-33,258,-31,236,-81,258,-31,258,-29,258,-29,258,-26,236,-81,236,-81,258,-26,259,-23,236,-81,259,-23,260,-20,612,332,580,365,263,-15,261,-18,263,-15,580,365,261,-18,580,365,171,-89,171,-89,580,365,159,-54,171,-89,159,-54,152,-55,259,-35,236,-81,260,-37,260,-37,236,-81,261,-39,266,-43,261,-39,236,-81,266,-43,236,-81,302,-74,260,-20,261,-18,171,-89,260,-20,171,-89,236,-81,38,-104,44,-108,48,-40,48,-40,44,-108,107,-99,48,-40,107, --99,58,23,58,23,107,-99,90,-35,58,23,90,-35,66,88,66,88,90,-35,89,-29,338,-50,323,-49,370,-72,370,-72,323,-49,308,-48,370,-72,308,-48,302,-74,302,-74,308,-48,293,-48,302,-74,293,-48,283,-48,354,-50,338,-50,370,-72,354,-50,370,-72,370,-51,302,-74,283,-48,276,-48,302,-74,276,-48,270,-46,302,-74,270,-46,266,-43,513,431,480,463,131,116,513,431,131,116,129,113,513,431,129,113,92,11,98,145,98,155,98,170,98,145,98,170,97,187,98,145,97,187,97,205,98,145,97,205,95,222,98,145,95,222,99,135,95,222,89,-16,89,-9,95,222,89,-9,90,-2,95,222,90,-2,91,4,95,222,91,4,92,11,95,222,92,11,99,135,75,222,88,-22,95,222,92,11,129,113,126,112,92,11,100,126,99,135,145,-57,171,-89,152,-55,32,180,32,180,94,228,94,228,32,180,101,118,94,228,101,118,150,281,150,281,101,118,135,218,150,281,135,218,136,222,135,133,134,136,101,118,101,118,134,136,134,138,134,214,134,142,135,210,135,210,134,142,137,146,135,210,137,146,137,206,137,206,137,146,140,203,202,338,150,281,155,244,202,338,155,244,166,256,202,338,166,256,178,269,202,338,178,269,190,281,202,338,190,281,201,294,202,338,201,294,596,294,202,338,596,294,234,340,202,338,234,340,234,342,202,338,234,342,248,395,150,281,136,222,138,226,150,281,138,226,141,230,150,281,141,230,145,234,150,281,145,234,155,244,134,214,135,218,101,118,134,214,101,118,134,138,166,100,154,112,161,61,161,61,154,112,144,121,161,61,144,121,140,125,233,14,596,14,596,60,233,14,596,60,200,60,233,14,200,60,211,4,233,14,211,4,233,13,211,4,200,60,191,72,211,4,191,72,179,86,211,4,179,86,166,100,211,4,166,100,161,61,161,61,140,125,137,130,161,61,137,130,135,133,161,61,135,133,101,118,596,200,152,200,596,154,596,154,152,200,152,154,146,152,152,154,152,200,146,152,152,200,145,201,141,149,146,152,145,201,141,149,145,201,140,203,141,149,140,203,137,146,287,451,248,395,250,364,287,451,250,364,266,385,287,451,266,385,281,406,287,451,281,406,293,425,287,451,293,425,303,441,286,-97,302,-85,293,-69,286,-97,293,-69,280,-51,286,-97,280,-51,266, --30,286,-97,266,-30,253,-49,253,-49,266,-30,250,-8,253,-49,250,-8,233,13,253,-49,233,13,211,4,234,340,596,294,596,340,248,395,234,342,250,364,134,142,134,214,134,138,101,118,32,180,32,173,368,406,382,385,395,403,395,403,382,385,398,363,395,403,398,363,437,350,437,350,398,363,415,341,437,350,415,341,448,294,448,294,415,341,415,340,362,452,346,441,356,425,362,452,356,425,368,406,362,452,368,406,395,403,448,60,52,60,414,14,448,60,414,14,446,16,446,16,414,14,414,12,446,16,414,12,400,-40,400,-40,414,12,398,-9,400,-40,398,-9,382,-30,52,154,495,154,52,200,52,200,495,154,497,200,503,202,497,200,502,153,503,202,502,153,508,151,504,120,494,110,497,72,504,120,497,72,554,126,504,120,554,126,507,124,512,225,514,221,547,236,547,236,514,221,515,218,547,236,515,218,515,216,515,216,514,140,554,126,554,126,514,140,514,136,547,236,487,293,495,242,547,236,495,242,505,233,547,236,505,233,509,229,547,236,509,229,512,225,487,293,437,350,448,294,487,293,448,294,457,282,487,293,457,282,469,269,487,293,469,269,482,255,487,293,482,255,495,242,52,340,52,294,448,294,52,340,448,294,415,340,554,126,616,173,616,180,554,126,616,180,547,236,554,126,547,236,515,216,554,126,514,136,512,132,554,126,512,132,510,128,554,126,510,128,507,124,497,72,494,110,482,98,497,72,482,98,470,85,497,72,470,85,458,72,497,72,458,72,448,60,497,72,448,60,446,16,508,151,511,148,511,208,511,208,511,148,513,144,511,208,513,144,514,212,514,212,513,144,514,140,514,212,514,140,515,216,508,205,503,202,508,151,508,205,508,151,511,208,497,200,495,154,502,153,368,-51,355,-69,361,-96,368,-51,361,-96,400,-40,368,-51,400,-40,382,-30,361,-96,355,-69,345,-85,414,14,52,60,52,14,162,203,158,206,159,146,159,146,158,206,156,210,159,146,156,210,156,142,156,142,156,210,155,214,155,138,149,252,149,102,149,102,149,252,117,225,149,102,117,225,116,130,116,130,117,225,81,200,116,130,81,200,81,154,81,154,81,200,42,180,81,154,42,180,42,173,209,314,180,283,190,260,209,314,190,260,201,274,209,314,201,274,212,287,209,314,212,287,223,301,180, -283,149,252,157,222,180,283,157,222,159,226,180,283,159,226,161,230,180,283,161,230,165,234,180,283,165,234,177,247,180,283,177,247,190,260,156,218,157,222,149,252,156,218,149,252,155,214,189,96,177,109,180,72,180,72,177,109,165,121,180,72,165,121,161,125,527,154,606,154,606,200,527,154,606,200,506,200,527,154,506,200,464,154,527,154,464,154,464,80,173,200,168,153,172,154,173,200,172,154,230,154,173,200,230,154,252,200,252,200,230,154,294,80,252,200,294,80,294,154,294,154,294,80,380,200,294,154,380,200,380,276,380,276,380,200,464,80,380,276,464,80,464,154,167,201,162,203,163,150,167,201,163,150,168,153,167,201,168,153,173,200,208,41,222,54,212,68,208,41,212,68,201,82,208,41,201,82,189,96,208,41,189,96,180,72,155,135,155,138,149,102,155,135,149,102,156,132,156,132,149,102,180,72,156,132,180,72,158,128,158,128,180,72,161,125,156,142,155,214,155,138,162,203,159,146,163,150,155,214,149,252,155,138,492,132,490,128,499,102,499,102,490,128,487,125,499,102,487,125,484,121,484,121,471,109,499,102,499,102,471,109,469,72,499,252,468,283,470,247,499,252,470,247,483,234,499,252,483,234,486,230,499,252,486,230,489,226,499,252,489,226,491,221,499,252,491,221,493,218,499,252,493,218,493,214,499,252,493,214,494,138,499,252,494,138,499,102,499,252,499,102,532,225,426,301,436,287,440,314,440,314,436,287,447,274,440,314,447,274,468,283,468,283,447,274,458,260,468,283,458,260,470,247,606,173,606,180,568,154,568,154,606,180,568,200,568,154,568,200,532,130,532,130,568,200,532,225,532,130,532,225,499,102,499,102,494,138,493,135,499,102,493,135,492,132,471,109,459,96,469,72,469,72,459,96,447,82,469,72,447,82,441,41,441,41,447,82,436,68,441,41,436,68,427,54,494,138,493,214,492,142,492,142,493,214,492,210,492,142,492,210,490,206,477,154,480,153,481,201,481,201,480,153,485,150,481,201,485,150,487,203,487,203,485,150,489,146,487,203,489,146,490,206,490,206,489,146,492,142,481,201,474,200,477,154,477,154,474,200,419,154,419,154,474,200,396,200,419,154,396,200,354,154,419,154,354,154,354,80,354,80,354, -154,267,276,354,80,267,276,267,200,267,200,267,276,184,154,267,200,184,154,184,80,184,80,184,154,142,200,184,80,142,200,122,154,122,154,142,200,42,200,122,154,42,200,42,154,127,344,130,347,131,389,131,389,130,347,133,349,131,389,133,349,155,425,155,425,133,349,136,350,155,425,136,350,140,351,140,351,144,350,155,425,155,425,144,350,148,346,155,425,148,346,152,342,42,88,155,53,155,88,155,88,155,53,202,-108,155,88,202,-108,155,144,155,144,202,-108,155,178,155,144,155,178,42,178,155,337,155,333,155,425,155,425,155,333,175,463,175,463,155,333,202,-108,175,463,202,-108,182,463,182,463,202,-108,202,332,182,463,202,332,202,425,202,425,202,332,202,339,202,425,202,339,204,344,123,341,127,344,131,389,123,341,131,389,110,328,110,328,131,389,103,356,110,328,103,356,97,316,97,316,103,356,83,305,73,326,42,298,55,284,73,326,55,284,69,294,73,326,69,294,83,305,73,326,83,305,103,356,204,344,208,347,226,389,226,389,208,347,211,349,226,389,211,349,216,350,216,350,219,350,226,389,226,389,219,350,223,348,226,389,223,348,227,346,262,316,275,304,284,325,284,325,275,304,289,293,284,325,289,293,316,297,316,297,289,293,302,283,254,356,226,389,227,346,254,356,227,346,231,344,254,356,231,344,235,340,254,356,235,340,248,328,254,356,248,328,262,316,254,356,262,316,284,325,202,178,202,144,316,144,202,178,316,144,316,178,202,88,202,53,316,53,202,88,316,53,316,88,155,333,155,178,202,-108,202,-108,155,53,155,-108,202,425,204,344,226,389,155,425,152,342,155,337,155,144,42,178,42,144,155,53,42,88,42,53,152,12,148,8,155,-70,155,-70,148,8,144,4,155,-70,144,4,140,3,140,3,136,4,155,-70,155,-70,136,4,133,5,155,-70,133,5,131,-34,131,-34,133,5,130,7,131,-34,130,7,127,10,202,463,155,463,175,-108,202,463,175,-108,182,-108,202,463,182,-108,202,23,202,301,202,266,316,266,202,301,316,266,316,301,202,211,202,176,316,176,202,211,316,176,316,211,227,8,223,6,226,-34,226,-34,223,6,219,4,226,-34,219,4,216,4,216,4,211,5,226,-34,226,-34,211,5,208,7,226,-34,208,7,204,11,262,39,248,27,254, --1,254,-1,248,27,235,14,254,-1,235,14,231,11,289,61,275,50,284,28,289,61,284,28,316,57,289,61,316,57,302,71,262,39,254,-1,284,28,262,39,284,28,275,50,227,8,226,-34,254,-1,227,8,254,-1,231,11,202,-70,226,-34,204,11,202,-70,204,11,202,16,202,-70,202,16,202,23,202,-70,202,23,182,-108,175,-108,155,463,155,301,175,-108,155,301,155,266,175,-108,155,266,155,211,175,-108,155,211,155,176,175,-108,155,176,155,22,175,-108,155,22,155,-70,155,17,152,12,155,-70,155,17,155,-70,155,22,127,10,123,13,131,-34,131,-34,123,13,110,26,131,-34,110,26,103,-1,103,-1,110,26,97,38,103,-1,97,38,83,50,73,28,103,-1,83,50,73,28,83,50,69,61,73,28,69,61,55,70,73,28,55,70,42,57,42,211,42,176,155,176,42,211,155,176,155,211,42,301,42,266,155,266,42,301,155,266,155,301,531,200,531,154,606,154,531,200,606,154,606,200,414,200,414,154,488,154,414,200,488,154,488,200,296,200,296,154,371,154,296,200,371,154,371,200,162,203,158,206,159,147,159,147,158,206,156,210,159,147,156,210,156,143,156,143,156,210,155,214,155,138,149,252,149,102,149,102,149,252,117,225,149,102,117,225,116,130,116,130,117,225,81,200,116,130,81,200,81,154,81,154,81,200,42,180,81,154,42,180,42,173,209,314,180,283,190,260,209,314,190,260,201,274,209,314,201,274,212,287,209,314,212,287,223,301,180,283,149,252,157,222,180,283,157,222,159,226,180,283,159,226,161,230,180,283,161,230,165,234,180,283,165,234,177,247,180,283,177,247,190,260,156,218,157,222,149,252,156,218,149,252,155,214,189,96,177,109,180,72,180,72,177,109,165,121,180,72,165,121,161,125,173,200,167,201,168,153,173,200,168,153,173,154,173,200,173,154,253,154,173,200,253,154,253,200,163,150,168,153,167,201,163,150,167,201,162,203,163,150,162,203,159,147,208,41,222,54,212,68,208,41,212,68,201,82,208,41,201,82,189,96,208,41,189,96,180,72,155,135,155,138,149,102,155,135,149,102,156,132,156,132,149,102,180,72,156,132,180,72,158,128,158,128,180,72,161,125,156,143,155,214,155,138,155,214,149,252,155,138,127,344,130,347,131,389,131, -389,130,347,133,349,131,389,133,349,155,425,155,425,133,349,136,350,155,425,136,350,140,351,140,351,144,350,155,425,155,425,144,350,148,346,155,425,148,346,152,342,155,337,155,333,155,425,155,425,155,333,175,463,175,463,155,333,202,254,175,463,202,254,182,463,182,463,202,254,202,332,182,463,202,332,202,425,202,425,202,332,202,339,202,425,202,339,204,344,123,341,127,344,131,389,123,341,131,389,110,328,110,328,131,389,103,356,110,328,103,356,97,316,97,316,103,356,83,305,73,326,42,298,55,284,73,326,55,284,69,294,73,326,69,294,83,305,73,326,83,305,103,356,204,344,208,347,226,389,226,389,208,347,211,349,226,389,211,349,216,350,216,350,219,350,226,389,226,389,219,350,223,348,226,389,223,348,227,346,262,316,275,304,284,325,284,325,275,304,289,293,284,325,289,293,316,297,316,297,289,293,302,283,254,356,226,389,227,346,254,356,227,346,231,344,254,356,231,344,235,340,254,356,235,340,248,328,254,356,248,328,262,316,254,356,262,316,284,325,155,333,155,254,202,254,155,208,155,133,202,133,155,208,202,133,202,208,155,87,155,12,202,12,155,87,202,12,202,87,155,-33,155,-108,202,-108,155,-33,202,-108,202,-33,202,425,204,344,226,389,155,425,152,342,155,337,492,132,490,128,499,102,499,102,490,128,487,125,499,102,487,125,484,121,484,121,471,109,499,102,499,102,471,109,469,72,474,200,475,154,481,201,481,201,475,154,482,153,481,201,482,153,487,203,487,203,482,153,487,150,487,203,487,150,490,206,490,206,487,150,491,147,490,206,491,147,492,210,492,210,491,147,493,143,492,210,493,143,493,214,493,214,493,143,499,252,499,252,493,143,494,138,499,102,494,138,493,135,499,252,468,283,470,247,499,252,470,247,483,234,499,252,483,234,486,230,499,252,486,230,489,226,499,252,489,226,491,221,499,252,491,221,493,218,499,252,493,218,493,214,426,301,436,287,440,314,440,314,436,287,447,274,440,314,447,274,468,283,468,283,447,274,458,260,468,283,458,260,470,247,606,173,606,180,568,154,568,154,606,180,568,200,568,154,568,200,532,130,532,130,568,200,532,225,532,130,532,225,499,102,499,102,532,225,499,252,499,102,499,252,494,138,471,109,459, -96,469,72,469,72,459,96,447,82,469,72,447,82,441,41,441,41,447,82,436,68,441,41,436,68,427,54,395,200,395,154,475,154,395,200,475,154,474,200,277,200,277,154,352,154,277,200,352,154,352,200,159,200,159,154,234,154,159,200,234,154,234,200,42,200,42,154,117,154,42,200,117,154,117,200,492,132,499,102,493,135,155,463,155,388,202,388,155,463,202,388,202,463,155,342,155,267,202,267,155,342,202,267,202,342,155,221,155,146,202,146,155,221,202,146,202,221,152,10,148,6,155,-70,155,-70,148,6,144,4,155,-70,144,4,140,3,140,3,136,4,155,-70,155,-70,136,4,133,5,155,-70,133,5,131,-34,131,-34,133,5,130,7,131,-34,130,7,127,10,204,11,202,16,202,-70,202,-70,202,16,202,23,202,23,202,100,182,-108,182,-108,202,100,175,-108,202,100,155,100,175,-108,175,-108,155,100,155,22,175,-108,155,22,155,-70,155,-70,155,22,155,15,155,-70,155,15,152,10,227,8,223,6,226,-34,226,-34,223,6,219,4,226,-34,219,4,216,4,216,4,211,5,226,-34,226,-34,211,5,208,7,226,-34,208,7,204,11,262,39,248,27,254,-1,254,-1,248,27,235,14,254,-1,235,14,231,11,289,61,275,50,284,28,289,61,284,28,316,57,289,61,316,57,302,71,262,39,254,-1,284,28,262,39,284,28,275,50,227,8,226,-34,254,-1,227,8,254,-1,231,11,127,10,123,13,131,-34,131,-34,123,13,110,26,131,-34,110,26,103,-1,103,-1,110,26,97,38,103,-1,97,38,83,50,73,28,103,-1,83,50,73,28,83,50,69,61,73,28,69,61,55,70,73,28,55,70,42,57,202,-70,202,23,182,-108,204,11,202,-70,226,-34,197,203,193,206,194,147,194,147,193,206,191,210,194,147,191,210,191,143,191,143,191,210,191,214,190,138,185,253,184,102,184,102,185,253,152,225,184,102,152,225,152,130,152,130,152,225,116,200,152,130,116,200,116,154,116,154,116,200,77,180,77,41,77,180,42,315,77,41,42,315,42,41,77,315,42,315,77,180,244,315,215,283,225,260,244,315,225,260,236,274,244,315,236,274,248,288,244,315,248,288,258,302,215,283,185,253,192,222,215,283,192,222,194,226,215,283,194,226,197,230,215,283,197,230,200,234,215,283,200,234,213, -247,215,283,213,247,225,260,191,218,192,222,185,253,191,218,185,253,191,214,224,96,212,109,215,72,215,72,212,109,199,121,215,72,199,121,196,125,209,200,202,201,203,153,209,200,203,153,208,154,209,200,208,154,606,154,209,200,606,154,606,200,198,150,203,153,202,201,198,150,202,201,197,203,198,150,197,203,194,147,243,41,257,54,247,68,243,41,247,68,236,82,243,41,236,82,224,96,243,41,224,96,215,72,190,135,190,138,184,102,190,135,184,102,191,132,191,132,184,102,215,72,191,132,215,72,193,128,193,128,215,72,196,125,77,180,77,173,116,154,191,143,191,214,190,138,191,214,185,253,190,138,424,96,434,72,436,109,436,109,434,72,464,102,436,109,464,102,448,121,448,121,464,102,452,125,571,315,571,180,571,173,571,173,571,180,532,154,532,154,571,180,532,200,532,154,532,200,497,130,497,130,532,200,497,225,497,130,497,225,464,102,464,102,497,225,464,253,464,102,464,253,459,138,464,253,433,283,436,247,464,253,436,247,448,234,464,253,448,234,451,230,464,253,451,230,454,226,464,253,454,226,456,221,464,253,456,221,457,218,464,253,457,218,458,214,464,253,458,214,459,138,391,302,401,288,405,315,405,315,401,288,412,274,405,315,412,274,433,283,433,283,412,274,424,260,433,283,424,260,436,247,571,173,606,41,606,315,571,173,606,315,571,315,464,102,459,138,458,135,464,102,458,135,457,132,464,102,457,132,455,128,464,102,455,128,452,125,412,82,401,68,405,41,412,82,405,41,434,72,412,82,434,72,424,96,459,138,458,214,457,143,457,143,458,214,457,210,457,143,457,210,455,206,441,154,445,153,447,201,447,201,445,153,450,150,447,201,450,150,452,203,452,203,450,150,454,147,452,203,454,147,455,206,455,206,454,147,457,143,441,154,447,201,440,200,441,154,440,200,42,200,441,154,42,200,42,154,606,41,571,173,571,41,405,41,401,68,391,54,313,270,313,379,298,386,313,270,298,386,277,316,313,270,277,316,277,235,313,270,277,235,571,235,313,270,571,235,606,270,198,57,249,15,277,37,277,37,249,15,298,-30,277,37,298,-30,277,119,277,119,298,-30,313,84,277,119,313,84,571,119,571,119,313,84,606,84,571,119,606,84,571,235,571, -235,606,84,606,270,277,37,162,127,198,57,198,57,162,127,149,137,198,57,149,137,146,97,146,97,149,137,138,146,146,97,138,146,129,156,121,177,94,135,123,167,123,167,94,135,146,97,123,167,146,97,129,156,248,340,197,297,277,316,277,316,197,297,162,228,150,218,162,228,197,297,150,218,197,297,145,257,145,257,93,219,94,135,145,257,94,135,123,188,145,257,123,188,130,198,145,257,130,198,139,208,145,257,139,208,150,218,123,188,94,135,121,177,42,180,42,173,94,135,42,180,94,135,93,219,248,340,277,316,298,386,313,84,298,-30,313,-23,31,207,31,207,78,257,78,257,31,207,38,193,78,257,38,193,100,228,100,228,38,193,147,193,100,228,147,193,182,228,182,228,147,193,182,-73,209,367,219,376,237,463,237,463,219,376,229,382,237,463,229,382,240,384,240,384,251,382,244,463,244,463,251,382,282,412,209,367,237,463,200,356,200,356,237,463,198,412,200,356,198,412,190,344,190,344,198,412,160,360,190,344,160,360,120,308,120,308,78,257,100,228,120,308,100,228,190,344,244,463,237,463,240,384,261,376,272,366,282,412,282,412,272,366,282,355,282,412,282,355,291,344,291,344,380,228,320,360,320,360,380,228,360,308,320,360,282,412,291,344,380,228,298,228,333,193,380,228,333,193,441,193,380,228,441,193,402,257,380,228,402,257,360,308,333,-108,333,193,298,228,333,-108,298,228,298,-73,333,-108,298,-73,182,-73,333,-108,182,-73,147,-108,147,-108,182,-73,147,193,402,257,441,193,448,207,282,412,251,382,261,376,42,270,42,84,77,119,77,119,42,84,336,84,77,119,336,84,371,119,371,119,336,84,350,-30,371,119,350,-30,371,37,371,37,350,-30,400,15,371,37,400,15,487,127,487,127,400,15,451,57,487,127,451,57,503,97,525,167,519,156,554,135,554,135,519,156,510,146,554,135,510,146,503,97,503,97,510,146,499,137,503,97,499,137,487,127,555,219,503,257,509,208,555,219,509,208,519,198,555,219,519,198,525,188,555,219,525,188,527,177,555,219,527,177,554,135,555,219,554,135,606,173,555,219,606,173,606,180,525,167,554,135,527,177,503,257,451,297,487,228,503,257,487,228,498,218,503,257,498,218,509,208,336,379,371,235,350,386,350,386,371, -235,371,316,350,386,371,316,400,340,400,340,371,316,487,228,400,340,487,228,451,297,336,270,42,270,77,235,336,270,77,235,371,235,336,270,371,235,336,379,350,-30,336,84,336,-23,77,235,42,270,77,119,190,10,120,46,160,-5,190,10,160,-5,198,-57,190,10,100,126,120,46,100,126,182,126,147,161,100,126,147,161,38,161,100,126,38,161,78,97,100,126,78,97,120,46,219,-21,237,-108,229,-27,229,-27,237,-108,240,-29,251,-27,240,-29,244,-108,251,-27,244,-108,282,-57,190,10,198,-57,200,-1,200,-1,198,-57,237,-108,200,-1,237,-108,209,-12,209,-12,237,-108,219,-21,147,161,182,126,147,463,147,463,182,126,182,428,147,463,182,428,333,463,333,463,182,428,298,428,333,463,298,428,333,161,333,161,298,428,298,126,333,161,298,126,380,126,402,97,448,147,441,161,402,97,441,161,380,126,402,97,380,126,360,46,360,46,380,126,320,-5,320,-5,380,126,291,10,320,-5,291,10,282,-57,282,-57,291,10,282,-1,282,-57,282,-1,272,-12,261,-21,251,-27,282,-57,261,-21,282,-57,272,-12,240,-29,237,-108,244,-108,333,161,380,126,441,161,78,97,38,161,31,147,31,227,31,227,78,276,78,276,31,227,38,213,78,276,38,213,100,248,100,248,38,213,147,213,100,248,147,213,182,248,182,248,147,213,182,64,209,387,219,396,237,483,237,483,219,396,229,402,237,483,229,402,240,404,240,404,251,402,244,483,244,483,251,402,282,432,209,387,237,483,200,376,200,376,237,483,198,431,200,376,198,431,190,363,190,363,198,431,160,379,190,363,160,379,120,327,120,327,78,276,100,248,120,327,100,248,190,363,244,483,237,483,240,404,261,395,272,386,282,432,282,432,272,386,282,375,282,432,282,375,291,363,291,363,380,248,320,380,320,380,380,248,360,328,320,380,282,432,291,363,380,248,298,248,333,213,380,248,333,213,441,213,380,248,441,213,402,277,380,248,402,277,360,328,333,30,333,213,298,248,333,30,298,248,298,64,333,30,298,64,182,64,333,30,182,64,147,30,147,-128,182,-93,147,-15,147,-15,182,-93,182,-50,147,-15,182,-50,333,-15,333,-15,182,-50,298,-50,333,-15,298,-50,333,-128,333,-128,298,-50,298,-93,333,-128,298,-93,182,-93,182,-93,147,-128,333,-128,147,30,182,64,147, -213,402,277,441,213,448,227,282,432,251,402,261,395,168,200,49,200,168,200,168,200,49,200,168,154,168,200,168,154,178,228,178,228,168,154,178,127,178,228,178,127,195,252,195,252,178,127,195,104,195,252,195,104,205,200,205,200,195,104,205,154,217,86,205,154,195,104,335,138,323,124,330,86,330,86,323,124,309,114,330,86,309,114,303,74,303,74,309,114,292,107,303,74,292,107,273,70,273,70,292,107,273,105,255,107,238,114,244,74,255,107,244,74,273,70,255,107,273,70,273,105,224,124,212,138,217,86,224,124,217,86,244,74,224,124,244,74,238,114,324,230,331,270,309,241,309,241,331,270,304,282,309,241,304,282,292,248,292,248,304,282,273,251,255,248,273,251,273,286,255,248,273,286,244,282,205,200,212,216,217,270,217,270,212,216,223,230,217,270,223,230,244,282,244,282,223,230,238,241,244,282,238,241,255,248,343,200,205,200,205,154,343,200,205,154,342,154,343,200,342,154,352,104,343,200,353,252,335,216,343,200,352,104,353,252,353,252,352,104,369,127,353,252,369,127,370,228,370,228,369,127,379,154,370,228,379,154,380,200,380,200,379,154,468,154,380,200,468,154,468,200,473,201,468,200,475,153,473,201,475,153,478,203,478,203,475,153,480,151,478,203,480,151,482,207,482,207,480,151,483,148,482,207,483,148,485,211,485,211,483,148,485,144,485,211,485,144,486,140,331,270,324,230,335,216,331,270,335,216,353,252,304,282,273,286,273,251,485,136,492,101,486,140,486,140,492,101,487,216,487,216,492,101,492,252,492,252,492,101,525,129,492,252,525,129,525,224,525,224,525,129,561,154,525,224,561,154,561,200,561,200,561,154,599,173,561,200,599,173,599,180,492,252,462,282,464,245,492,252,464,245,477,233,492,252,477,233,480,229,492,252,480,229,483,226,492,252,483,226,485,222,492,252,485,222,486,219,492,252,486,219,487,216,420,300,429,286,434,313,434,313,429,286,440,272,434,313,440,272,462,282,462,282,440,272,452,258,462,282,452,258,464,245,451,94,461,71,463,107,463,107,461,71,492,101,463,107,492,101,476,120,476,120,492,101,479,124,492,101,485,136,484,132,492,101,484,132,482,128,492,101,482,128,479,124,439,81,429,67,433,40,439, -81,433,40,461,71,439,81,461,71,451,94,487,216,485,211,486,140,335,138,330,86,352,104,335,138,352,104,342,154,468,200,468,154,475,153,433,40,429,67,419,53,168,154,49,200,49,154,195,252,205,200,217,270,205,154,217,86,212,138,330,344,334,347,335,389,335,389,334,347,337,349,335,389,337,349,359,425,359,425,337,349,340,350,359,425,340,350,344,351,344,351,348,350,359,425,359,425,348,350,352,348,359,425,352,348,356,344,358,339,359,333,359,425,359,425,359,333,379,463,379,463,359,333,405,-101,379,463,405,-101,386,463,386,463,405,-101,405,332,386,463,405,332,406,425,406,425,405,332,406,339,406,425,406,339,408,344,287,305,301,316,307,356,307,356,301,316,314,328,307,356,314,328,335,389,335,389,314,328,327,341,335,389,327,341,330,344,277,326,245,298,259,284,277,326,259,284,273,294,277,326,273,294,287,305,277,326,287,305,307,356,408,344,412,347,430,389,430,389,412,347,415,349,430,389,415,349,420,350,420,350,423,350,430,389,430,389,423,350,427,348,430,389,427,348,431,346,465,316,479,304,488,325,488,325,479,304,492,293,488,325,492,293,520,297,520,297,492,293,506,283,458,356,430,389,431,346,458,356,431,346,435,344,458,356,435,344,439,340,458,356,439,340,452,328,458,356,452,328,465,316,458,356,465,316,488,325,359,333,359,-101,405,-101,132,10,128,6,135,-70,135,-70,128,6,124,4,135,-70,124,4,120,3,120,3,116,4,135,-70,135,-70,116,4,113,5,135,-70,113,5,111,-34,111,-34,113,5,110,7,111,-34,110,7,106,10,184,10,182,15,182,-70,182,-70,182,15,181,23,181,23,181,456,162,-108,162,-108,181,456,155,-108,181,456,135,456,155,-108,155,-108,135,456,135,22,155,-108,135,22,135,-70,135,-70,135,22,134,15,135,-70,134,15,132,10,207,8,203,6,206,-34,206,-34,203,6,199,4,206,-34,199,4,195,4,195,4,191,5,206,-34,206,-34,191,5,187,6,206,-34,187,6,184,10,241,39,228,27,234,-1,234,-1,228,27,215,14,234,-1,215,14,211,11,268,61,255,50,264,28,268,61,264,28,295,57,268,61,295,57,282,71,241,39,234,-1,264,28,241,39,264,28,255,50,207,8,206,-34,234,-1,207,8,234,-1,211,11,106,10,102, -13,111,-34,111,-34,102,13,90,26,111,-34,90,26,83,-1,83,-1,90,26,76,38,83,-1,76,38,63,50,53,28,83,-1,63,50,53,28,63,50,49,61,53,28,49,61,35,70,53,28,35,70,22,57,182,-70,181,23,162,-108,184,10,182,-70,206,-34,406,425,408,344,430,389,359,425,356,344,358,339,452,47,462,38,457,72,457,72,462,38,483,48,483,48,462,38,471,30,483,48,471,30,480,21,480,21,483,18,483,48,483,48,483,18,486,14,483,48,486,14,511,26,511,26,486,14,488,11,511,26,488,11,489,7,452,257,462,248,457,282,457,282,462,248,483,259,483,259,462,248,471,240,483,259,471,240,480,231,480,231,483,228,483,259,483,259,483,228,486,224,483,259,486,224,511,236,511,236,486,224,488,221,511,236,488,221,489,217,472,364,476,363,478,411,472,364,478,411,471,410,472,364,471,410,42,410,472,364,42,410,42,364,445,479,456,468,468,486,468,486,456,468,467,456,468,486,467,456,480,444,480,444,483,440,499,458,499,458,483,440,486,436,499,458,486,436,488,432,440,517,426,504,435,491,440,517,435,491,445,479,440,517,445,479,468,486,480,333,457,282,483,305,480,333,426,282,440,268,480,333,440,268,457,282,488,-66,489,-70,489,4,489,4,499,-102,511,26,511,26,499,-102,532,-77,511,26,532,-77,541,6,541,6,532,-77,568,-54,541,6,568,-54,572,-12,572,-12,568,-54,606,-36,572,-12,606,-36,606,-29,477,153,482,150,482,203,482,203,482,150,485,147,482,203,485,147,486,206,486,206,485,147,488,143,486,206,488,143,488,210,488,210,488,143,489,138,488,210,489,138,489,214,489,214,511,118,511,236,511,236,511,118,540,138,511,236,540,138,541,216,541,216,540,138,572,157,541,216,572,157,572,197,572,197,572,157,606,173,572,197,606,173,606,180,489,214,511,236,489,217,489,4,511,26,489,7,488,432,489,428,499,458,499,458,489,428,489,424,499,458,489,424,511,328,511,328,489,424,489,348,489,348,489,424,488,420,489,348,488,420,488,353,488,353,488,420,486,416,488,353,486,416,485,357,485,357,486,416,483,413,485,357,483,413,481,361,481,361,483,413,478,411,481,361,478,411,476,363,499,458,468,486,480,444,499,458,511,328,532,432,532,432,511,328,540, -349,532,432,540,349,568,410,568,410,540,349,572,367,568,410,572,367,606,391,606,391,572,367,606,384,511,328,489,348,489,345,511,328,489,345,488,342,511,328,488,342,487,340,511,328,487,340,484,337,511,328,484,337,483,305,484,337,480,333,483,305,511,118,489,214,489,138,489,138,489,135,511,118,511,118,489,135,488,132,511,118,488,132,487,129,471,200,472,154,477,201,477,201,472,154,477,153,477,201,477,153,482,203,480,123,483,95,484,126,484,126,483,95,511,118,484,126,511,118,487,129,480,123,426,72,440,58,480,123,440,58,457,72,480,123,457,72,483,95,499,-102,489,4,489,-70,489,-70,489,-74,499,-102,499,-102,489,-74,488,-77,499,-102,488,-77,486,-81,471,-9,472,-55,478,-8,478,-8,472,-55,478,-56,478,-8,478,-56,483,-6,483,-6,478,-56,483,-58,483,-6,483,-58,486,-3,486,-3,483,-58,487,-62,486,-3,487,-62,488,0,488,0,487,-62,488,-66,488,0,488,-66,489,4,456,-111,469,-131,468,-100,468,-100,469,-131,480,-88,483,-84,480,-88,499,-102,483,-84,499,-102,486,-81,480,-88,469,-131,499,-102,42,200,42,154,472,154,42,200,472,154,471,200,446,-123,436,-135,441,-162,446,-123,441,-162,469,-131,446,-123,469,-131,456,-111,42,-9,42,-55,472,-55,42,-9,472,-55,471,-9,441,-162,436,-135,427,-148,457,72,440,58,452,47,457,282,440,268,452,257,162,203,158,206,159,147,159,147,158,206,156,210,159,147,156,210,156,143,156,143,156,210,155,214,155,138,149,253,149,102,149,102,149,253,117,225,149,102,117,225,116,130,116,130,117,225,81,200,116,130,81,200,81,154,81,154,81,200,42,180,81,154,42,180,42,173,209,315,180,283,190,260,209,315,190,260,201,274,209,315,201,274,212,288,209,315,212,288,223,302,180,283,149,253,157,222,180,283,157,222,159,226,180,283,159,226,161,230,180,283,161,230,165,234,180,283,165,234,177,247,180,283,177,247,190,260,156,218,157,222,149,253,156,218,149,253,155,214,189,96,177,109,180,72,180,72,177,109,165,121,180,72,165,121,161,125,391,315,356,315,391,41,391,41,356,315,356,200,391,41,356,200,356,154,356,154,356,200,173,200,356,154,173,200,173,154,168,153,173,154,173,200,168,153,173,200,167,201,163,150,168,153,167,201,163, -150,167,201,162,203,163,150,162,203,159,147,391,154,606,154,391,200,208,41,222,54,212,68,208,41,212,68,201,82,208,41,201,82,189,96,208,41,189,96,180,72,155,135,155,138,149,102,155,135,149,102,156,132,156,132,149,102,180,72,156,132,180,72,158,128,158,128,180,72,161,125,391,200,606,154,606,200,391,41,356,154,356,41,156,143,155,214,155,138,155,214,149,253,155,138,489,132,487,128,495,102,495,102,487,128,484,125,495,102,484,125,480,121,480,121,468,109,495,102,495,102,468,109,465,72,495,253,464,283,467,247,495,253,467,247,480,234,495,253,480,234,483,230,495,253,483,230,486,226,495,253,486,226,488,221,495,253,488,221,489,218,495,253,489,218,489,214,495,253,489,214,490,138,495,253,490,138,495,102,495,253,495,102,528,225,422,302,432,288,436,315,436,315,432,288,443,274,436,315,443,274,464,283,464,283,443,274,455,260,464,283,455,260,467,247,602,173,602,180,564,154,564,154,602,180,564,200,564,154,564,200,528,130,528,130,564,200,528,225,528,130,528,225,495,102,495,102,490,138,490,135,495,102,490,135,489,132,468,109,456,96,465,72,465,72,456,96,444,82,465,72,444,82,437,41,437,41,444,82,433,68,437,41,433,68,423,54,490,138,489,214,489,143,489,143,489,214,488,210,489,143,488,210,486,206,472,154,476,153,478,201,478,201,476,153,481,150,478,201,481,150,483,203,483,203,481,150,486,147,483,203,486,147,486,206,486,206,486,147,489,143,472,154,478,201,471,200,472,154,471,200,292,200,472,154,292,200,292,154,292,41,292,315,257,315,292,41,257,315,257,200,257,154,257,41,292,41,257,154,292,41,257,200,257,154,257,200,38,200,257,154,38,200,38,154,153,203,150,206,151,147,151,147,150,206,148,210,151,147,148,210,147,143,147,143,148,210,147,214,146,138,141,253,141,102,141,102,141,253,108,225,141,102,108,225,108,130,108,130,108,225,72,200,108,130,72,200,72,154,72,154,72,200,34,180,72,154,34,180,34,173,200,315,171,283,182,260,200,315,182,260,193,274,200,315,193,274,204,288,200,315,204,288,214,302,171,283,141,253,149,222,171,283,149,222,151,226,171,283,151,226,154,230,171,283,154,230,157,234,171,283,157, -234,170,247,171,283,170,247,182,260,147,218,149,222,141,253,147,218,141,253,147,214,181,96,169,109,171,72,171,72,169,109,156,121,171,72,156,121,152,125,306,41,341,41,306,154,306,154,341,41,306,200,306,154,306,200,165,154,165,154,306,200,165,200,165,154,165,200,160,153,158,201,153,203,155,150,158,201,155,150,160,153,158,201,160,153,165,200,306,315,341,41,341,315,341,200,341,154,483,154,341,200,483,154,484,200,484,200,483,154,490,153,484,200,490,153,488,201,199,41,213,54,204,68,199,41,204,68,193,82,199,41,193,82,181,96,199,41,181,96,171,72,502,216,502,140,507,102,502,216,507,102,508,253,508,253,507,102,540,130,508,253,540,130,541,225,541,225,540,130,576,154,541,225,576,154,576,200,576,200,576,154,615,173,576,200,615,173,615,180,508,253,477,283,480,245,508,253,480,245,492,233,508,253,492,233,496,229,508,253,496,229,499,226,508,253,499,226,500,222,508,253,500,222,501,219,508,253,501,219,502,216,434,302,444,288,448,315,448,315,444,288,456,273,448,315,456,273,477,283,477,283,456,273,468,259,477,283,468,259,480,245,467,94,477,72,479,107,479,107,477,72,507,102,479,107,507,102,491,120,491,120,507,102,495,124,488,201,490,153,493,203,493,203,490,153,495,151,493,203,495,151,497,207,497,207,495,151,499,148,497,207,499,148,500,211,500,211,499,148,501,144,500,211,501,144,502,216,502,216,501,144,502,140,507,102,502,140,501,136,507,102,501,136,500,132,507,102,500,132,498,128,507,102,498,128,495,124,455,81,444,68,448,41,455,81,448,41,477,72,455,81,477,72,467,94,146,135,146,138,141,102,146,135,141,102,148,132,148,132,141,102,171,72,148,132,171,72,150,128,150,128,171,72,152,125,448,41,444,68,434,54,306,200,341,41,306,315,147,143,147,214,146,138,153,203,151,147,155,150,147,214,141,253,146,138,162,203,158,206,159,147,159,147,158,206,156,210,159,147,156,210,156,143,156,143,156,210,155,214,155,138,149,253,149,102,149,102,149,253,117,225,149,102,117,225,116,130,116,130,117,225,81,200,116,130,81,200,81,154,81,154,81,200,42,180,81,154,42,180,42,173,209,315,180,283,190,260,209,315,190,260,201, -274,209,315,201,274,212,288,209,315,212,288,223,302,180,283,149,253,157,222,180,283,157,222,159,226,180,283,159,226,161,230,180,283,161,230,165,234,180,283,165,234,177,247,180,283,177,247,190,260,156,218,157,222,149,253,156,218,149,253,155,214,189,96,177,109,180,72,180,72,177,109,165,121,180,72,165,121,161,125,359,315,323,315,359,41,359,41,323,315,323,200,359,41,323,200,323,154,323,154,323,200,173,200,323,154,173,200,173,154,168,153,173,154,173,200,168,153,173,200,167,201,163,150,168,153,167,201,163,150,167,201,162,203,163,150,162,203,159,147,448,315,414,315,448,41,448,41,414,315,414,200,448,41,414,200,414,154,414,154,414,200,359,200,414,154,359,200,359,154,448,154,606,154,448,200,208,41,222,54,212,68,208,41,212,68,201,82,208,41,201,82,189,96,208,41,189,96,180,72,155,135,155,138,149,102,155,135,149,102,156,132,156,132,149,102,180,72,156,132,180,72,158,128,158,128,180,72,161,125,448,200,606,154,606,200,448,41,414,154,414,41,359,41,323,154,323,41,156,143,155,214,155,138,155,214,149,253,155,138,492,132,490,128,499,102,499,102,490,128,487,125,499,102,487,125,484,121,484,121,471,109,499,102,499,102,471,109,469,72,499,253,468,283,470,247,499,253,470,247,483,234,499,253,483,234,486,230,499,253,486,230,489,226,499,253,489,226,491,221,499,253,491,221,493,218,499,253,493,218,493,214,499,253,493,214,494,138,499,253,494,138,499,102,499,253,499,102,532,225,426,302,436,288,440,315,440,315,436,288,447,274,440,315,447,274,468,283,468,283,447,274,458,260,468,283,458,260,470,247,606,173,606,180,568,154,568,154,606,180,568,200,568,154,568,200,532,130,532,130,568,200,532,225,532,130,532,225,499,102,499,102,494,138,493,135,499,102,493,135,492,132,471,109,459,96,469,72,469,72,459,96,447,82,469,72,447,82,441,41,441,41,447,82,436,68,441,41,436,68,427,54,494,138,493,214,492,143,492,143,493,214,492,210,492,143,492,210,490,206,475,154,480,153,481,201,481,201,480,153,485,150,481,201,485,150,487,203,487,203,485,150,489,147,487,203,489,147,490,206,490,206,489,147,492,143,475,154,481,201,474,200,475, -154,474,200,325,200,475,154,325,200,325,154,325,41,325,315,290,315,325,41,290,315,290,200,234,315,199,315,234,41,234,41,199,315,199,200,234,41,199,200,199,154,199,154,199,200,42,200,199,154,42,200,42,154,325,41,290,200,290,154,290,154,290,200,234,200,290,154,234,200,234,154,325,41,290,154,290,41,234,41,199,154,199,41,146,203,143,206,144,147,144,147,143,206,141,210,144,147,141,210,140,143,140,143,141,210,140,214,139,138,134,253,134,102,134,102,134,253,101,225,134,102,101,225,101,130,101,130,101,225,65,200,101,130,65,200,65,154,65,154,65,200,27,180,65,154,27,180,27,173,193,315,164,283,175,260,193,315,175,260,186,274,193,315,186,274,197,288,193,315,197,288,207,302,164,283,134,253,142,222,164,283,142,222,144,226,164,283,144,226,147,230,164,283,147,230,150,234,164,283,150,234,163,247,164,283,163,247,175,260,140,218,142,222,134,253,140,218,134,253,140,214,174,96,162,109,164,72,164,72,162,109,149,121,164,72,149,121,145,125,262,41,297,41,262,154,262,154,297,41,262,200,262,154,262,200,158,154,158,154,262,200,158,200,158,154,158,200,153,153,151,201,146,203,148,150,151,201,148,150,153,153,151,201,153,153,158,200,387,315,352,315,387,41,387,41,352,315,352,200,387,41,352,200,352,154,352,154,352,200,297,200,352,154,297,200,297,154,297,41,297,315,262,315,297,41,262,315,262,200,387,200,387,154,490,154,387,200,490,154,491,200,491,200,490,154,497,153,491,200,497,153,495,201,508,140,514,102,509,216,509,216,514,102,515,253,515,253,514,102,548,130,515,253,548,130,548,225,548,225,548,130,583,154,548,225,583,154,583,200,583,200,583,154,622,173,583,200,622,173,622,180,515,253,484,283,487,245,515,253,487,245,499,233,515,253,499,233,503,229,515,253,503,229,506,226,515,253,506,226,507,222,515,253,507,222,508,219,515,253,508,219,509,216,441,302,451,288,455,315,455,315,451,288,463,273,455,315,463,273,484,283,484,283,463,273,475,259,484,283,475,259,487,245,474,94,484,72,486,107,486,107,484,72,514,102,486,107,514,102,498,120,498,120,514,102,502,124,507,136,506,132,514,102,507,136,514,102,508,140,504,128,502, -124,514,102,504,128,514,102,506,132,462,81,451,68,455,41,462,81,455,41,484,72,462,81,484,72,474,94,505,148,507,144,507,211,507,211,507,144,508,140,507,211,508,140,509,216,495,201,497,153,500,203,500,203,497,153,502,151,500,203,502,151,504,207,504,207,502,151,505,148,504,207,505,148,507,211,192,41,206,54,197,68,192,41,197,68,186,82,192,41,186,82,174,96,192,41,174,96,164,72,139,135,139,138,134,102,139,135,134,102,141,132,141,132,134,102,164,72,141,132,164,72,143,128,143,128,164,72,145,125,455,41,451,68,441,54,387,41,352,154,352,41,140,143,140,214,139,138,146,203,144,147,148,150,140,214,134,253,139,138,42,180,42,180,82,200,82,200,42,180,82,154,82,200,82,154,121,225,121,225,82,154,110,178,195,238,223,40,223,314,223,314,223,40,230,44,223,314,230,44,230,311,230,200,230,154,606,154,230,200,606,154,606,200,193,283,159,252,164,211,193,283,164,211,182,225,193,283,182,225,195,238,193,283,195,238,223,314,159,252,121,225,126,186,159,252,126,186,144,198,159,252,144,198,164,211,223,40,195,238,195,116,223,40,195,116,193,71,193,71,195,116,182,130,193,71,182,130,164,144,159,101,193,71,164,144,159,101,164,144,144,158,159,101,144,158,126,169,159,101,126,169,122,129,110,178,82,154,122,129,110,178,122,129,126,169,82,154,42,180,42,173,121,225,110,178,126,186,426,314,419,311,426,40,426,40,419,311,419,200,426,40,419,200,419,154,419,154,419,200,42,200,419,154,42,200,42,154,606,173,606,180,566,154,566,154,606,180,566,200,566,154,566,200,538,177,538,177,566,200,527,225,538,177,527,225,523,185,523,185,527,225,504,197,490,253,455,283,466,225,490,253,466,225,484,211,490,253,484,211,504,197,490,253,504,197,527,225,504,157,484,144,490,101,490,101,484,144,466,130,490,101,466,130,456,71,456,71,466,130,454,117,456,71,454,117,426,314,426,314,454,117,454,238,426,314,454,238,455,283,455,283,454,238,466,225,538,177,523,168,527,129,538,177,527,129,566,154,504,157,490,101,527,129,504,157,527,129,523,168,426,40,419,154,419,44,426,314,426,40,456,71,14,180,14,180,54,200,54,200,14,180,54, -154,54,200,54,154,93,225,93,225,54,154,82,178,454,314,447,311,454,40,454,40,447,311,447,200,454,40,447,200,447,154,447,154,447,200,202,200,447,154,202,200,202,154,202,44,202,311,195,314,202,44,195,314,195,40,195,40,195,314,166,238,165,283,130,252,136,211,165,283,136,211,154,225,165,283,154,225,166,238,165,283,166,238,195,314,130,252,93,225,97,186,130,252,97,186,117,198,130,252,117,198,136,211,634,173,634,180,594,154,594,154,634,180,594,200,594,154,594,200,566,177,566,177,594,200,555,225,566,177,555,225,551,185,551,185,555,225,532,197,518,253,484,283,494,225,518,253,494,225,512,211,518,253,512,211,532,197,518,253,532,197,555,225,532,157,512,144,518,101,518,101,512,144,494,130,518,101,494,130,484,71,484,71,494,130,481,117,484,71,481,117,454,314,454,314,481,117,481,238,454,314,481,238,484,283,484,283,481,238,494,225,566,177,551,168,555,129,566,177,555,129,594,154,532,157,518,101,555,129,532,157,555,129,551,168,166,116,154,130,165,71,166,116,165,71,195,40,166,116,195,40,166,238,136,144,117,158,131,101,136,144,131,101,165,71,136,144,165,71,154,130,97,169,82,178,94,129,97,169,94,129,131,101,97,169,131,101,117,158,94,129,82,178,54,154,454,40,447,154,447,44,454,314,454,40,484,71,54,154,14,180,14,173,93,225,82,178,97,186}; diff --git a/src/eval.cpp b/src/eval.cpp index ca89c53..01216b0 100644 --- a/src/eval.cpp +++ b/src/eval.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * eval.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -43,16 +43,16 @@ EQ_ADD, // addition x+y EQ_SUB, // substraction x-y EQ_MUL, // multiplication x*y EQ_DIV, // division x/y -EQ_IPOW, // power x^n for integer n +EQ_IPOW, // power x^n for integer n EQ_POW, // power x^y EQ_MOD, // x modulo y EQ_LOG, // logarithm of x on base a, log_a(x) = ln(x)/ln(a) EQ_ARG, // argument of complex number arg(x,y) = atan2(x,y) // special functions of 2 arguments -EQ_BESJ, // regular cylindrical Bessel function of fractional order -EQ_BESY, // irregular cylindrical Bessel function of fractional order -EQ_BESI, // regular modified Bessel function of fractional order -EQ_BESK, // irregular modified Bessel function of fractional order +EQ_BESJ, // regular cylindrical Bessel function of fractional order +EQ_BESY, // irregular cylindrical Bessel function of fractional order +EQ_BESI, // regular modified Bessel function of fractional order +EQ_BESK, // irregular modified Bessel function of fractional order EQ_ELE, // elliptic integral E(\phi,k) = \int_0^\phi dt \sqrt((1 - k^2 \sin^2(t))) EQ_ELF, // elliptic integral F(\phi,k) = \int_0^\phi dt 1/\sqrt((1 - k^2 \sin^2(t))) EQ_LP, // Legendre polynomial P_l(x), (|x|<=1, l>=0) @@ -61,27 +61,27 @@ EQ_BETA, // beta function B(x,y) = Gamma(x)*Gamma(y)/Gamma(x+y) EQ_SIN, // sine function \sin(x). !!! MUST BE FIRST 1-PLACE FUNCTION EQ_COS, // cosine function \cos(x). EQ_TAN, // tangent function \tan(x). -EQ_ASIN, // inverse sine function \sin(x). -EQ_ACOS, // inverse cosine function \sin(x). -EQ_ATAN, // inverse tangent function \tan(x). -EQ_SINH, // hyperbolic sine function \sin(x). -EQ_COSH, // hyperbolic cosine function \sin(x). -EQ_TANH, // hyperbolic tangent function \tan(x). +EQ_ASIN, // inverse sine function \sin(x). +EQ_ACOS, // inverse cosine function \sin(x). +EQ_ATAN, // inverse tangent function \tan(x). +EQ_SINH, // hyperbolic sine function \sin(x). +EQ_COSH, // hyperbolic cosine function \sin(x). +EQ_TANH, // hyperbolic tangent function \tan(x). EQ_ASINH, // inverse hyperbolic sine function \sin(x). EQ_ACOSH, // inverse hyperbolic cosine function \sin(x). EQ_ATANH, // inverse hyperbolic tangent function \tan(x). -EQ_SQRT, // square root function \sqrt(x) +EQ_SQRT, // square root function \sqrt(x) EQ_EXP, // exponential function \exp(x) EQ_LN, // logarithm of x, ln(x) EQ_LG, // decimal logarithm of x, lg(x) = ln(x)/ln(10) EQ_SIGN, // sign of number -EQ_STEP, // step function +EQ_STEP, // step function EQ_INT, // integer part [x] EQ_ABS, // absolute value of x // special functions of 1 argument EQ_LI2, // dilogarithm for a real argument Li2(x) = - \Re \int_0^x ds \log(1-s)/s. -EQ_ELLE, // complete elliptic integral is denoted by E(k) = E(\pi/2, k). -EQ_ELLK, // complete elliptic integral is denoted by K(k) = F(\pi/2, k). +EQ_ELLE, // complete elliptic integral is denoted by E(k) = E(\pi/2, k). +EQ_ELLK, // complete elliptic integral is denoted by K(k) = F(\pi/2, k). EQ_AI, // Airy function Ai(x) EQ_BI, // Airy function Bi(x) EQ_ERF, // error function erf(x) = (2/\sqrt(\pi)) \int_0^x dt \exp(-t^2). @@ -134,7 +134,7 @@ bool mglCheck(char *str,int n); int mglFindInText(char *str,const char *lst); //----------------------------------------------------------------------------- #if MGL_HAVE_GSL -gsl_rng *mgl_rng=0; // TODO: should be deleted by gsl_rng_free() but I don't know where :( +gsl_rng *mgl_rng=0; // NOTE: should be deleted by gsl_rng_free() but I don't know where :( #endif void mgl_srnd(long seed) { @@ -250,11 +250,11 @@ mglFormula::mglFormula(const char *string) } for(n=0;n=len) // this is number or variable + if(n>=len) // this is number or variable { Kod = EQ_NUM; // Left = Right = 0; - if(str[1]==0 && str[0]>='a' && str[0]<='z') // avalible variables + if(str[1]==0 && str[0]>='a' && str[0]<='z') // available variables { Kod=EQ_A; Res = str[0]-'a'; } else if(!strcmp(str,"rnd")) Kod=EQ_RND; else if(!strcmp(str,"pi")) Res=M_PI; @@ -401,8 +401,7 @@ mreal mglFormula::Calc(mreal x,mreal y,mreal t,mreal u) const a1['x'-'a'] = a1['r'-'a'] = x; a1['y'-'a'] = a1['n'-'a'] = a1['v'-'a'] = y; a1['z'-'a'] = a1['t'-'a'] = t; - mreal a = CalcIn(a1); - return isfinite(a) ? a : NAN; + return CalcIn(a1); } //----------------------------------------------------------------------------- // evaluate formula for 'x'='r', 'y'='n', 't'='z', 'u'='a', 'v'='b', 'w'='c' variables @@ -416,16 +415,14 @@ mreal mglFormula::Calc(mreal x,mreal y,mreal t,mreal u,mreal v,mreal w) const a1['x'-'a'] = a1['r'-'a'] = x; a1['y'-'a'] = a1['n'-'a'] = y; a1['z'-'a'] = a1['t'-'a'] = t; - mreal a = CalcIn(a1); - return isfinite(a) ? a : NAN; + return CalcIn(a1); } //----------------------------------------------------------------------------- // evaluate formula for arbitrary set of variables mreal mglFormula::Calc(const mreal var[MGL_VS]) const { Error=0; - mreal a = CalcIn(var); - return isfinite(a) ? a : NAN; + return CalcIn(var); } //----------------------------------------------------------------------------- // evaluate formula for 'x'='r', 'y'='n'='v', 't'='z', 'u'='a' variables @@ -437,8 +434,7 @@ mreal mglFormula::CalcD(char diff,mreal x,mreal y,mreal t,mreal u) const a1['x'-'a'] = a1['r'-'a'] = x; a1['y'-'a'] = a1['n'-'a'] = a1['v'-'a'] = y; a1['z'-'a'] = a1['t'-'a'] = t; - mreal a = CalcDIn(diff-'a', a1); - return isfinite(a) ? a : NAN; + return CalcDIn(diff-'a', a1); } //----------------------------------------------------------------------------- // evaluate formula for 'x'='r', 'y'='n', 't'='z', 'u'='a', 'v'='b', 'w'='c' variables @@ -452,16 +448,14 @@ mreal mglFormula::CalcD(char diff,mreal x,mreal y,mreal t,mreal u,mreal v,mreal a1['x'-'a'] = a1['r'-'a'] = x; a1['y'-'a'] = a1['n'-'a'] = y; a1['z'-'a'] = a1['t'-'a'] = t; - mreal a = CalcDIn(diff-'a', a1); - return isfinite(a) ? a : NAN; + return CalcDIn(diff-'a', a1); } //----------------------------------------------------------------------------- // evaluate derivate of formula respect to 'diff' variable for arbitrary set of other variables mreal mglFormula::CalcD(const mreal var[MGL_VS], char diff) const { Error=0; - mreal a = CalcDIn(diff-'a', var); - return isfinite(a) ? a : NAN; + return CalcDIn(diff-'a', var); } //----------------------------------------------------------------------------- double cand(double a,double b) {return a&&b?1:0;} diff --git a/src/evalc.cpp b/src/evalc.cpp index 66defaa..a8042e6 100644 --- a/src/evalc.cpp +++ b/src/evalc.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_evalc.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -30,35 +30,35 @@ double mgl_rnd(); double mgl_ipow(double x,int n); } //----------------------------------------------------------------------------- -// ��������� ��� ������������� ��������� +// constants for expression parsing enum{ EQ_NUM=0, // a variable substitution EQ_RND, // random number EQ_A, // numeric constant -// ���������� ������� +// normal functions of 2 arguments EQ_ADD, // addition x+y EQ_SUB, // substraction x-y EQ_MUL, // multiplication x*y EQ_DIV, // division x/y -EQ_IPOW, // power x^n for integer n +EQ_IPOW, // power x^n for integer n EQ_POW, // power x^y EQ_LOG, // logarithm of x on base a, log_a(x) = ln(x)/ln(a) -// ����������� ������� +// normal functions of 1 argument EQ_SIN, // sine function \sin(x). !!! MUST BE FIRST 1-PLACE FUNCTION EQ_COS, // cosine function \cos(x). EQ_TAN, // tangent function \tan(x). -EQ_ASIN, // inverse sine function \asin(x). -EQ_ACOS, // inverse cosine function \acos(x). -EQ_ATAN, // inverse tangent function \atan(x). -EQ_SINH, // hyperbolic sine function \sinh(x). -EQ_COSH, // hyperbolic cosine function \cosh(x). -EQ_TANH, // hyperbolic tangent function \tanh(x). +EQ_ASIN, // inverse sine function \asin(x). +EQ_ACOS, // inverse cosine function \acos(x). +EQ_ATAN, // inverse tangent function \atan(x). +EQ_SINH, // hyperbolic sine function \sinh(x). +EQ_COSH, // hyperbolic cosine function \cosh(x). +EQ_TANH, // hyperbolic tangent function \tanh(x). EQ_ASINH, // inverse hyperbolic sine function \asinh(x). EQ_ACOSH, // inverse hyperbolic cosine function \acosh(x). EQ_ATANH, // inverse hyperbolic tangent function \atanh(x). -EQ_SQRT, // square root function \sqrt(x) +EQ_SQRT, // square root function \sqrt(x) EQ_EXP, // exponential function \exp(x) -EQ_EXPI, // exponential function \exp(i*x) +EQ_EXPI, // exponential function \exp(i*x) EQ_LN, // logarithm of x, ln(x) EQ_LG, // decimal logarithm of x, lg(x) = ln(x)/ln(10) EQ_ABS // absolute value @@ -68,14 +68,13 @@ int mglFormulaC::Error=0; bool mglCheck(char *str,int n); int mglFindInText(char *str,const char *lst); //----------------------------------------------------------------------------- -// ���������� ������� mglFormulaC::~mglFormulaC() { if(Left) delete Left; if(Right) delete Right; } //----------------------------------------------------------------------------- -// ����������� ������� (������������� ���������� � "�����������" �������) +// Formula constructor (automatically parse and "compile" formula) mglFormulaC::mglFormulaC(const char *string) { Error=0; @@ -91,14 +90,14 @@ mglFormulaC::mglFormulaC(const char *string) mgl_strlwr(str); len=strlen(str); if(str[0]==0) { delete []str; return; } - if(str[0]=='(' && mglCheck(&(str[1]),len-2)) // ���� ��� ��������� � ������, �� ������� �� + if(str[0]=='(' && mglCheck(&(str[1]),len-2)) // remove braces { strcpy(Buf,str+1); len-=2; Buf[len]=0; strcpy(str,Buf); } len=strlen(str); - n=mglFindInText(str,"+-"); // ������� ��������� - ��������, ��������� + n=mglFindInText(str,"+-"); // normal priority -- additions if(n>=0) { if(str[n]=='+') Kod=EQ_ADD; else Kod=EQ_SUB; @@ -108,7 +107,7 @@ mglFormulaC::mglFormulaC(const char *string) delete []str; return; } - n=mglFindInText(str,"*/"); // ������� ��������� - ���������, ������� + n=mglFindInText(str,"*/"); // high priority -- multiplications if(n>=0) { if(str[n]=='*') Kod=EQ_MUL; else Kod=EQ_DIV; @@ -118,7 +117,7 @@ mglFormulaC::mglFormulaC(const char *string) delete []str; return; } - n=mglFindInText(str,"^"); // ������� ��������� - ���������� � ������� + n=mglFindInText(str,"^"); // highest priority -- power if(n>=0) { Kod=EQ_IPOW; @@ -130,16 +129,16 @@ mglFormulaC::mglFormulaC(const char *string) } for(n=0;n=len) // ��� ����� ��� ���������� + if(n>=len) // this is number or variable { Kod = EQ_NUM; // Left = Right = 0; - if(str[1]==0 && str[0]>='a' && str[0]<='z') // ��������� ��������� + if(str[1]==0 && str[0]>='a' && str[0]<='z') // available variables { Kod=EQ_A; Res = str[0]-'a'; } else if(!strcmp(str,"rnd")) Kod=EQ_RND; else if(!strcmp(str,"pi")) Res=M_PI; else if(str[0]=='i') Res = dual(0,str[1]>' '?atof(str+1):1); - else Res=atof(str); // ��� ����� + else Res=atof(str); // this is number } else { @@ -194,6 +193,7 @@ dual mglFormulaC::Calc(dual x,dual y,dual t,dual u) const a1['x'-'a'] = a1['r'-'a'] = x; a1['y'-'a'] = a1['n'-'a'] = a1['v'-'a'] = y; a1['z'-'a'] = a1['t'-'a'] = t; + a1['i'-'a'] = dual(0,1); return CalcIn(a1); } //----------------------------------------------------------------------------- @@ -208,6 +208,7 @@ dual mglFormulaC::Calc(dual x,dual y,dual t,dual u,dual v,dual w) const a1['x'-'a'] = a1['r'-'a'] = x; a1['y'-'a'] = a1['n'-'a'] = y; a1['z'-'a'] = a1['t'-'a'] = t; + a1['i'-'a'] = dual(0,1); return CalcIn(a1); } //----------------------------------------------------------------------------- @@ -229,18 +230,18 @@ dual expi(dual a) { return exp(dual(0,1)*a); } dual expi(double a) { return dual(cos(a),sin(a)); } //----------------------------------------------------------------------------- dual ic = dual(0,1); -dual asinhc(dual x) { return log(x+sqrt(x*x+1.)); } -dual acoshc(dual x) { return log(x+sqrt(x*x-1.)); } -dual atanhc(dual x) { return log((1.+x)/(1.-x))/2.; } +dual asinhc(dual x) { return log(x+sqrt(x*x+mreal(1))); } +dual acoshc(dual x) { return log(x+sqrt(x*x-mreal(1))); } +dual atanhc(dual x) { return log((mreal(1)+x)/(mreal(1)-x))/mreal(2); } dual sinc(dual x) { return sin(x); } dual cosc(dual x) { return cos(x); } dual tanc(dual x) { return tan(x); } dual sinhc(dual x) { return sinh(x); } dual coshc(dual x) { return cosh(x); } dual tanhc(dual x) { return tanh(x); } -dual asinc(dual x) { return log(ic*x+sqrt(1.-x*x))/ic; } -dual acosc(dual x) { return log(x+sqrt(x*x-1.))/ic; } -dual atanc(dual x) { return log((ic-x)/(ic+x))/(2.*ic); } +dual asinc(dual x) { return log(ic*x+sqrt(mreal(1)-x*x))/ic; } +dual acosc(dual x) { return log(x+sqrt(x*x-mreal(1)))/ic; } +dual atanc(dual x) { return log((ic-x)/(ic+x))/(mreal(2)*ic); } dual expc(dual x) { return exp(x); } dual sqrtc(dual x) { return sqrt(x); } dual logc(dual x) { return log(x); } @@ -278,8 +279,8 @@ dual mgl_ipowc(dual x,int n) dual t; if(n==2) return x*x; if(n==1) return x; - if(n<0) return 1./mgl_ipowc(x,-n); - if(n==0) return 1.; + if(n<0) return mreal(1)/mgl_ipowc(x,-n); + if(n==0) return mreal(1); t = mgl_ipowc(x,n/2); t = t*t; if(n%2==1) t *= x; return t; diff --git a/src/evalp.cpp b/src/evalp.cpp index 0206a00..1d28324 100644 --- a/src/evalp.cpp +++ b/src/evalp.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_evalp.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -18,6 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include +#include #include "mgl2/parser.h" #if MGL_HAVE_GSL #include @@ -272,7 +273,7 @@ mglData mglFormulaCalc(const wchar_t *string, mglParser *arg) { mglVar *v = arg->FindVar(str); mglNum *f = arg->FindNum(str); - if(v) res = v->d; + if(v) res = v; else if(f) res.a[0] = f->d; else if(!wcscmp(str,L"rnd")) res.a[0] = mgl_rnd(); else if(!wcscmp(str,L"nan")) res.a[0] = NAN; @@ -302,7 +303,7 @@ mglData mglFormulaCalc(const wchar_t *string, mglParser *arg) { char *buf = new char[len]; Buf[len-1]=0; mgl_wcstombs(buf, Buf+1, len-1); - res=v->d.Column(buf); delete []buf; + res=v->Column(buf); delete []buf; } else { @@ -327,7 +328,7 @@ mglData mglFormulaCalc(const wchar_t *string, mglParser *arg) } } else a1 = mglFormulaCalc(Buf, arg); - res = v->d.SubData(a1,a2,a3); + res = v->SubData(a1,a2,a3); } } else if(name[0]=='a') // function @@ -568,7 +569,7 @@ mglData mglFormulaCalc(const wchar_t *string, mglParser *arg) else { Buf[n]=0; res = mglApplyOper(Buf,Buf+n+1,arg, fmod); } } - else if(!wcscmp(name+1,L"int")) + else if(!wcscmp(name,L"int")) { res=mglFormulaCalc(Buf, arg); for(i=0;i * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -35,7 +35,7 @@ int mgls_addlegend(mglGraph *gr, long , mglArg *a, int k[10], const char *) return 0; } void mglc_addlegend(wchar_t out[1024], long , mglArg *a, int k[10], const char *) -{ if(k[0]==2 && k[1]==2) mglprintf(out,1024,L"gr->AddLegend(\"%ls\", \"%s\");",a[0].w.c_str(),a[1].s.c_str()); } +{ if(k[0]==2 && k[1]==2) mglprintf(out,1024,L"gr->AddLegend(L\"%ls\", \"%s\");",a[0].w.c_str(),a[1].s.c_str()); } //----------------------------------------------------------------------------- int mgls_addto(mglGraph *, long , mglArg *a, int k[10], const char *) { @@ -70,6 +70,17 @@ void mglc_alpha(wchar_t out[1024], long , mglArg *a, int k[10], const char *) mglprintf(out,1024,L"gr->Alpha(%s);",(k[0]==3&&a[0].v!=0)?"true":"false"); } //----------------------------------------------------------------------------- +int mgls_plotid(mglGraph *gr, long , mglArg *a, int k[10], const char *) +{ + if(k[0]==2) gr->SetPlotId(a[1].s.c_str()); + else return 1; + return 0; +} +void mglc_plotid(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +{ + if(k[0]==2) mglprintf(out,1024,L"gr->SetPlotId(\"%s\");",a[0].s.c_str()); +} +//----------------------------------------------------------------------------- int mgls_alphadef(mglGraph *gr, long , mglArg *a, int k[10], const char *) { if(k[0]==3) gr->SetAlphaDef(a[0].v); else return 1; @@ -134,22 +145,22 @@ void mglc_axial(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) mglprintf(out,1024,L"gr->Axial(%s, %s, %s, \"%s\", \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), k[3]==2?a[3].s.c_str():"",opt); } //----------------------------------------------------------------------------- -int mgls_axis(mglGraph *gr, long , mglArg *a, int k[10], const char *) +int mgls_axis(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { - if(k[0]==2 && k[1]==2) gr->SetFunc(a[0].s.c_str(),a[1].s.c_str(),k[2]==2?a[2].s.c_str():"",k[3]==2?a[3].s.c_str():""); - else if(k[0]==2) gr->Axis(a[0].s.c_str(), k[1]==2?a[1].s.c_str():""); + if(k[0]==2 && k[1]==2 && k[2]==2) gr->SetFunc(a[0].s.c_str(),a[1].s.c_str(),a[2].s.c_str(),k[3]==2?a[3].s.c_str():""); + else if(k[0]==2) gr->Axis(a[0].s.c_str(), k[1]==2?a[1].s.c_str():"",opt); else if(k[0]==3) gr->SetCoor(iint(a[0].v)); - else if(k[0]==0) gr->Axis("xyz"); + else if(k[0]==0) gr->Axis("xyz","",opt); else return 1; return 0; } -void mglc_axis(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +void mglc_axis(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { if(k[0]==2 && k[1]==2 && k[2]==2) mglprintf(out,1024,L"gr->SetFunc(\"%s\", \"%s\", \"%s\", \"%s\");", a[0].s.c_str(),a[1].s.c_str(),a[2].s.c_str(),k[2]==2?a[2].s.c_str():"",k[3]==2?a[3].s.c_str():""); - else if(k[0]==2) mglprintf(out,1024,L"gr->Axis(\"%s\", \"%s\");", a[0].s.c_str(), k[1]==2?a[1].s.c_str():""); + else if(k[0]==2) mglprintf(out,1024,L"gr->Axis(\"%s\", \"%s\",\"%s\");", a[0].s.c_str(), k[1]==2?a[1].s.c_str():"",opt); else if(k[0]==3) mglprintf(out,1024,L"gr->SetCoor(\"%d\");", iint(a[0].v)); - else if(k[0]==0) mglprintf(out,1024,L"gr->Axis(\"xyz\");"); + else if(k[0]==0) mglprintf(out,1024,L"gr->Axis(\"xyz\",\"\",\"%s\");",opt); } //----------------------------------------------------------------------------- int mgls_ball(mglGraph *gr, long , mglArg *a, int k[10], const char *) @@ -157,7 +168,7 @@ int mgls_ball(mglGraph *gr, long , mglArg *a, int k[10], const char *) if(k[0]==3 && k[1]==3 && k[2]==3) gr->Mark(mglPoint(a[0].v,a[1].v,a[2].v),k[3]==2 ? a[3].s.c_str():"r."); else if(k[0]==3 && k[1]==3) - gr->Mark(mglPoint(a[0].v,a[1].v),k[2]==2 ? a[2].s.c_str():"r."); + gr->Mark(mglPoint(a[0].v,a[1].v,NAN),k[2]==2 ? a[2].s.c_str():"r."); else return 1; return 0; } @@ -166,7 +177,7 @@ void mglc_ball(wchar_t out[1024], long , mglArg *a, int k[10], const char *) if(k[0]==3 && k[1]==3 && k[2]==3) mglprintf(out,1024,L"gr->Mark(mglPoint(%g, %g, %g), \"%s\");", a[0].v,a[1].v,a[2].v,k[3]==2 ? a[3].s.c_str():"r."); else if(k[0]==3 && k[1]==3) - mglprintf(out,1024,L"gr->Mark(mglPoint(%g, %g), \"%s\");", a[0].v, a[1].v, k[2]==2 ? a[2].s.c_str():"r."); + mglprintf(out,1024,L"gr->Mark(mglPoint(%g, %g, NAN), \"%s\");", a[0].v, a[1].v, k[2]==2 ? a[2].s.c_str():"r."); } //----------------------------------------------------------------------------- int mgls_box(mglGraph *gr, long , mglArg *a, int k[10], const char *) @@ -264,7 +275,7 @@ void mglc_boxs(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) mglprintf(out,1024,L"gr->Boxs(%s, %s, %s, \"%s\", \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), k[3]==2?a[3].s.c_str():"",opt); } //----------------------------------------------------------------------------- -int mgls_beam(mglGraph *gr, long , mglArg *a, int k[10], const char *) +int mgls_beam(mglGraph *gr, long , mglArg *a, int k[10], const char *) // NOTE beam can be made obsolete ??? { if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==1 && k[4]==3) gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v, @@ -347,6 +358,19 @@ void mglc_crop(wchar_t out[1024], long , mglArg *a, int k[10], const char *) mglprintf(out,1024,L"%s.Crop(%d, %d, '%c');",a[0].s.c_str(), iint(a[1].v), iint(a[2].v), a[3].s.c_str()[0]); } //----------------------------------------------------------------------------- +int mgls_clean(mglGraph *, long , mglArg *a, int k[10], const char *) +{ + if(k[0]==1 && k[1]==3) + a[0].d->Clean(iint(a[1].v)); + else return 1; + return 0; +} +void mglc_clean(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +{ + if(k[0]==1 && k[1]==3) + mglprintf(out,1024,L"%s.Clean(%d);",a[0].s.c_str(), iint(a[1].v)); +} +//----------------------------------------------------------------------------- int mgls_cumsum(mglGraph *, long , mglArg *a, int k[10], const char *) { if(k[0]==1 && k[1]==2) a[0].d->CumSum(a[1].s.c_str()); @@ -367,9 +391,9 @@ int mgls_curve(mglGraph *gr, long n, mglArg *a, int [10], const char *) mglPoint(a[9].v,a[10].v,a[11].v), (n>12 && a[12].type==1) ? a[12].s.c_str() : 0); else if(i==8) - gr->Curve(mglPoint(a[0].v,a[1].v), + gr->Curve(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v), - mglPoint(a[4].v,a[5].v), + mglPoint(a[4].v,a[5].v,NAN), mglPoint(a[6].v,a[7].v), (n>8 && a[8].type==1) ? a[8].s.c_str() : 0); return 0; @@ -381,7 +405,7 @@ void mglc_curve(wchar_t out[1024], long n, mglArg *a, int [10], const char *) if(i==12) mglprintf(out,1024,L"gr->Curve(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), \"%s\");", a[0].v, a[1].v, a[2].v, a[3].v, a[4].v, a[5].v, a[6].v, a[7].v, a[8].v, a[9].v, a[10].v, a[11].v, (n>12 && a[12].type==1) ? a[12].s.c_str() : ""); else if(i==8) - mglprintf(out,1024,L"gr->Curve(mglPoint(%g, %g), mglPoint(%g, %g), mglPoint(%g, %g), mglPoint(%g, %g), \"%s\");", a[0].v, a[1].v, a[2].v, a[3].v, a[4].v, a[5].v, a[6].v, a[7].v, (n>8 && a[8].type==1) ? a[8].s.c_str() : ""); + mglprintf(out,1024,L"gr->Curve(mglPoint(%g, %g, NAN), mglPoint(%g, %g), mglPoint(%g, %g, NAN), mglPoint(%g, %g), \"%s\");", a[0].v, a[1].v, a[2].v, a[3].v, a[4].v, a[5].v, a[6].v, a[7].v, (n>8 && a[8].type==1) ? a[8].s.c_str() : ""); } //----------------------------------------------------------------------------- int mgls_cut(mglGraph *gr, long n, mglArg *a, int k[10], const char *) @@ -417,20 +441,20 @@ void mglc_crust(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) //----------------------------------------------------------------------------- int mgls_colorbar(mglGraph *gr, long , mglArg *a, int k[10], const char *) { - if(k[0]==1 && k[1]==2 && k[2]==3 && k[3]==3 && k[4]==3 && k[5]==3) - gr->Colorbar(*(a[0].d), a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v); - else if(k[0]==2 && k[1]==3 && k[2]==3 && k[3]==3 && k[4]==3) - gr->Colorbar(a[0].s.c_str(), a[1].v, a[2].v, a[3].v, a[4].v); + if(k[0]==1 && k[1]==2 && k[2]==3 && k[3]==3) + gr->Colorbar(*(a[0].d), a[1].s.c_str(), a[2].v, a[3].v, k[4]==3?a[4].v:1, k[5]==3?a[5].v:1); + else if(k[0]==2 && k[1]==3 && k[2]==3) + gr->Colorbar(a[0].s.c_str(), a[1].v, a[2].v, k[3]==3?a[3].v:1, k[4]==3?a[4].v:1); else if(k[0]==1) gr->Colorbar(*(a[0].d), k[1]==2 ? a[1].s.c_str():""); else gr->Colorbar(k[0]==2 ? a[0].s.c_str():""); return 0; } void mglc_colorbar(wchar_t out[1024], long , mglArg *a, int k[10], const char *) { - if(k[0]==1 && k[1]==2 && k[2]==3 && k[3]==3 && k[4]==3 && k[5]==3) - mglprintf(out,1024,L"gr->Colorbar(%s, \"%s\", %g, %g, %g, %g);",a[0].s.c_str(), a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v); - else if(k[0]==2 && k[1]==3 && k[2]==3 && k[3]==3 && k[4]==3) - mglprintf(out,1024,L"gr->Colorbar(\"%s\", %g, %g, %g, %g);",a[0].s.c_str(), a[1].v, a[2].v, a[3].v, a[4].v); + if(k[0]==1 && k[1]==2 && k[2]==3 && k[3]==3) + mglprintf(out,1024,L"gr->Colorbar(%s, \"%s\", %g, %g, %g, %g);",a[0].s.c_str(), a[1].s.c_str(), a[2].v, a[3].v, k[4]==3?a[4].v:1, k[5]==3?a[5].v:1); + else if(k[0]==2 && k[1]==3 && k[2]==3) + mglprintf(out,1024,L"gr->Colorbar(\"%s\", %g, %g, %g, %g);",a[0].s.c_str(), a[1].v, a[2].v, k[3]==3?a[3].v:1, k[4]==3?a[4].v:1); else if(k[0]==1) mglprintf(out,1024,L"gr->Colorbar(%s, \"%s\");",a[0].s.c_str(), k[1]==2 ? a[1].s.c_str():""); else @@ -442,8 +466,7 @@ int mgls_copy(mglGraph *gr, long , mglArg *a, int k[10], const char *) if(k[0]==1 && k[1]==1) { a[0].d->Set(*(a[1].d)); - if(k[2]==2 && (k[3]!=3 || a[3].v!=0)) gr->Fill(*(a[0].d), a[2].s.c_str()); - else if(k[2]==2) a[0].d->Modify(a[2].s.c_str()); + if(k[2]==2) gr->Fill(*(a[0].d), a[2].s.c_str()); } else if(k[0]==1 && k[1]==3) *(a[0].d) = a[1].v; else return 1; @@ -451,10 +474,8 @@ int mgls_copy(mglGraph *gr, long , mglArg *a, int k[10], const char *) } void mglc_copy(wchar_t out[1024], long , mglArg *a, int k[10], const char *) { - if(k[0]==1 && k[1]==1 && k[2]==2 && (k[3]!=3 || a[3].v!=0)) + if(k[0]==1 && k[1]==1 && k[2]==2) mglprintf(out,1024,L"%s.Set(%s);\tgr->Fill(%s,\"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str()); - else if(k[0]==1 && k[1]==1 && k[2]==2) - mglprintf(out,1024,L"%s.Set(%s);\t%s.Modify(\"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str()); else if(k[0]==1 && k[1]==1) mglprintf(out,1024,L"%s.Set(%s);", a[0].s.c_str(), a[1].s.c_str()); else if(k[0]==1 && k[1]==3) @@ -571,48 +592,48 @@ int mgls_cont3(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1) return 1; else if(k[1]==1 && k[2]==1 && k[3]==1 && k[4]==1) - gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), k[5]==2?a[5].s.c_str():"", k[6]==3?iint(a[6].v):-1, opt); + gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), k[5]==2?a[5].s.c_str():"", k[6]==3?iint(a[6].v):-1,opt); else if(k[1]==1 && k[2]==1 && k[3]==1) - gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1, opt); + gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1,opt); else if(k[1]==1) - gr->Cont3(*(a[0].d), *(a[1].d), k[2]==2?a[2].s.c_str():"", k[3]==3?iint(a[3].v):-1, opt); - else gr->Cont3(*(a[0].d), k[1]==2?a[1].s.c_str():"", k[2]==3?iint(a[2].v):-1, opt); + gr->Cont3(*(a[0].d), *(a[1].d), k[2]==2?a[2].s.c_str():"", k[3]==3?iint(a[3].v):-1,opt); + else gr->Cont3(*(a[0].d), k[1]==2?a[1].s.c_str():"", k[2]==3?iint(a[2].v):-1,opt); return 0; } void mglc_cont3(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1) return; else if(k[1]==1 && k[2]==1 && k[3]==1 && k[4]==1) - mglprintf(out,1024,L"gr->Cont3(%s, %s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), k[5]==2?a[5].s.c_str():"", k[6]==3?iint(a[6].v):-1, opt); + mglprintf(out,1024,L"gr->Cont3(%s, %s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), k[5]==2?a[5].s.c_str():"", k[6]==3?iint(a[6].v):-1,opt); else if(k[1]==1 && k[2]==1 && k[3]==1) - mglprintf(out,1024,L"gr->Cont3(%s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1, opt); + mglprintf(out,1024,L"gr->Cont3(%s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1,opt); else if(k[1]==1) - mglprintf(out,1024,L"gr->Cont3(%s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), k[2]==2?a[2].s.c_str():"", k[3]==3?iint(a[3].v):-1, opt); - else mglprintf(out,1024,L"gr->Cont3(%s, \"%s\", %d, \"%s\");", a[0].s.c_str(), k[1]==2?a[1].s.c_str():"", k[2]==3?iint(a[2].v):-1, opt); + mglprintf(out,1024,L"gr->Cont3(%s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), k[2]==2?a[2].s.c_str():"", k[3]==3?iint(a[3].v):-1,opt); + else mglprintf(out,1024,L"gr->Cont3(%s, \"%s\", %d, \"%s\");", a[0].s.c_str(), k[1]==2?a[1].s.c_str():"", k[2]==3?iint(a[2].v):-1,opt); } //----------------------------------------------------------------------------- int mgls_contf3(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1) return 1; else if(k[1]==1 && k[2]==1 && k[3]==1 && k[4]==1) - gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), k[5]==2?a[5].s.c_str():"", k[6]==3?iint(a[6].v):-1, opt); + gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), k[5]==2?a[5].s.c_str():"", k[6]==3?iint(a[6].v):-1,opt); else if(k[1]==1 && k[2]==1 && k[3]==1) - gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1, opt); + gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1,opt); else if(k[1]==1) - gr->ContF3(*(a[0].d), *(a[1].d), k[2]==2?a[2].s.c_str():"", k[3]==3?iint(a[3].v):-1, opt); - else gr->ContF3(*(a[0].d), k[1]==2?a[1].s.c_str():"", k[2]==3?iint(a[2].v):-1, opt); + gr->ContF3(*(a[0].d), *(a[1].d), k[2]==2?a[2].s.c_str():"", k[3]==3?iint(a[3].v):-1,opt); + else gr->ContF3(*(a[0].d), k[1]==2?a[1].s.c_str():"", k[2]==3?iint(a[2].v):-1,opt); return 0; } void mglc_contf3(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1) return; else if(k[1]==1 && k[2]==1 && k[3]==1 && k[4]==1) - mglprintf(out,1024,L"gr->ContF3(%s, %s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), k[5]==2?a[5].s.c_str():"", k[6]==3?iint(a[6].v):-1, opt); + mglprintf(out,1024,L"gr->ContF3(%s, %s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), k[5]==2?a[5].s.c_str():"", k[6]==3?iint(a[6].v):-1,opt); else if(k[1]==1 && k[2]==1 && k[3]==1) - mglprintf(out,1024,L"gr->ContF3(%s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1, opt); + mglprintf(out,1024,L"gr->ContF3(%s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1,opt); else if(k[1]==1) - mglprintf(out,1024,L"gr->ContF3(%s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), k[2]==2?a[2].s.c_str():"", k[3]==3?iint(a[3].v):-1, opt); - else mglprintf(out,1024,L"gr->ContF3(%s, \"%s\", %d, \"%s\");", a[0].s.c_str(), k[1]==2?a[1].s.c_str():"", k[2]==3?iint(a[2].v):-1, opt); + mglprintf(out,1024,L"gr->ContF3(%s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), k[2]==2?a[2].s.c_str():"", k[3]==3?iint(a[3].v):-1,opt); + else mglprintf(out,1024,L"gr->ContF3(%s, \"%s\", %d, \"%s\");", a[0].s.c_str(), k[1]==2?a[1].s.c_str():"", k[2]==3?iint(a[2].v):-1,opt); } //----------------------------------------------------------------------------- int mgls_contx(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) @@ -723,10 +744,10 @@ int mgls_ellipse(mglGraph *gr, long , mglArg *a, int [10], const char *) { i--; break; } if(i==6) gr->Ellipse(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), - a[6].v, a[7].type==2?a[7].s.c_str():"r"); + a[6].v, a[7].type==1?a[7].s.c_str():"r"); else if(i==4) - gr->Ellipse(mglPoint(a[0].v,a[1].v), mglPoint(a[2].v,a[3].v), - a[4].v, a[5].type==2?a[5].s.c_str():"r"); + gr->Ellipse(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), + a[4].v, a[5].type==1?a[5].s.c_str():"r"); else return 1; return 0; } @@ -735,9 +756,9 @@ void mglc_ellipse(wchar_t out[1024], long , mglArg *a, int [10], const char *) int i; for(i=0;i<7;i++) if(a[i].type!=2) { i--; break; } if(i==6) - mglprintf(out,1024,L"gr->Ellipse(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), %g, \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v, a[6].v, (a[7].type==2) ? a[7].s.c_str() : "r"); + mglprintf(out,1024,L"gr->Ellipse(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), %g, \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v, a[6].v, (a[7].type==1) ? a[7].s.c_str() : "r"); else if(i==4) - mglprintf(out,1024,L"gr->Ellipse(mglPoint(%g, %g), mglPoint(%g, %g), %g, \"%s\");", a[0].v,a[1].v,a[2].v,a[3].v,a[4].v, (a[5].type==2) ? a[5].s.c_str() : "r"); + mglprintf(out,1024,L"gr->Ellipse(mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), %g, \"%s\");", a[0].v,a[1].v,a[2].v,a[3].v,a[4].v, (a[5].type==1) ? a[5].s.c_str() : "r"); } //----------------------------------------------------------------------------- int mgls_circle(mglGraph *gr, long , mglArg *a, int [10], const char *) @@ -745,9 +766,9 @@ int mgls_circle(mglGraph *gr, long , mglArg *a, int [10], const char *) int i; for(i=0;i<4;i++) if(a[i].type!=2) { i--; break; } if(i==3) - gr->Circle(mglPoint(a[0].v,a[1].v,a[2].v), a[3].v, a[4].type==2?a[4].s.c_str():"r"); + gr->Circle(mglPoint(a[0].v,a[1].v,a[2].v), a[3].v, a[4].type==1?a[4].s.c_str():"r"); else if(i==2) - gr->Circle(mglPoint(a[0].v,a[1].v), a[2].v, a[3].type==2?a[3].s.c_str():"r"); + gr->Circle(mglPoint(a[0].v,a[1].v, NAN), a[2].v, a[3].type==1?a[3].s.c_str():"r"); else return 1; return 0; } @@ -757,9 +778,9 @@ void mglc_circle(wchar_t out[1024], long , mglArg *a, int [10], const char *) for(i=0;i<4;i++) if(a[i].type!=2) { i--; break; } if(i==3) - mglprintf(out,1024,L"gr->Circle(mglPoint(%g, %g, %g), %g, \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v, (a[4].type==2) ? a[4].s.c_str() : "r"); + mglprintf(out,1024,L"gr->Circle(mglPoint(%g, %g, %g), %g, \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v, (a[4].type==1) ? a[4].s.c_str() : "r"); else if(i==2) - mglprintf(out,1024,L"gr->Circle(mglPoint(%g, %g), %g, \"%s\");", a[0].v,a[1].v, a[2].v, (a[3].type==2) ? a[3].s.c_str() : "r"); + mglprintf(out,1024,L"gr->Circle(mglPoint(%g, %g, NAN), %g, \"%s\");", a[0].v,a[1].v, a[2].v, (a[3].type==1) ? a[3].s.c_str() : "r"); } //----------------------------------------------------------------------------- int mgls_rhomb(mglGraph *gr, long , mglArg *a, int [10], const char *) @@ -769,10 +790,10 @@ int mgls_rhomb(mglGraph *gr, long , mglArg *a, int [10], const char *) { i--; break; } if(i==6) gr->Rhomb(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), - a[6].v, a[7].type==2?a[7].s.c_str():"r"); + a[6].v, a[7].type==1?a[7].s.c_str():"r"); else if(i==4) - gr->Rhomb(mglPoint(a[0].v,a[1].v), mglPoint(a[2].v,a[3].v), - a[4].v, a[5].type==2?a[5].s.c_str():"r"); + gr->Rhomb(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), + a[4].v, a[5].type==1?a[5].s.c_str():"r"); else return 1; return 0; } @@ -782,9 +803,9 @@ void mglc_rhomb(wchar_t out[1024], long , mglArg *a, int [10], const char *) for(i=0;i<7;i++) if(a[i].type!=2) { i--; break; } if(i==6) - mglprintf(out,1024,L"gr->Rhomb(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), %g, \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v, a[6].v, (a[7].type==2) ? a[7].s.c_str() : "r"); + mglprintf(out,1024,L"gr->Rhomb(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), %g, \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v, a[6].v, (a[7].type==1) ? a[7].s.c_str() : "r"); else if(i==4) - mglprintf(out,1024,L"gr->Rhomb(mglPoint(%g, %g), mglPoint(%g, %g), %g, \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v,a[4].v, (a[5].type==2) ? a[5].s.c_str() : "r"); + mglprintf(out,1024,L"gr->Rhomb(mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), %g, \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v,a[4].v, (a[5].type==1) ? a[5].s.c_str() : "r"); } //----------------------------------------------------------------------------- int mgls_dens(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) @@ -809,7 +830,7 @@ int mgls_dens3(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1) return 1; else if(k[1]==1 && k[2]==1 && k[3]==1) - gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1, opt); + gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1,opt); else gr->Dens3(*(a[0].d),k[1]==2?a[1].s.c_str():"",k[2]==3?iint(a[2].v):-1,opt); return 0; } @@ -817,7 +838,7 @@ void mglc_dens3(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1) return; else if(k[1]==1 && k[2]==1 && k[3]==1) - mglprintf(out,1024,L"gr->Dens3(%s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1, opt); + mglprintf(out,1024,L"gr->Dens3(%s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1,opt); else mglprintf(out,1024,L"gr->Dens3(%s, \"%s\", %d, \"%s\");", a[0].s.c_str(), k[1]==2?a[1].s.c_str():"",k[2]==3?iint(a[2].v):-1,opt); } //----------------------------------------------------------------------------- @@ -1215,14 +1236,14 @@ void mglc_loadfont(wchar_t out[1024], long , mglArg *a, int k[10], const char *) mglprintf(out,1024,L"gr->RestoreFont();"); } //----------------------------------------------------------------------------- -int mgls_grid(mglGraph *gr, long , mglArg *a, int k[10], const char *) +int mgls_grid(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { - gr->Grid(k[0]==2?a[0].s.c_str():"xyzt", k[1]==2?a[1].s.c_str():"B-"); + gr->Grid(k[0]==2?a[0].s.c_str():"xyzt", k[1]==2?a[1].s.c_str():"B-",opt); return 0; } -void mglc_grid(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +void mglc_grid(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { - mglprintf(out,1024,L"gr->Grid(\"%s\", \"%s\");", k[0]==2?a[0].s.c_str():"xyz", k[1]==2?a[1].s.c_str():"B-"); + mglprintf(out,1024,L"gr->Grid(\"%s\", \"%s\", \"%s\");", k[0]==2?a[0].s.c_str():"xyz", k[1]==2?a[1].s.c_str():"B-",opt); } //----------------------------------------------------------------------------- int mgls_grid2(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) @@ -1245,7 +1266,7 @@ int mgls_grid3(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1) return 1; else if(k[1]==1 && k[2]==1 && k[3]==1) - gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1, opt); + gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1,opt); else gr->Grid3(*(a[0].d),k[1]==2?a[1].s.c_str():"",k[2]==3?iint(a[2].v):-1,opt); return 0; } @@ -1253,7 +1274,7 @@ void mglc_grid3(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1) return; else if(k[1]==1 && k[2]==1 && k[3]==1) - mglprintf(out,1024,L"gr->Grid3(%s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1, opt); + mglprintf(out,1024,L"gr->Grid3(%s, %s, %s, %s, \"%s\", %d, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]==2?a[4].s.c_str():"", k[5]==3?iint(a[5].v):-1,opt); else mglprintf(out,1024,L"gr->Grid3(%s, \"%s\", %d, \"%s\");", a[0].s.c_str(), k[1]==2?a[1].s.c_str():"",k[2]==3?iint(a[2].v):-1,opt); } //----------------------------------------------------------------------------- @@ -1325,20 +1346,64 @@ void mglc_line(wchar_t out[1024], long n, mglArg *a, int [10], const char *) } } //----------------------------------------------------------------------------- -int mgls_legend(mglGraph *gr, long , mglArg *a, int k[10], const char *) +int mgls_errbox(mglGraph *gr, long n, mglArg *a, int [10], const char *) +{ + int i; + if(n>5) + { + bool ok=true; + for(i=0;i<6;i++) if(a[i].type!=2) ok=false; + if(ok) + gr->Error(mglPoint(a[0].v,a[1].v,a[2].v), + mglPoint(a[3].v,a[4].v,a[5].v), + (n==7 && a[6].type==1) ? a[6].s.c_str() : ""); + else return 1; + } + else if(n>3) + { + bool ok=true; + for(i=0;i<4;i++) if(a[i].type!=2) ok=false; + if(ok) + gr->Error(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), + (n==5 && a[4].type==1) ? a[4].s.c_str() : ""); + else return 1; + } + else return 1; + return 0; +} +void mglc_errbox(wchar_t out[1024], long n, mglArg *a, int [10], const char *) +{ + int i; + if(n>5) + { + bool ok=true; + for(i=0;i<6;i++) if(a[i].type!=2) ok=false; + if(ok) + mglprintf(out,1024,L"gr->Error(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v, (n==7 && a[6].type==1) ? a[6].s.c_str() : ""); + } + else if(n>3) + { + bool ok=true; + for(i=0;i<4;i++) if(a[i].type!=2) ok=false; + if(ok) + mglprintf(out,1024,L"gr->Error(mglPoint(%g, %g, gr->Min.z), mglPoint(%g, %g, gr->Min.z), \"%s\");", a[0].v,a[1].v,a[2].v, a[3].v, (n==5 && a[4].type==1) ? a[4].s.c_str() : ""); + } +} +//----------------------------------------------------------------------------- +int mgls_legend(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]==3 && k[1]==3) - gr->Legend(a[0].v, a[1].v, k[2]==2?a[2].s.c_str():"rL", k[3]==3?a[3].v:-1, k[4]==3?a[4].v:0.1); + gr->Legend(a[0].v, a[1].v, k[2]==2?a[2].s.c_str():"#", opt); else - gr->Legend(k[0]==3?iint(a[0].v):3, k[1]==2?a[1].s.c_str():"rL", k[2]==3?a[2].v:-1, k[3]==3?a[3].v:0.1); + gr->Legend(k[0]==3?iint(a[0].v):3, k[1]==2?a[1].s.c_str():"#", opt); return 0; } -void mglc_legend(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +void mglc_legend(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { if(k[0]==3 && k[1]==3) - mglprintf(out,1024,L"gr->Legend(%g, %g, \"%s\", %g, %g);", a[0].v, a[1].v, k[2]==2?a[2].s.c_str():"rL", k[3]==3?a[3].v:-1, k[4]==3?a[4].v:0.1); + mglprintf(out,1024,L"gr->Legend(%g, %g, \"%s\", \"%s\");", a[0].v, a[1].v, k[2]==2?a[2].s.c_str():"#", opt); else - mglprintf(out,1024,L"gr->Legend(%d, \"%s\", %g, %g);", k[0]==3?iint(a[0].v):3, k[1]==2?a[1].s.c_str():"rL", k[2]==3?a[2].v:-1, k[4]==3?a[4].v:0.1); + mglprintf(out,1024,L"gr->Legend(%d, \"%s\", \"%s\");", k[0]==3?iint(a[0].v):3, k[1]==2?a[1].s.c_str():"#", opt); } //----------------------------------------------------------------------------- int mgls_barwidth(mglGraph *gr, long , mglArg *a, int k[10], const char *) @@ -1430,24 +1495,34 @@ void mglc_meshnum(wchar_t out[1024], long , mglArg *a, int k[10], const char *) if(k[0]==3) mglprintf(out,1024,L"gr->SetMeshNum(%d);", iint(a[0].v)); } //----------------------------------------------------------------------------- +int mgls_facenum(mglGraph *gr, long , mglArg *a, int k[10], const char *) +{ + if(k[0]==3) gr->SetFaceNum(a[0].v); else return 1; + return 0; +} +void mglc_facenum(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +{ + if(k[0]==3) mglprintf(out,1024,L"gr->SetFaceNum(%d);", iint(a[0].v)); +} +//----------------------------------------------------------------------------- int mgls_quality(mglGraph *gr, long , mglArg *a, int k[10], const char *) { - if(k[0]==3) gr->SetQuality(a[0].v); else return 1; + gr->SetQuality(k[0]==3?iint(a[0].v):2); return 0; } void mglc_quality(wchar_t out[1024], long , mglArg *a, int k[10], const char *) { - if(k[0]==3) mglprintf(out,1024,L"gr->SetQuality(%d);", iint(a[0].v)); + if(k[0]==3) mglprintf(out,1024,L"gr->SetQuality(%d);", k[0]==3?iint(a[0].v):2); } //----------------------------------------------------------------------------- int mgls_marksize(mglGraph *gr, long , mglArg *a, int k[10], const char *) { - if(k[0]==3) gr->SetMarkSize(a[0].v/50); else return 1; + if(k[0]==3) gr->SetMarkSize(a[0].v); else return 1; return 0; } void mglc_marksize(wchar_t out[1024], long , mglArg *a, int k[10], const char *) { - if(k[0]==3) mglprintf(out,1024,L"gr->SetMarkSize(%g);", a[0].v/50); + if(k[0]==3) mglprintf(out,1024,L"gr->SetMarkSize(%g);", a[0].v); } //----------------------------------------------------------------------------- int mgls_mark(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) @@ -1603,9 +1678,11 @@ void mglc_rect(wchar_t out[1024], long n, mglArg *a, int [10], const char *) if(ok) { if(a[0].v==a[3].v) - mglprintf(out,1024,L"gr->Face(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), \"%s\");", a[0].v,a[1].v,a[2].v, a[0].v,a[4].v,a[2].v, a[3].v,a[1].v,a[5].v, a[3].v,a[4].v,a[5].v, (n==7 && a[6].type==1) ? a[6].s.c_str() : ""); + mglprintf(out,1024,L"gr->Face(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), \"%s\");", + a[0].v,a[1].v,a[2].v, a[0].v,a[4].v,a[2].v, a[3].v,a[1].v,a[5].v, a[3].v,a[4].v,a[5].v, (n==7 && a[6].type==1) ? a[6].s.c_str() : ""); else - mglprintf(out,1024,L"gr->Face(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), \"%s\");", a[0].v,a[1].v,a[2].v, a[0].v,a[4].v,a[5].v, a[3].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v, (n==7 && a[6].type==1) ? a[6].s.c_str() : ""); + mglprintf(out,1024,L"gr->Face(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), \"%s\");", + a[0].v,a[1].v,a[2].v, a[0].v,a[4].v,a[5].v, a[3].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v, (n==7 && a[6].type==1) ? a[6].s.c_str() : ""); } } else if(n>3) @@ -1613,7 +1690,50 @@ void mglc_rect(wchar_t out[1024], long n, mglArg *a, int [10], const char *) bool ok=true; for(i=0;i<4;i++) if(a[i].type!=2) ok=false; if(ok) - mglprintf(out,1024,L"gr->Face(mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), \"%s\", 2);", a[0].v,a[1].v, a[0].v,a[3].v, a[2].v,a[1].v, a[2].v,a[3].v, (n==5 && a[4].type==1) ? a[4].s.c_str() : ""); + mglprintf(out,1024,L"gr->Face(mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), \"%s\", 2);", + a[0].v,a[1].v, a[0].v,a[3].v, a[2].v,a[1].v, a[2].v,a[3].v, (n==5 && a[4].type==1) ? a[4].s.c_str() : ""); + } +} +//----------------------------------------------------------------------------- +int mgls_face(mglGraph *gr, long n, mglArg *a, int [10], const char *) +{ + long i; + bool ok=true; + if(n>11) + { + for(i=0;i<12;i++) if(a[i].type!=2) ok=false; + if(ok) gr->Face(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), + mglPoint(a[6].v,a[7].v,a[8].v), mglPoint(a[9].v,a[10].v,a[11].v), + (n==13 && a[12].type==1) ? a[12].s.c_str() : 0); + } + else if(n>7) + { + for(i=0;i<8;i++) if(a[i].type!=2) ok=false; + if(ok) gr->Face(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), + mglPoint(a[4].v,a[5].v,NAN), mglPoint(a[6].v,a[7].v,NAN), + (n==9 && a[8].type==1) ? a[8].s.c_str() : 0); + } + else ok=false; + return ok?0:1; +} +void mglc_face(wchar_t out[1024], long n, mglArg *a, int [10], const char *) +{ + long i; + bool ok=true; + if(n>11) + { + for(i=0;i<12;i++) if(a[i].type!=2) ok=false; + if(ok) + mglprintf(out,1024,L"gr->Face(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), \"%s\");", + a[0].v,a[1].v,a[2].v, a[3].v,a[4].v,a[5].v, a[6].v,a[7].v,a[8].v, a[9].v,a[10].v,a[11].v, + (n==13 && a[12].type==1) ? a[12].s.c_str() : ""); + } + else if(n>7) + { + for(i=0;i<8;i++) if(a[i].type!=2) ok=false; + if(ok) + mglprintf(out,1024,L"gr->Face(mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), mglPoint(%g, %g, NAN), \"%s\", 2);", + a[0].v,a[1].v, a[2].v,a[3].v, a[4].v,a[5].v, a[6].v,a[7].v, (n==9 && a[8].type==1) ? a[8].s.c_str() : ""); } } //----------------------------------------------------------------------------- @@ -1839,9 +1959,9 @@ void mglc_candle(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt else if(k[1]==1 && k[2]==1) mglprintf(out,1024,L"gr->Candle(%s, %s, %s, \"%s\", \"%s\");",a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), k[3]==2?a[3].s.c_str():"",opt); else if(k[1]==1) - mglprintf(out,1024,L"gr->Candle(%s, %s, \"%s\", \"%s\");",a[0].s.c_str(), a[1].s.c_str(), k[2]==2?a[2].s.c_str():"", opt); + mglprintf(out,1024,L"gr->Candle(%s, %s, \"%s\", \"%s\");",a[0].s.c_str(), a[1].s.c_str(), k[2]==2?a[2].s.c_str():"",opt); else - mglprintf(out,1024,L"gr->Candle(%s, \"%s\", \"%s\");",a[0].s.c_str(), k[1]==2?a[1].s.c_str():"", opt); + mglprintf(out,1024,L"gr->Candle(%s, \"%s\", \"%s\");",a[0].s.c_str(), k[1]==2?a[1].s.c_str():"",opt); } //----------------------------------------------------------------------------- int mgls_radar(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) @@ -1937,7 +2057,7 @@ void mglc_stfa(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) int mgls_surf3(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1) return 1; - else if(k[1]==0) gr->Surf3(*(a[0].d),opt); + else if(k[1]==0) gr->Surf3(*(a[0].d),"",opt); else if(k[1]==1 && k[2]==1 && k[3]==1 && k[4]==3) gr->Surf3(a[4].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d), k[5]==2? a[5].s.c_str():"",opt); @@ -1965,7 +2085,7 @@ void mglc_surf3(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) int mgls_surf3c(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1 || k[1]!=1) return 1; - else if(k[2]==0) gr->Surf3C(*(a[0].d),*(a[1].d),opt); + else if(k[2]==0) gr->Surf3C(*(a[0].d),*(a[1].d),"",opt); else if(k[2]==1 && k[3]==1 && k[4]==1 && k[5]==3) gr->Surf3C(a[5].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d), k[6]==2? a[6].s.c_str():"",opt); @@ -1993,7 +2113,7 @@ void mglc_surf3c(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt int mgls_surf3a(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]!=1 || k[1]!=1) return 1; - else if(k[2]==0) gr->Surf3A(*(a[0].d),*(a[1].d),opt); + else if(k[2]==0) gr->Surf3A(*(a[0].d),*(a[1].d),"",opt); else if(k[2]==1 && k[3]==1 && k[4]==1 && k[5]==3) gr->Surf3A(a[5].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d), k[6]==2? a[6].s.c_str():"",opt); @@ -2047,14 +2167,14 @@ void mglc_multiplot(wchar_t out[1024], long , mglArg *a, int k[10], const char * //----------------------------------------------------------------------------- int mgls_title(mglGraph *gr, long , mglArg *a, int k[10], const char *) { - if(k[0]==2) gr->Title(a[0].w.c_str(), k[1]==2?a[1].s.c_str():"", k[2]==2?a[2].v:-2); + if(k[0]==2) gr->Title(a[0].w.c_str(), k[1]==2?a[1].s.c_str():"", k[2]==3?a[2].v:-2); else return 1; return 0; } void mglc_title(wchar_t out[1024], long , mglArg *a, int k[10], const char *) { if(k[0]==2) - mglprintf(out,1024,L"gr->Title(L\"%ls\", \"%s\", %g);", a[0].w.c_str(), k[1]==2?a[1].s.c_str():"#", k[2]==2?a[2].v:-2); + mglprintf(out,1024,L"gr->Title(L\"%ls\", \"%s\", %g);", a[0].w.c_str(), k[1]==2?a[1].s.c_str():"#", k[2]==3?a[2].v:-2); } //----------------------------------------------------------------------------- int mgls_column(mglGraph *, long , mglArg *a, int k[10], const char *) @@ -2130,13 +2250,13 @@ void mglc_tiles(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) mglprintf(out,1024,L"gr->TileS(%s, %s, %s, %s, \"%s\", \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]==2?a[4].s.c_str():"",opt); } //----------------------------------------------------------------------------- -int mgls_text(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) +int mgls_text(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) // NOTE don't use options -- Puts can be part of group { if(k[0]==3 && k[1]==3 && k[2]==3 && k[3]==2) gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v),a[3].w.c_str(), (k[4]==2 && a[4].s.c_str()[0]!=0)?a[4].s.c_str():"",k[5]==3?a[5].v:-1); else if(k[0]==3 && k[1]==3 && k[2]==2) - gr->Putsw(mglPoint(a[0].v,a[1].v),a[2].w.c_str(), + gr->Putsw(mglPoint(a[0].v,a[1].v,NAN),a[2].w.c_str(), (k[3]==2 && a[3].s.c_str()[0]!=0)?a[3].s.c_str():"",k[4]==3?a[4].v:-1); else if(k[0]==3 && k[1]==3 && k[2]==3 && k[3]==3 && k[4]==3 && k[5]==3 && k[6]==2) gr->Putsw(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), a[6].w.c_str(), k[7]==2?a[7].s.c_str():":L", k[8]==3?a[8].v:-1); @@ -2156,7 +2276,7 @@ void mglc_text(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) if(k[0]==3 && k[1]==3 && k[2]==3 && k[3]==2) mglprintf(out,1024,L"gr->Puts(mglPoint(%g, %g, %g), L\"%ls\", \"%s\", %g);", a[0].v, a[1].v, a[2].v, a[3].w.c_str(), (k[4]==2 && a[4].s.c_str()[0]!=0)?a[4].s.c_str():"", k[5]==3?a[5].v:-1); else if(k[0]==3 && k[1]==3 && k[2]==2) - mglprintf(out,1024,L"gr->Puts(mglPoint(%g, %g), L\"%ls\", \"%s\", %g);", a[0].v, a[1].v, a[2].w.c_str(), (k[3]==2 && a[3].s.c_str()[0]!=0)?a[3].s.c_str():"", k[4]==3?a[4].v:-1); + mglprintf(out,1024,L"gr->Puts(mglPoint(%g, %g, NAN), L\"%ls\", \"%s\", %g);", a[0].v, a[1].v, a[2].w.c_str(), (k[3]==2 && a[3].s.c_str()[0]!=0)?a[3].s.c_str():"", k[4]==3?a[4].v:-1); else if(k[0]==3 && k[1]==3 && k[2]==3 && k[3]==3 && k[4]==3 && k[5]==3 && k[6]==2) mglprintf(out,1024,L"gr->Puts(mglPoint(%g, %g, %g), mglPoint(%g, %g, %g), L\"%ls\", \"%s\", %g);", a[0].v, a[1].v, a[2].v, a[3].v, a[4].v, a[5].v, a[6].w.c_str(), k[7]==2?a[7].s.c_str():":L", k[8]==3?a[8].v:-1); else if(k[0]==3 && k[1]==3 && k[2]==3 && k[3]==3 && k[4]==2) @@ -2405,6 +2525,29 @@ void mglc_vect(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) mglprintf(out,1024,L"gr->Vect(%s, %s, %s, %s, %s, %s, \"%s\", \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), a[5].s.c_str(), k[6]==2?a[6].s.c_str():"",opt); } //----------------------------------------------------------------------------- +int mgls_vect3(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) +{ + int i; + for(i=0;i<7;i++) if(k[i]!=1) break; + if(i==3) + gr->Vect3(*(a[0].d),*(a[1].d),*(a[2].d),k[3]==2?a[3].s.c_str():"",k[4]==3?a[4].v:-1,opt); + else if(i==6) + gr->Vect3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),k[6]==2?a[6].s.c_str():"",k[7]==3?a[7].v:-1,opt); + else return 1; + return 0; +} +void mglc_vect3(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) +{ + int i; + for(i=0;i<7;i++) if(k[i]!=1) break; + if(i==3) + mglprintf(out,1024,L"gr->Vect3(%s, %s, %s, \"%s\", %g, \"%s\");", + a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), k[3]==2?a[3].s.c_str():"",k[4]==3?a[4].v:-1,opt); + else if(i==6) + mglprintf(out,1024,L"gr->Vect3(%s, %s, %s, %s, %s, %s, \"%s\", %g, \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), + a[3].s.c_str(), a[4].s.c_str(), a[5].s.c_str(), k[6]==2?a[6].s.c_str():"",k[7]==3?a[7].v:-1,opt); +} +//----------------------------------------------------------------------------- int mgls_traj(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { int i; @@ -2426,69 +2569,86 @@ void mglc_traj(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) mglprintf(out,1024,L"gr->Traj(%s, %s, %s, %s, %s, %s, \"%s\", \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), a[5].s.c_str(), k[6]==2?a[6].s.c_str():"",opt); } //----------------------------------------------------------------------------- -int mgls_xlabel(mglGraph *gr, long , mglArg *a, int k[10], const char *) +int mgls_xlabel(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { - if(k[0]==2) gr->Label('x', a[0].w.c_str(), k[1]==3?a[1].v:1, k[2]==3?a[2].v:0); + if(k[0]==2) gr->Label('x', a[0].w.c_str(), k[1]==3?a[1].v:1, opt); else return 1; return 0; } -void mglc_xlabel(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +void mglc_xlabel(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { - if(k[0]==2) mglprintf(out,1024,L"gr->Label('x', L\"%ls\", %g, %g);", a[0].w.c_str(), k[1]==3?a[1].v:1, k[2]==3?a[2].v:0); + if(k[0]==2) mglprintf(out,1024,L"gr->Label('x', L\"%ls\", %g, \"%ls\");", a[0].w.c_str(), k[1]==3?a[1].v:1, opt); } //----------------------------------------------------------------------------- -int mgls_ylabel(mglGraph *gr, long , mglArg *a, int k[10], const char *) +int mgls_ylabel(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { - if(k[0]==2) gr->Label('y', a[0].w.c_str(), k[1]==3?a[1].v:1, k[2]==3?a[2].v:0); + if(k[0]==2) gr->Label('y', a[0].w.c_str(), k[1]==3?a[1].v:1, opt); else return 1; return 0; } -void mglc_ylabel(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +void mglc_ylabel(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { - if(k[0]==2) mglprintf(out,1024,L"gr->Label('y', L\"%ls\", %g, %g);", a[0].w.c_str(), k[1]==3?a[1].v:1, k[2]==3?a[2].v:0); + if(k[0]==2) mglprintf(out,1024,L"gr->Label('y', L\"%ls\", %g, \"%ls\");", a[0].w.c_str(), k[1]==3?a[1].v:1, opt); } //----------------------------------------------------------------------------- -int mgls_zlabel(mglGraph *gr, long , mglArg *a, int k[10], const char *) +int mgls_zlabel(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { - if(k[0]==2) gr->Label('z', a[0].w.c_str(), k[1]==3?a[1].v:1, k[2]==3?a[2].v:0); + if(k[0]==2) gr->Label('z', a[0].w.c_str(), k[1]==3?a[1].v:1, opt); else return 1; return 0; } -void mglc_zlabel(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +void mglc_zlabel(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { - if(k[0]==2) mglprintf(out,1024,L"gr->Label('z', L\"%ls\", %g, %g);", a[0].w.c_str(), k[1]==3?a[1].v:1, k[2]==3?a[2].v:0); + if(k[0]==2) mglprintf(out,1024,L"gr->Label('z', L\"%ls\", %g, \"%ls\");", a[0].w.c_str(), k[1]==3?a[1].v:1, opt); } //----------------------------------------------------------------------------- -int mgls_tlabel(mglGraph *gr, long , mglArg *a, int k[10], const char *) +int mgls_tlabel(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { - if(k[0]==2) gr->Label('t', a[0].w.c_str(), k[1]==3?a[1].v:1, k[2]==3?a[2].v:0); + if(k[0]==2) gr->Label('t', a[0].w.c_str(), k[1]==3?a[1].v:1, opt); else return 1; return 0; } -void mglc_tlabel(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +void mglc_tlabel(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { - if(k[0]==2) mglprintf(out,1024,L"gr->Label('t', L\"%ls\", %g, %g);", a[0].w.c_str(), k[1]==3?a[1].v:1, k[2]==3?a[2].v:0); + if(k[0]==2) mglprintf(out,1024,L"gr->Label('t', L\"%ls\", %g, \"%ls\");", a[0].w.c_str(), k[1]==3?a[1].v:1, opt); } //----------------------------------------------------------------------------- int mgls_label(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==2) - gr->Label(*(a[0].d), *(a[1].d), *(a[2].d), a[3].w.c_str(), k[4]==2?a[4].s.c_str():"", opt); + gr->Label(*(a[0].d), *(a[1].d), *(a[2].d), a[3].w.c_str(), k[4]==2?a[4].s.c_str():"",opt); else if(k[0]==1 && k[1]==1 && k[2]==2) - gr->Label(*(a[0].d), *(a[1].d), a[2].w.c_str(), k[3]==2?a[3].s.c_str():"", opt); + gr->Label(*(a[0].d), *(a[1].d), a[2].w.c_str(), k[3]==2?a[3].s.c_str():"",opt); else if(k[0]==1 && k[1]==2) - gr->Label(*(a[0].d), a[1].w.c_str(), k[2]==2?a[2].s.c_str():"", opt); + gr->Label(*(a[0].d), a[1].w.c_str(), k[2]==2?a[2].s.c_str():"",opt); else return 1; return 0; } void mglc_label(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==2) - mglprintf(out,1024,L"gr->Label(%s, %s, %s, \"%ls\", \"%s\", \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].w.c_str(), k[4]==2?a[4].s.c_str():"", opt); + mglprintf(out,1024,L"gr->Label(%s, %s, %s, L\"%ls\", \"%s\", \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].w.c_str(), k[4]==2?a[4].s.c_str():"",opt); else if(k[0]==1 && k[1]==1 && k[2]==2) - mglprintf(out,1024,L"gr->Label(%s, %s, \"%ls\", \"%s\", \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].w.c_str(), k[3]==2?a[3].s.c_str():"", opt); + mglprintf(out,1024,L"gr->Label(%s, %s, L\"%ls\", \"%s\", \"%s\");", a[0].s.c_str(), a[1].s.c_str(), a[2].w.c_str(), k[3]==2?a[3].s.c_str():"",opt); else if(k[0]==1 && k[1]==2) - mglprintf(out,1024,L"gr->Label(%s, \"%ls\", \"%s\", \"%s\");", a[0].s.c_str(), a[1].w.c_str(), k[2]==2?a[2].s.c_str():"", opt); + mglprintf(out,1024,L"gr->Label(%s, L\"%ls\", \"%s\", \"%s\");", a[0].s.c_str(), a[1].w.c_str(), k[2]==2?a[2].s.c_str():"",opt); +} +//----------------------------------------------------------------------------- +int mgls_table(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) +{ + if(k[0]==3 && k[1]==3 && k[2]==1) + gr->Table(a[0].v, a[1].v, *(a[2].d), k[3]==2?a[3].w.c_str():L"", k[4]==2?a[4].s.c_str():"#|",opt); + else if(k[0]==1) + gr->Table(*(a[0].d), k[1]==2?a[1].w.c_str():L"", k[2]==2?a[2].s.c_str():"#|",opt); + else return 1; + return 0; +} +void mglc_table(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) +{ + if(k[0]==3 && k[1]==3 && k[2]==1) + mglprintf(out,1024,L"gr->Table(%g, %g, %s, L\"%ls\", \"%s\", \"%s\");", a[0].v, a[1].v, a[2].s.c_str(), k[3]==2?a[3].w.c_str():L"", k[4]==2?a[4].s.c_str():"|#",opt); + else if(k[0]==1) + mglprintf(out,1024,L"gr->Table(%s, L\"%ls\", \"%s\", \"%s\");", a[0].s.c_str(), k[1]==2?a[1].w.c_str():L"", k[2]==2?a[2].s.c_str():"|#",opt); } //----------------------------------------------------------------------------- int mgls_xrange(mglGraph *gr, long , mglArg *a, int k[10], const char *) @@ -2541,14 +2701,14 @@ int mgls_xtick(mglGraph *gr, long n, mglArg *a, int k[10], const char *) if(k[0]==1 && k[1]==2) gr->SetTicksVal('x', *(a[0].d), a[1].w.c_str(), k[2]==3 && a[2].v); else if(k[0]==3 && k[1]==2) { - mreal v[50]; wchar_t *s=new wchar_t[50*256]; int i; + mreal v[50]; std::wstring s; int i; for(i=0;i<50 && iSetTicksVal('x',mglData(i,v),s); delete []s; + gr->SetTicksVal('x',mglData(i,v),s.c_str()); } else if(k[0]==3) gr->SetTicks('x', a[0].v, k[1]==3?iint(a[1].v):0, k[2]==3?a[2].v:NAN); @@ -2574,14 +2734,14 @@ int mgls_ytick(mglGraph *gr, long n, mglArg *a, int k[10], const char *) if(k[0]==1 && k[1]==2) gr->SetTicksVal('x', *(a[0].d), a[1].w.c_str(), k[2]==3 && a[2].v); else if(k[0]==3 && k[1]==2) { - mreal v[50]; wchar_t *s=new wchar_t[50*256]; int i; + mreal v[50]; std::wstring s; int i; for(i=0;i<50 && iSetTicksVal('y',mglData(i,v),s); delete []s; + gr->SetTicksVal('y',mglData(i,v),s.c_str()); } else if(k[0]==3) gr->SetTicks('y', a[0].v, k[1]==3?iint(a[1].v):0, k[2]==3?a[2].v:NAN); @@ -2606,14 +2766,14 @@ int mgls_ztick(mglGraph *gr, long n, mglArg *a, int k[10], const char *) if(k[0]==1 && k[1]==2) gr->SetTicksVal('x', *(a[0].d), a[1].w.c_str(), k[2]==3 && a[2].v); else if(k[0]==3 && k[1]==2) { - mreal v[50]; wchar_t *s=new wchar_t[50*256]; int i; + mreal v[50]; std::wstring s; int i; for(i=0;i<50 && iSetTicksVal('z',mglData(i,v),s); delete []s; + gr->SetTicksVal('z',mglData(i,v),s.c_str()); } else if(k[0]==3) gr->SetTicks('z', a[0].v, k[1]==3?iint(a[1].v):0, k[2]==3?a[2].v:NAN); @@ -3088,26 +3248,17 @@ void mglc_putsfit(wchar_t out[1024], long , mglArg *a, int k[10], const char *) mglprintf(out,1024,L"gr->PutsFit(mglPoint(%g, %g, %g), \"%s\", \"%s\", %g);", a[0].v,a[1].v,a[2].v, k[3]==2?a[3].s.c_str():"", k[4]==2?a[4].s.c_str():"", k[5]==3?a[5].v:-1); else if(k[0]==3 && k[1]==3) mglprintf(out,1024,L"gr->PutsFit(mglPoint(%g, %g), \"%s\", \"%s\", %g);", a[0].v,a[1].v, k[2]==2?a[2].s.c_str():"", k[3]==2?a[3].s.c_str():"", k[4]==3?a[4].v:-1); - - if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==1 && k[4]==1 && k[5]==1 && k[6]==2 && k[7]==2) - mglprintf(out,1024,L"gr->FitS(%s, %s, %s, %s, %s, %s, \"%s\", \"%s\", %s, %s);", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), a[5].s.c_str(), a[6].s.c_str(), a[7].s.c_str(), (k[8]==1 && a[8].d->nx>=long(strlen(a[7].s.c_str())))?a[8].s.c_str():"NULL", (k[9]==3&&a[9].v!=0)?"true":"false"); - else if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==1 && k[4]==1 && k[5]==2 && k[6]==2) - mglprintf(out,1024,L"gr->FitS(%s, %s, %s, %s, %s, \"%s\", \"%s\", %s, %s);", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), a[5].s.c_str(), a[6].s.c_str(), (k[7]==1 && a[7].d->nx>=long(strlen(a[6].s.c_str())))?a[7].s.c_str():"NULL", (k[8]==3&&a[8].v!=0)?"true":"false"); - else if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==1 && k[4]==2 && k[5]==2) - mglprintf(out,1024,L"gr->FitS(%s, %s, %s, %s, \"%s\", \"%s\", %s, %s);", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), a[5].s.c_str(), (k[6]==1 && a[6].d->nx>=long(strlen(a[5].s.c_str())))?a[6].s.c_str():"NULL", (k[7]==3&&a[7].v!=0)?"true":"false"); - else if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==2 && k[4]==2) - mglprintf(out,1024,L"gr->FitS(%s, %s, %s, \"%s\", \"%s\", %s, %s);", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), (k[5]==1 && a[5].d->nx>=long(strlen(a[4].s.c_str())))?a[5].s.c_str():"NULL", (k[6]==3&&a[6].v!=0)?"true":"false"); } //----------------------------------------------------------------------------- int mgls_arrowsize(mglGraph *gr, long , mglArg *a, int k[10], const char *) { - if(k[0]==3) gr->SetArrowSize(a[0].v/50); + if(k[0]==3) gr->SetArrowSize(a[0].v); else return 1; return 0; } void mglc_arrowsize(wchar_t out[1024], long , mglArg *a, int k[10], const char *) { - if(k[0]==3) mglprintf(out,1024,L"gr->SetArrowSize(%g);", a[0].v/50); + if(k[0]==3) mglprintf(out,1024,L"gr->SetArrowSize(%g);", a[0].v); } //----------------------------------------------------------------------------- int mgls_rearrange(mglGraph *, long , mglArg *a, int k[10], const char *) @@ -3167,14 +3318,14 @@ void mglc_fsurf(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) mglprintf(out,1024,L"gr->FSurf(\"%s\", \"%s\", \"%s\");", a[0].s.c_str(), k[1]==2?a[1].s.c_str():"",opt); } //----------------------------------------------------------------------------- -int mgls_fgets(mglGraph *gr, long , mglArg *a, int k[10], const char *) +int mgls_fgets(mglGraph *gr, long , mglArg *a, int k[10], const char *) // NOTE don't use options -- Puts can be part of group { char buf[1024]; FILE *fp; if((k[0]==3 && k[1]==3 && k[2]==3 && k[3]==2) || (k[0]==3 && k[1]==3 && k[2]==2)) { int i, j=k[2]==3?1:0, n = (k[j+3]==3?iint(a[j+3].v):0); - mreal vv = k[2]==3 ? a[2].v:0; + mreal vv = k[2]==3 ? a[2].v:NAN; fp = fopen(a[j+2].s.c_str(),"rt"); if(!fp) { @@ -3190,7 +3341,7 @@ int mgls_fgets(mglGraph *gr, long , mglArg *a, int k[10], const char *) fclose(fp); return 0; } fclose(fp); - gr->Puts(mglPoint(a[0].v,a[1].v,vv),buf, (k[j+4]==2)?a[j+4].s.c_str():"", k[j+5]==3?a[j+5].v:-1.4); + gr->Puts(mglPoint(a[0].v,a[1].v,vv),buf, (k[j+4]==2)?a[j+4].s.c_str():"", k[j+5]==3?a[j+5].v:-1); } else return 1; return 0; @@ -3285,7 +3436,29 @@ int mgls_evaluate(mglGraph *, long , mglArg *a, int k[10], const char *) } void mglc_evaluate(wchar_t out[1024], long , mglArg *a, int k[10], const char *) { - if(k[0]==1) mglprintf(out,1024,L"%s.Sew(\"%s\", %g);", a[0].s.c_str(), k[1]==2?a[1].s.c_str():"xyz", k[2]==3 ? a[2].v : 2*M_PI); + if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==1 && k[4]==1) + mglprintf(out,1024,L"%s=%s.Evaluate(%s, %s, %s, %d);", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), a[4].s.c_str(), k[5]!=3 || a[5].v!=0); + else if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==1) + mglprintf(out,1024,L"%s=%s.Evaluate(%s, %s, %d);", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(), k[4]!=3 || a[4].v!=0); + else if(k[0]==1 && k[1]==1 && k[2]==1) + mglprintf(out,1024,L"%s=%s.Evaluate(%s, %d);", a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), k[3]!=3 || a[3].v!=0); +} +//----------------------------------------------------------------------------- +int mgls_solve(mglGraph *, long , mglArg *a, int k[10], const char *) +{ + if(k[0]==1 && k[1]==1 && k[2]==3 && k[3]==2 && k[4]==1) + *(a[0].d) = a[1].d->Solve(a[2].v, a[3].s[0], *(a[4].d), k[5]!=3 || a[5].v!=0); + else if(k[0]==1 && k[1]==1 && k[2]==3 && k[3]==2) + *(a[0].d) = a[1].d->Solve(a[2].v, a[3].s[0], k[4]!=3 || a[4].v!=0); + else return 1; + return 0; +} +void mglc_solve(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +{ + if(k[0]==1 && k[1]==1 && k[2]==3 && k[3]==2 && k[4]==1) + mglprintf(out,1024,L"%s=%s.Solve(%g, '%c', %s, %d);", a[0].s.c_str(), a[1].s.c_str(), a[2].v, a[3].s[0], a[4].s.c_str(), k[5]!=3 || a[5].v!=0); + else if(k[0]==1 && k[1]==1 && k[2]==3 && k[3]==2) + mglprintf(out,1024,L"%s=%s.Solve(%g, '%c', %d);", a[0].s.c_str(), a[1].s.c_str(), a[2].v, a[3].s[0], k[4]!=3 || a[4].v!=0); } //----------------------------------------------------------------------------- int mgls_put(mglGraph *, long , mglArg *a, int k[10], const char *) @@ -3505,14 +3678,14 @@ void mglc_roll(wchar_t out[1024], long , mglArg *a, int k[10], const char *) int mgls_datagrid(mglGraph *gr, long , mglArg *a, int k[10], const char *opt) { if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==1) - gr->DataGrid(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), opt); + gr->DataGrid(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d),opt); else return 1; return 0; } void mglc_datagrid(wchar_t out[1024], long , mglArg *a, int k[10], const char *opt) { if(k[0]==1 && k[1]==1 && k[2]==1 && k[3]==1) - mglprintf(out,1024,L"gr->DataGrid(%s, %s, %s, %s, \"%s\");",a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(),opt?opt:""); + mglprintf(out,1024,L"gr->DataGrid(%s, %s, %s, %s, \"%s\");",a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str(), a[3].s.c_str(),opt); } //----------------------------------------------------------------------------- int mgls_triangulate(mglGraph *, long , mglArg *a, int k[10], const char *) @@ -3532,47 +3705,101 @@ void mglc_triangulate(wchar_t out[1024], long , mglArg *a, int k[10], const char mglprintf(out,1024,L"%s = mglTriangulation(%s, %s);",a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str()); } //----------------------------------------------------------------------------- +int mgls_view(mglGraph *gr, long , mglArg *a, int k[10], const char *) +{ + if(k[0]==3 && k[1]==3) + gr->View(a[0].v, a[1].v, k[2]==3?a[2].v:0); + else return 1; + return 0; +} +void mglc_view(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +{ + if(k[0]==3 && k[1]==3) + mglprintf(out,1024,L"gr->View(%g, %g, %g);", a[0].v, a[1].v, k[2]==3?a[2].v:0); +} +//----------------------------------------------------------------------------- +int mgls_zoom(mglGraph *gr, long , mglArg *a, int k[10], const char *) +{ + if(k[0]==3 && k[1]==3 && k[2]==3 && k[3]==3) + gr->Zoom(a[0].v, a[1].v, a[2].v, a[3].v); + else return 1; + return 0; +} +void mglc_zoom(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +{ + if(k[0]==3 && k[1]==3 && k[2]==3 && k[3]==3) + mglprintf(out,1024,L"gr->Zoom(%g, %g, %g, %g);", a[0].v, a[1].v, a[2].v, a[3].v); +} +//----------------------------------------------------------------------------- +int mgls_zoomaxis(mglGraph *gr, long , mglArg *a, int k[10], const char *) +{ + int i; + for(i=0;i<8;i++) if(k[i]!=3) break; + if(i==8) gr->ZoomAxis(mglPoint(a[0].v, a[1].v, a[2].v, a[3].v), mglPoint(a[4].v, a[5].v, a[6].v, a[7].v)); + else if(i==6) gr->ZoomAxis(mglPoint(a[0].v, a[1].v, a[2].v), mglPoint(a[3].v, a[4].v, a[5].v)); + else if(i==4) gr->ZoomAxis(mglPoint(a[0].v, a[1].v), mglPoint(a[2].v, a[3].v)); + else if(i==2) gr->ZoomAxis(mglPoint(a[0].v), mglPoint(a[1].v)); + else return 1; + return 0; +} +void mglc_zoomaxis(wchar_t out[1024], long , mglArg *a, int k[10], const char *) +{ + int i; + for(i=0;i<8;i++) if(k[i]!=3) break; + if(i==8) + mglprintf(out,1024,L"gr->ZoomAxis(mglPoint(%g, %g, %g, %g),mglPoint(%g, %g, %g, %g));", a[0].v, a[1].v, a[2].v, a[3].v, a[4].v, a[5].v, a[6].v, a[7].v); + else if(i==6) + mglprintf(out,1024,L"gr->ZoomAxis(mglPoint(%g, %g, %g),mglPoint(%g, %g, %g));", a[0].v, a[1].v, a[2].v, a[3].v, a[4].v, a[5].v); + else if(i==4) + mglprintf(out,1024,L"gr->ZoomAxis(mglPoint(%g, %g),mglPoint(%g, %g));", a[0].v, a[1].v, a[2].v, a[3].v); + else if(i==2) + mglprintf(out,1024,L"gr->ZoomAxis(mglPoint(%g),mglPoint(%g));", a[0].v, a[1].v); +} +//----------------------------------------------------------------------------- mglCommand mgls_base_cmd[] = { - {"addlegend","Add legend entry","addlegend 'txt' 'fmt'", mgls_addlegend, mglc_addlegend,2}, + {"addlegend","Add legend entry","addlegend 'txt' 'fmt'", mgls_addlegend, mglc_addlegend,15}, {"addto","Add data or number","addto Var Dat|Var num", mgls_addto, mglc_addto,3}, - {"adjust","Adjust ticks for best view","adjust ['dir']", mgls_adjust, mglc_adjust,2}, + {"adjust","Adjust ticks for best view","adjust ['dir']", mgls_adjust, mglc_adjust,14}, {"alpha","Switch on/off transparency","alpha [val]", mgls_alpha, mglc_alpha,2}, {"alphadef","Set default transparency","alphadef val", mgls_alphadef, mglc_alphadef,2}, {"ambient","Set ambient light brightness","ambient val", mgls_ambient, mglc_ambient,2}, - {"area","Draw area plot for 1D data","area Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_area, mglc_area,0}, + {"area","Draw area plot for 1D data","area Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_area, mglc_area,7}, {"arrowsize","Set size of arrows","arrowsize val", mgls_arrowsize, mglc_arrowsize,2}, + {"ask","Define parameter from user input","ask $N 'question'", 0, 0, 6}, {"aspect","Set aspect ration","aspect valx valy [valz]", mgls_aspect, mglc_aspect,5}, - {"axial","Draw surfaces of contour lines rotation","axial Zdat ['fmt' num]|Xdat Ydat Zdat ['fmt' num]", mgls_axial, mglc_axial,0}, - {"axis","Setup or draw axis","axis ['dir' adjust]|'fx' 'fy' ['fz' 'fc']|how", mgls_axis, mglc_axis,1}, - {"axisstl","Set axis and tick style","axisstl 'stl' ['sub']", mgls_axisstl, mglc_axisstl,2}, - {"ball","Draw point (ball)","ball posx posy ['fmt']|posx posy posz ['fmt']", mgls_ball, mglc_ball,1}, - {"barh","Draw horizontal bars for 1D data", "barh Ydat ['fmt' above]|Xdat Ydat ['fmt' above]", mgls_barh, mglc_barh,0}, - {"bars","Draw bars for 1D data","bars Ydat ['fmt' above]|Xdat Ydat ['fmt' above]|Xdat Ydat Zdat ['fmt' above]", mgls_bars, mglc_bars,0}, + {"axial","Draw surfaces of contour lines rotation","axial Zdat ['fmt' num]|Xdat Ydat Zdat ['fmt' num]", mgls_axial, mglc_axial,8}, + {"axis","Setup or draw axis","axis ['dir' 'fmt']|'fx' 'fy' 'fz' ['fc']|how", mgls_axis, mglc_axis,12}, + {"axisstl","Set axis and tick style","axisstl 'stl' ['sub']", mgls_axisstl, mglc_axisstl,14}, + {"ball","Draw point (ball)","ball posx posy ['fmt']|posx posy posz ['fmt']", mgls_ball, mglc_ball,13}, + {"barh","Draw horizontal bars for 1D data", "barh Ydat ['fmt' above]|Xdat Ydat ['fmt' above]", mgls_barh, mglc_barh,7}, + {"bars","Draw bars for 1D data","bars Ydat ['fmt' above]|Xdat Ydat ['fmt' above]|Xdat Ydat Zdat ['fmt' above]", mgls_bars, mglc_bars,7}, {"barwidth","Set default bars width","barwidth val", mgls_barwidth, mglc_barwidth,2}, - {"beam","Draw quasioptical beam","beam Tr G1 G2 Adat r ['sch' flag num] ", mgls_beam, mglc_beam,0}, - {"belt","Draw belts","belt Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_belt, mglc_belt,0}, - {"box","Draw bounding box","box ['fmt' ticks]", mgls_box, mglc_box,1}, - {"boxplot","Draw boxplot for 2D data","boxplot Ydat ['fmt']|Xdat Ydat ['fmt']", mgls_boxplot, mglc_boxplot,0}, - {"boxs","Draw boxes","boxs Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_boxs, mglc_boxs,0}, + {"beam","Draw quasioptical beam","beam Tr G1 G2 Adat r ['sch' flag num] ", mgls_beam, mglc_beam,9}, + {"belt","Draw belts","belt Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_belt, mglc_belt,8}, + {"box","Draw bounding box","box ['fmt' ticks]", mgls_box, mglc_box,12}, + {"boxplot","Draw boxplot for 2D data","boxplot Ydat ['fmt']|Xdat Ydat ['fmt']", mgls_boxplot, mglc_boxplot,7}, + {"boxs","Draw boxes","boxs Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_boxs, mglc_boxs,8}, {"break","Break for-cycle","break", 0, 0, 6}, {"call","Execute script in external file","call 'name' [args]", 0, 0, 6}, - {"candle","Draw candlestick chart","candle candle Vdat1 ['fmt']|Vdat1 Vdat2 ['fmt']|Vdat1 Ydat1 Ydat2 ['fmt']||Vdat1 Vdat2 Ydat1 Ydat2 ['fmt']|Xdat Vdat1 Vdat2 Ydat1 Ydat2 ['fmt']", mgls_candle, mglc_candle,0}, - {"chart","Draw chart","chart Dat ['fmt']", mgls_chart, mglc_chart,0}, - {"chdir","Change current directory","chdir 'dir'", mgls_chdir, mglc_chdir,2}, - {"clearlegend","Clear legend antries","clearlegend", mgls_clearlegend, mglc_clearlegend,2}, - {"clf","Clear picture","clf", mgls_clf, mglc_clf,1}, - {"cloud","Draw cloud","cloud Adat ['fmt']|Xdat Ydat Zdat Adat ['fmt']", mgls_cloud, mglc_cloud,0}, - {"colorbar","Draw colorbar","colorbar ['fmt' pos]|Vdat ['fmt' pos]|'sch' pos x y w h|Vdat 'sch' pos x y w h", mgls_colorbar, mglc_colorbar,1}, + {"candle","Draw candlestick chart","candle candle Vdat1 ['fmt']|Vdat1 Vdat2 ['fmt']|Vdat1 Ydat1 Ydat2 ['fmt']||Vdat1 Vdat2 Ydat1 Ydat2 ['fmt']|Xdat Vdat1 Vdat2 Ydat1 Ydat2 ['fmt']", mgls_candle, mglc_candle,7}, + {"chart","Draw chart","chart Dat ['fmt']", mgls_chart, mglc_chart,7}, + {"chdir","Change current directory","chdir 'path'", mgls_chdir, mglc_chdir,2}, + {"circle","Draw circle","circle x y r ['fmt']|x y z r ['fmt']", mgls_circle, mglc_circle,13}, + {"clean","Remove duplicate rows","clean Dat id", mgls_clean, mglc_clean,3}, + {"clearlegend","Clear legend antries","clearlegend", mgls_clearlegend, mglc_clearlegend,15}, + {"clf","Clear picture","clf", mgls_clf, mglc_clf,12}, + {"cloud","Draw cloud","cloud Adat ['fmt']|Xdat Ydat Zdat Adat ['fmt']", mgls_cloud, mglc_cloud,9}, + {"colorbar","Draw colorbar","colorbar ['fmt' pos]|Vdat ['fmt' pos]|'sch' pos x y [w h]|Vdat 'sch' pos x y [w h]", mgls_colorbar, mglc_colorbar,12}, {"column","Get data column filled by formula on column ids","column Res Dat 'eq'", mgls_column, mglc_column,4}, {"columnplot","Set position of plot inside cell of column", "columnplot num ind [d]", mgls_columnplot, mglc_columnplot,5}, {"combine", "Direct multiplication of arrays", "combine Res Adat Bdat", mgls_combine, mglc_combine,4}, - {"cone","Draw cone","cone x1 y1 z1 x2 y2 z2 r1 [r2 'fmt' edge]", mgls_cone, mglc_cone,1}, - {"cones","Draw cones for 1D data","cones Ydat ['fmt' above]|Xdat Ydat ['fmt' above]|Xdat Ydat Zdat ['fmt' above]", mgls_cones, mglc_cones,0}, - {"cont","Draw contour lines","cont Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_cont, mglc_cont,0}, - {"cont3","Draw contour lines for 3D data","cont3 Adat 'dir' [val 'fmt' num]|Vdat Adat 'dir' [val 'fmt']|Xdat Ydat Zdat Adat 'dir' [val 'fmt' num]|Vdat Xdat Ydat Zdar Adat 'dir' [val 'fmt']", mgls_cont3, mglc_cont3,0}, - {"contd","Draw solid contours with manual colors","contd Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_contd, mglc_contd,0}, - {"contf","Draw solid contours","contf Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_contf, mglc_contf,0}, - {"contf3","Draw solid contour lines for 3D data","contf3 Adat 'dir' [val 'fmt' num]|Vdat Adat 'dir' [val 'fmt']|Xdat Ydat Zdat Adat 'dir' [val 'fmt' num]|Vdat Xdat Ydat Zdar Adat 'dir' [val 'fmt']", mgls_contf3, mglc_contf3,0}, + {"cone","Draw cone","cone x1 y1 z1 x2 y2 z2 r1 [r2 'fmt' edge]", mgls_cone, mglc_cone,13}, + {"cones","Draw cones for 1D data","cones Ydat ['fmt' above]|Xdat Ydat ['fmt' above]|Xdat Ydat Zdat ['fmt' above]", mgls_cones, mglc_cones,7}, + {"cont","Draw contour lines","cont Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_cont, mglc_cont,8}, + {"cont3","Draw contour lines for 3D data","cont3 Adat 'dir' [val 'fmt' num]|Vdat Adat 'dir' [val 'fmt']|Xdat Ydat Zdat Adat 'dir' [val 'fmt' num]|Vdat Xdat Ydat Zdar Adat 'dir' [val 'fmt']", mgls_cont3, mglc_cont3,9}, + {"contd","Draw solid contours with manual colors","contd Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_contd, mglc_contd,8}, + {"contf","Draw solid contours","contf Zdat ['fmt' num zpos]|Vdat Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' num zpos]|Vdat Xdat Ydat Zdat ['fmt' zpos]", mgls_contf, mglc_contf,8}, + {"contf3","Draw solid contour lines for 3D data","contf3 Adat 'dir' [val 'fmt' num]|Vdat Adat 'dir' [val 'fmt']|Xdat Ydat Zdat Adat 'dir' [val 'fmt' num]|Vdat Xdat Ydat Zdar Adat 'dir' [val 'fmt']", mgls_contf3, mglc_contf3,9}, {"contfx","Draw solid contour lines at x-slice (or x-plane)","contfx Dat ['fmt' pos num]", mgls_contfx, mglc_contfx,0}, {"contfy","Draw solid contour lines at y-slice (or y-plane)","contfy Dat ['fmt' pos num]", mgls_contfy, mglc_contfy,0}, {"contfz","Draw solid contour lines at z-slice (or z-plane)","contfz Dat ['fmt' pos num]", mgls_contfz, mglc_contfz,0}, @@ -3582,13 +3809,13 @@ mglCommand mgls_base_cmd[] = { {"conty","Draw contour lines at y-slice (or y-plane)","conty Dat ['fmt' pos num]", mgls_conty, mglc_conty,0}, {"contz","Draw contour lines at z-slice (or z-plane)","contz Dat ['fmt' pos num]", mgls_contz, mglc_contz,0}, {"copy","Copy data from another variable","copy Dat1 Dat2 ['eq' onaxis]", mgls_copy, mglc_copy,4}, - {"cosfft","Cos-Fourier transform at some direction","cosfft Dat 'dir'", mgls_cosfft, mglc_cosfft,3}, - {"crange","Set color range","crange Dat [sym] | c1 c2", mgls_crange, mglc_crange,2}, - {"crop","Crop edge of data","crop Dat n1 n2 'dir'", mgls_crop, mglc_crop,3}, + {"cosfft","Cos-Fourier transform at some direction","cosfft Dat 'dir'", mgls_cosfft, mglc_cosfft,16}, + {"crange","Set color range","crange Dat [sym] | c1 c2", mgls_crange, mglc_crange,14}, + {"crop","Crop edge of data","crop Dat n1 n2 'dir'", mgls_crop, mglc_crop,16}, {"crust","Draw reconstructed surface for arbitrary data points","crust Xdat Ydat Zdat ['fmt']", mgls_crust, mglc_crust,0}, - {"ctick","Set ticks for colorbar","ctick 'tmpl' | dx", mgls_ctick, mglc_ctick,2}, - {"cumsum","Cumulative summation","cumsum Dat 'dir'", mgls_cumsum, mglc_cumsum,3}, - {"curve","Draw curve","curve x1 y1 dx1 dy1 x2 y2 dx2 dy2 ['fmt']|x1 y1 z1 dx1 dy1 dz1 x2 y2 z2 dx2 dy2 dz2 ['fmt']", mgls_curve, mglc_curve,1}, + {"ctick","Set ticks for colorbar","ctick 'tmpl' | dx", mgls_ctick, mglc_ctick,14}, + {"cumsum","Cumulative summation","cumsum Dat 'dir'", mgls_cumsum, mglc_cumsum,16}, + {"curve","Draw curve","curve x1 y1 dx1 dy1 x2 y2 dx2 dy2 ['fmt']|x1 y1 z1 dx1 dy1 dz1 x2 y2 z2 dx2 dy2 dz2 ['fmt']", mgls_curve, mglc_curve,13}, {"cut","Setup plot points cutting","cut val|x1 y1 z1 x2 y2 z2|'cond'", mgls_cut, mglc_cut,2}, {"datagrid","Fill data by triangulated values","datagrid Var Xdat Ydat Zdat", mgls_datagrid, mglc_datagrid,3}, {"datas","Print list of data names in HDF file","datas 'fname'", mgls_datas, mglc_datas,3}, @@ -3597,49 +3824,53 @@ mglCommand mgls_base_cmd[] = { {"defnum","Define parameter as numerical value","defnum $N val", 0, 0, 6}, {"defpal","Define parameter as palette color","defpal $N val", 0, 0, 6}, {"delete","Delete slice of data","delete Dat 'dir' [pos=0 num=1]", mgls_delete, mglc_delete,3}, - {"dens","Draw density plot","dens Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' zpos]", mgls_dens, mglc_dens,0}, - {"dens3","Draw density plot at slices of 3D data","dens3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_dens3, mglc_dens3,0}, + {"dens","Draw density plot","dens Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' zpos]", mgls_dens, mglc_dens,8}, + {"dens3","Draw density plot at slices of 3D data","dens3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_dens3, mglc_dens3,9}, {"densx","Draw density plot at x-slice (or x-plane)","densx Dat ['fmt' pos]", mgls_densx, mglc_densx,0}, {"densy","Draw density plot at y-slice (or y-plane)","densy Dat ['fmt' pos]", mgls_densy, mglc_densy,0}, {"densz","Draw density plot at z-slice (or z-plane)","densz Dat ['fmt' pos]", mgls_densz, mglc_densz,0}, - {"dew","Draw dew plot","dew Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']", mgls_dew, mglc_dew,0}, - {"diff","Numerically differentiate data","diff Var 'dir'", mgls_diff, mglc_diff,3}, - {"diff2","Numerically double differentiate data","diff2 Var 'dir'", mgls_diff2, mglc_diff2,3}, + {"dew","Draw dew plot","dew Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']", mgls_dew, mglc_dew,11}, + {"diff","Numerically differentiate data","diff Var 'dir'", mgls_diff, mglc_diff,16}, + {"diff2","Numerically double differentiate data","diff2 Var 'dir'", mgls_diff2, mglc_diff2,16}, {"divto","Divide by data or number","divto Var Dat|Var num", mgls_divto, mglc_divto,3}, - {"dots","Draw dots for arbitrary data points","dots Xdat Ydat Zdat ['fmt']", mgls_dots, mglc_dots,0}, - {"drop","Draw drop","drop x0 y0 dx dy r ['col' sh asp]|x0 y0 z0 dx dy dz r ['col' sh asp]", mgls_drop, mglc_drop,0}, + {"dots","Draw dots for arbitrary data points","dots Xdat Ydat Zdat ['fmt']", mgls_dots, mglc_dots,9}, + {"drop","Draw drop","drop x0 y0 dx dy r ['col' sh asp]|x0 y0 z0 dx dy dz r ['col' sh asp]", mgls_drop, mglc_drop,13}, + {"ellipse","Draw ellipse","ellipse x1 y1 x2 y2 r ['fmt']|x1 y1 z1 x2 y2 z2 r ['fmt']", mgls_ellipse, mglc_ellipse,13}, {"else","Execute if condition is false","else", 0, 0, 6}, {"elseif","Conditional operator","elseif val|Dat ['cond']", 0, 0, 6}, {"endif","Finish if/else block","endif", 0, 0, 6}, - {"envelop","Find envelop for the data","envelop Dat ['dir']", mgls_envelop, mglc_envelop,3}, - {"error","Draw error boxes","error Ydat Yerr ['fmt']|Xdat Ydat Yerr ['fmt']|Xdat Ydat Xerr Yerr ['fmt']", mgls_error, mglc_error,0}, + {"envelop","Find envelop for the data","envelop Dat ['dir']", mgls_envelop, mglc_envelop,16}, + {"errbox","Draw error box","errbox x y ex ey ['fmt']|x y z ex ey ez ['fmt']", mgls_errbox, mglc_errbox,13}, + {"error","Draw error boxes","error Ydat Yerr ['fmt']|Xdat Ydat Yerr ['fmt']|Xdat Ydat Xerr Yerr ['fmt']", mgls_error, mglc_error,7}, {"evaluate","Evaluate (interpolate) values of array Dat at points i=idat,j=jdat,k=kdat","evaluate Res Dat Idat [norm]|Res Dat Idat Jdat [norm]|Res Dat Idat Jdat Kdat [norm]", mgls_evaluate, mglc_evaluate,4}, {"export","Export data to PNG picture","export Dat 'fname' 'sch' [v1 v2]", mgls_import, mglc_import,3}, {"extend","Extend data array","extend Dat dim1 [dim2]", mgls_extend, mglc_extend,3}, - {"facex","Draw face perpendicular to x-axis","facex x0 y0 z0 wy wz ['fmt' d1 d2]", mgls_facex, mglc_facex,1}, - {"facey","Draw face perpendicular to y-axis","facex x0 y0 z0 wx wz ['fmt' d1 d2]", mgls_facey, mglc_facey,1}, - {"facez","Draw face perpendicular to z-axis","facex x0 y0 z0 wy wz ['fmt' d1 d2]", mgls_facez, mglc_facez,1}, - {"fall","Draw waterfalls","fall Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_fall, mglc_fall,0}, - {"fgets","Print string from file","fgets x y z 'fname' [pos=0 'fmt' size]|x y z 'fname' [pos=0 'fmt' size]", mgls_fgets, mglc_fgets,1}, + {"face","Draw face (quadrangle)","face x1 y1 x2 y2 x3 y3 x4 y4 ['fmt']|x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4 ['fmt']", mgls_face, mglc_face,13}, + {"facenum","Set number of visible faces","facenum val", mgls_facenum, mglc_facenum,2}, + {"facex","Draw face perpendicular to x-axis","facex x0 y0 z0 wy wz ['fmt' d1 d2]", mgls_facex, mglc_facex,13}, + {"facey","Draw face perpendicular to y-axis","facex x0 y0 z0 wx wz ['fmt' d1 d2]", mgls_facey, mglc_facey,13}, + {"facez","Draw face perpendicular to z-axis","facex x0 y0 z0 wy wz ['fmt' d1 d2]", mgls_facez, mglc_facez,13}, + {"fall","Draw waterfalls","fall Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_fall, mglc_fall,8}, + {"fgets","Print string from file","fgets x y z 'fname' [pos=0 'fmt' size]|x y z 'fname' [pos=0 'fmt' size]", mgls_fgets, mglc_fgets,15}, {"fill","Fill data linearly in range [v1, v2]","fill Var v1 v2 ['dir'] | Var 'eq' [Vdat Wdat]", mgls_fill, mglc_fill,3}, {"fillsample","Fill x-,k-samples for transforms","fillsample Var 'how'", mgls_fillsample, mglc_fillsample,3}, {"fit","Fit data to formula","fit Res A 'eq' 'var' [Ini]|Res X A 'eq' 'var' [Ini]|Res X Y A 'eq' 'var' [Ini]|Res X Y Z A 'eq' 'var' [Ini]", mgls_fit, mglc_fit,4}, {"fits","Fit data to formula","fits Res A S 'eq' 'var' [Ini]|Res X A S 'eq' 'var' [Ini]|Res X Y A S 'eq' 'var' [Ini]|Res X Y Z A S 'eq' 'var' [Ini]", mgls_fits, mglc_fits,4}, {"flow","Draw flow threads for vector field","flow Udat Vdat ['fmt' num]|Xdat Ydat Udat Vdat ['fmt' num]|Udat Vdat Wdat ['fmt' num]|Xdat Ydat Zdat Udat Vdat ['fmt' num]|\ - x0 y0 Udat Vdat ['fmt']|x0 y0 Xdat Ydat Udat Vdat ['fmt']|x0 y0 z0 Udat Vdat Wdat ['fmt']|x0 y0 z0 Xdat Ydat Zdat Udat Vdat Wdat ['fmt']", mgls_flow, mglc_flow,0}, + x0 y0 Udat Vdat ['fmt']|x0 y0 Xdat Ydat Udat Vdat ['fmt']|x0 y0 z0 Udat Vdat Wdat ['fmt']|x0 y0 z0 Xdat Ydat Zdat Udat Vdat Wdat ['fmt']", mgls_flow, mglc_flow,11}, {"fog","Switch on/off fog","fog val [pos]", mgls_fog, mglc_fog,2}, - {"font","Setup font","font 'fmt' [size]", mgls_font, mglc_font,2}, + {"font","Setup font","font 'fmt' [size]", mgls_font, mglc_font,15}, {"for","For cycle","for $N v1 v2 [dv] | $N Dat", 0, 0, 6}, - {"fourier","In-place Fourier transform","fourier ReDat ImDat 'dir'", mgls_fourier, mglc_fourier, 3}, - {"fplot","Plot curve by formula","fplot 'y(x)' ['fmt' num]|'x(t)' 'y(t)' 'z(t)' ['fmt' num]", mgls_fplot, mglc_fplot,1}, - {"fsurf","Plot surface by formula","fsurf 'z(x,y)' ['fmt' num]|'x(u,v)' 'y(u,v)' 'z(u,v)' ['fmt' num]", mgls_fsurf, mglc_fsurf,1}, + {"fourier","In-place Fourier transform","fourier ReDat ImDat 'dir'", mgls_fourier, mglc_fourier, 16}, + {"fplot","Plot curve by formula","fplot 'y_x' ['fmt']|'x_t' 'y_t' 'z_t' ['fmt']", mgls_fplot, mglc_fplot,1}, + {"fsurf","Plot surface by formula","fsurf 'z_xy' ['fmt']|'x_uv' 'y_uv' 'z_uv' ['fmt']", mgls_fsurf, mglc_fsurf,1}, {"func","Start function definition and stop execution of main script","func 'name' [narg]", 0, 0, 6}, - {"grad","Draw gradient lines for scalar field","grad Phi ['fmt' num]|Xdat Ydat Phi ['fmt' num]|Xdat Ydat Zdat Phi ['fmt' num]", mgls_grad, mglc_grad,0}, - {"grid","Draw grid","grid ['dir' 'fmt']", mgls_grid, mglc_grid,0}, - {"grid2","Draw grid for data array(s)","grid Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_grid2, mglc_grid2,0}, - {"grid3","Draw grid at slices of 3D data","grid3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_grid3, mglc_grid3,0}, + {"grad","Draw gradient lines for scalar field","grad Phi ['fmt' num]|Xdat Ydat Phi ['fmt' num]|Xdat Ydat Zdat Phi ['fmt' num]", mgls_grad, mglc_grad,8}, + {"grid","Draw grid","grid ['dir' 'fmt']", mgls_grid, mglc_grid,12}, + {"grid2","Draw grid for data array(s)","grid Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_grid2, mglc_grid2,8}, + {"grid3","Draw grid at slices of 3D data","grid3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_grid3, mglc_grid3,9}, {"gridplot","Set position of plot inside cell of matrix", "gridplot nx ny ind [d]", mgls_gridplot, mglc_gridplot,5}, - {"hankel","Hankel transform at some direction","hankel Dat 'dir'", mgls_hankel, mglc_hankel,3}, + {"hankel","Hankel transform at some direction","hankel Dat 'dir'", mgls_hankel, mglc_hankel,16}, {"hist","Create histogram (distribution) of data values","hist Res Dat num v1 v2 [nsub]|Res Dat Wdat num v1 v2 [nsub]", mgls_hist, mglc_hist,4}, {"idset","Set column id for data","idset Dat 'ids'", mgls_idset, mglc_idset,3}, {"if","Conditional operator","if val|Dat ['cond']", 0, 0, 6}, @@ -3647,69 +3878,73 @@ mglCommand mgls_base_cmd[] = { {"info","Print information about data","info Dat [detail]|'message'", mgls_info, mglc_info,3}, {"inplot","Set position of plot in picture","x1 x2 y1 y2 [rel]", mgls_inplot, mglc_inplot,5}, {"insert","Insert slice of data","insert Dat 'dir' [pos=0 num=1]", mgls_insert, mglc_insert,3}, - {"integrate","Integrate data","integrate Dat 'dir'", mgls_integrate, mglc_integrate,3}, + {"integrate","Integrate data","integrate Dat 'dir'", mgls_integrate, mglc_integrate,16}, {"jacobian","Get Jacobian","jacobian Res Xdat Ydat [Zdat]", mgls_jacobian, mglc_jacobian,4}, - {"label","Draw label at arbitrary position","label ydat 'txt' ['stl'='']|xdat ydat 'txt' ['stl'='']|xdat ydat zdat 'txt' ['stl'='']|x y 'txt' ['fmt' size]", mgls_label, mglc_label,1}, - {"legend","Draw legend","legend [pos 'fmt' size llen]|x y ['fmt' size llen]", mgls_legend, mglc_legend,1}, - {"legendmarks","Set number of marks in the legend","legendmarks val", mgls_legendmarks, mglc_legendmarks,2}, + {"label","Draw label at arbitrary position","label Ydat 'txt' ['fmt'='']|Xdat Ydat 'txt' ['fmt'='']|Xdat Ydat Zdat 'txt' ['fmt'='']", mgls_label, mglc_label,7}, + {"legend","Draw legend","legend [pos 'fmt']|x y ['fmt']", mgls_legend, mglc_legend,15}, + {"legendmarks","Set number of marks in the legend","legendmarks val", mgls_legendmarks, mglc_legendmarks,15}, {"light","Setup light","light [val] | val num | num xpos ypos zpos ['fmt' br]", mgls_light, mglc_light,2}, - {"line","Draw line","line x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_line, mglc_line,1}, - {"loadfont","Load fontfaces","loadfont ['fmt']", mgls_loadfont, mglc_loadfont,2}, - {"map","Draw mapping plot","map Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']", mgls_map, mglc_map,0}, - {"mark","Draw mark plot for 1D data","mark Ydat Rdat ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat Zdat Rdat ['fmt']", mgls_mark, mglc_mark,0}, + {"line","Draw line","line x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_line, mglc_line,13}, + {"list","Creates new variable from list of numbers or data","list Var v1 ...|Var D1 ...", 0, 0, 6}, + {"loadfont","Load fontfaces","loadfont ['face']", mgls_loadfont, mglc_loadfont,15}, + {"map","Draw mapping plot","map Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']", mgls_map, mglc_map,10}, + {"mark","Draw mark plot for 1D data","mark Ydat Rdat ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat Zdat Rdat ['fmt']", mgls_mark, mglc_mark,7}, {"marksize","Set size of markers","marksize val", mgls_marksize, mglc_marksize,2}, {"max","Find maximal value over direction","max Res Dat 'dir'", mgls_max, mglc_max,4}, - {"mesh","Draw mesh surface","mesh Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_mesh, mglc_mesh,0}, + {"mesh","Draw mesh surface","mesh Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_mesh, mglc_mesh,8}, {"meshnum","Set number of lines in mesh/fall/vect and so on","meshnum val", mgls_meshnum, mglc_meshnum,2}, {"min","Find minimal value over direction","min Res Dat 'dir'", mgls_min, mglc_min,4}, - {"mirror","Mirror data at some direction","mirror Dat 'dir'", mgls_mirror, mglc_mirror,3}, + {"mirror","Mirror data at some direction","mirror Dat 'dir'", mgls_mirror, mglc_mirror,16}, {"modify","Modify data values by formula","modify Dat 'eq' [num] | Dat 'eq' Vdat [Wdat]", mgls_modify, mglc_modify,3}, {"momentum","Get momentum along direction","momentum Res Dat 'how' ['dir']", mgls_momentum, mglc_momentum,4}, {"multiplot","Set position of plot","multiplot m n pos dx dy 'style'", mgls_multiplot, mglc_multiplot,5}, {"multo","Multiply by data or number","multo Var Dat|Var num", mgls_multo, mglc_multo,3}, {"new","Create new data","new Dat nx ny nz ['eq']|new Dat nx ny ['eq']|new Dat nx ['eq']", mgls_new, mglc_new,4}, {"next","Start next for-cycle iteration","next", 0, 0, 6}, - {"norm","Normalize data","norm Dat v1 v2 [sym dim]", mgls_norm, mglc_norm,3}, - {"normsl","Normalize data slice by slice","normsl Dat v1 v2 ['dir' keep sym] ", mgls_normsl, mglc_normsl,3}, + {"norm","Normalize data","norm Dat v1 v2 [sym dim]", mgls_norm, mglc_norm,16}, + {"normsl","Normalize data slice by slice","normsl Dat v1 v2 ['dir' keep sym] ", mgls_normsl, mglc_normsl,16}, {"once","Start/close commands which should executed only once","once val", 0, 0, 6}, - {"origin","Set axis origin","origin x0 y0 [z0]", mgls_origin, mglc_origin,2}, + {"origin","Set axis origin","origin x0 y0 [z0]", mgls_origin, mglc_origin,14}, {"palette","Set palette for 1D plots","palette 'colors'", mgls_palette, mglc_palette,2}, {"pde","Solve PDE","pde Res 'ham' IniRe IniIm [dz k0]", mgls_pde, mglc_pde,4}, {"perspective","Set perspective","perspective val", mgls_perspective, mglc_perspective,2}, - {"pipe","Draw flow pipes for vector field","pipe Udat Vdat ['fmt' rad num]|Xdat Ydat Udat Vdat ['fmt' rad num]|Udat Vdat Wdat ['fmt' rad num]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' rad num]", mgls_pipe, mglc_pipe,0}, - {"plot","Draw usual plot for 1D data","plot Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_plot, mglc_plot,0}, + {"pipe","Draw flow pipes for vector field","pipe Udat Vdat ['fmt' rad num]|Xdat Ydat Udat Vdat ['fmt' rad num]|Udat Vdat Wdat ['fmt' rad num]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' rad num]", mgls_pipe, mglc_pipe,11}, + {"plot","Draw usual plot for 1D data","plot Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_plot, mglc_plot,7}, + {"plotid","Set default filename","plotid 'name'", mgls_plotid, mglc_plotid,2}, {"put","Put value (numeric or array) to given data element","put Dat val [i j k] | Dat Val [i j k]", mgls_put, mglc_put,3}, - {"putsfit","Print fitted formula","putsfit x y ['pre' 'font' size]|x y z ['pre' 'font' size]", mgls_putsfit, mglc_putsfit,0}, + {"putsfit","Print fitted formula","putsfit x y ['pre' 'font' size]|x y z ['pre' 'font' size]", mgls_putsfit, mglc_putsfit,15}, {"qo2d","Solve PDE in accompanied coordinates","qo2d Res 'ham' IniRe IniIm Ray [r k0 Xout Yout]", mgls_qo2d, mglc_qo2d,4}, {"quadplot","Draw surface of quadrangles","quadplot Idat Xdat Ydat ['fmt']|Idat Xdat Ydat Zdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt'] ", mgls_quadplot, mglc_quadplot,0}, - {"quality","Set plot quality","quality val", mgls_quality, mglc_quality,2}, - {"radar","Draw radar chart","radar Rdat ['fmt']", mgls_radar, mglc_radar,0}, - {"ranges","Set axis ranges","ranges x1 x2 y1 y2 [z1 z2]", mgls_ranges, mglc_ranges,2}, + {"quality","Set plot quality","quality [val]", mgls_quality, mglc_quality,2}, + {"radar","Draw radar chart","radar Rdat ['fmt']", mgls_radar, mglc_radar,7}, + {"ranges","Set axis ranges","ranges x1 x2 y1 y2 [z1 z2]", mgls_ranges, mglc_ranges,14}, {"ray","Solve Hamiltonian ODE (find GO ray or trajectory)","ray Res 'ham' x0 y0 z0 px0 py0 pz0 [dz=0.1 tmax=10]", mgls_ray, mglc_ray,4}, {"read","Read data from file","read Dat 'file' [nx ny nz]", mgls_read, mglc_read,4}, {"readall","Read and join data from several files","readall Dat 'templ' [slice]", mgls_readall, mglc_readall,4}, {"readhdf","Read data from HDF5 file","readhdf Dat 'file' 'id'", mgls_readhdf, mglc_readhdf,4}, {"readmat","Read data from file with sizes specified in first row","readmat Dat 'file' [dim]", mgls_readmat, mglc_readmat,4}, {"rearrange","Rearrange data dimensions","rearrange Dat mx [my mz]", mgls_rearrange, mglc_rearrange,3}, - {"rect","Draw rectangle","rect x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_rect, mglc_rect,1}, - {"region","Draw filled region between 2 curves","region Ydat1 Ydat2 ['fmt' inside]|Xdat Ydat1 Ydat2 ['fmt' inside]", mgls_region, mglc_region,0}, + {"rect","Draw rectangle","rect x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_rect, mglc_rect,13}, + {"region","Draw filled region between 2 curves","region Ydat1 Ydat2 ['fmt' inside]|Xdat Ydat1 Ydat2 ['fmt' inside]", mgls_region, mglc_region,7}, {"resize","Resize data","resize Res Dat mx [my mz]", mgls_resize, mglc_resize,4}, {"return","Return from function","return", 0, 0, 6}, - {"roll","Roll data along direction","roll Dat 'dir' num", mgls_roll, mglc_roll,0}, + {"rhomb","Draw rhombus","rhomb x1 y1 x2 y2 r ['fmt']|x1 y1 z1 x2 y2 z2 r ['fmt']", mgls_rhomb, mglc_rhomb,13}, + {"roll","Roll data along direction","roll Dat 'dir' num", mgls_roll, mglc_roll,16}, {"rotate","Rotate plot","rotate tetz tetx [tety] | tet x y z", mgls_rotate, mglc_rotate,5}, - {"rotatetext","Set to auto rotate text or not","rotatetext val", mgls_rotatetext, mglc_rotatetext,2}, + {"rotatetext","Set to auto rotate text or not","rotatetext val", mgls_rotatetext, mglc_rotatetext,15}, {"save","Save data to file","save Dat 'file'", mgls_save, mglc_save,3}, {"savehdf","Save data to HDF5 file","savehdf Dat 'file' 'id'", mgls_savehdf, mglc_savehdf,3}, {"setsize","Set picture size","setsize width height", mgls_setsize, mglc_setsize,2}, - {"sew","Remove jump into the data, like phase jumps","sew Dat ['dir' da]", mgls_sew, mglc_sew,3}, - {"sinfft","Sin-Fourier transform at some direction","sinfft Dat 'dir'", mgls_sinfft, mglc_sinfft,3}, - {"smooth","Smooth data","smooth Dat [kind 'dir']", mgls_smooth, mglc_smooth,3}, + {"sew","Remove jump into the data, like phase jumps","sew Dat ['dir' da]", mgls_sew, mglc_sew,16}, + {"sinfft","Sin-Fourier transform at some direction","sinfft Dat 'dir'", mgls_sinfft, mglc_sinfft,16}, + {"smooth","Smooth data","smooth Dat [kind 'dir']", mgls_smooth, mglc_smooth,16}, + {"solve","Find root Dat_{i,j,k}=val (inverse evaluate)","solve Res Dat val 'dir' [Idat norm]", mgls_solve, mglc_solve,4}, {"sort","Sort data by values in column","sort Dat idx [idy]", mgls_sort, mglc_sort,3}, - {"sphere","Draw sphere","sphere x0 y0 r ['fmt']|x0 y0 z0 r ['fmt']", mgls_sphere, mglc_sphere,1}, + {"sphere","Draw sphere","sphere x0 y0 r ['fmt']|x0 y0 z0 r ['fmt']", mgls_sphere, mglc_sphere,13}, {"squeeze","Squeeze data","squeeze Dat kx [ky kz]", mgls_squeeze, mglc_squeeze,3}, - {"stem","Draw stem plot for 1D data","stem Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_stem, mglc_stem,0}, - {"step","Draw step plot for 1D data","step Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_step, mglc_step,0}, - {"stfa","Draw STFA diagram","stfa Udat Vdat dn ['fmt']|Xdat Ydat Udat Vdat dn ['fmt']", mgls_stfa, mglc_stfa,0}, + {"stem","Draw stem plot for 1D data","stem Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_stem, mglc_stem,7}, + {"step","Draw step plot for 1D data","step Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_step, mglc_step,7}, + {"stfa","Draw STFA diagram","stfa Udat Vdat dn ['fmt']|Xdat Ydat Udat Vdat dn ['fmt']", mgls_stfa, mglc_stfa,10}, {"stfad","Do STFA transform","stfad Res Real Imag dn ['dir']", mgls_stfad, mglc_stfad,4}, {"stickplot","Set position of plot inside cell of stick", "stickplot num ind tet phi", mgls_stickplot, mglc_stickplot,5}, {"stop","Stop execution","stop", 0, 0, 6}, @@ -3717,47 +3952,52 @@ mglCommand mgls_base_cmd[] = { {"subplot","Set position of plot","subplot m n pos ['style' dx dy]", mgls_subplot, mglc_subplot,5}, {"subto","Subtract data or number","subto Var Dat|Var num", mgls_subto, mglc_subto,3}, {"sum","Find summation over direction","sum Res Dat 'dir'", mgls_sum, mglc_sum,4}, - {"surf","Draw solid surface","surf Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_surf, mglc_surf,0}, - {"surf3","Draw isosurface for 3D data","surf3 Adat ['fmt' num]|Xdat Ydat Zdat Adat ['fmt' num]|Adat val ['fmt']|Xdat Ydat Zdat Adat val ['fmt']", mgls_surf3, mglc_surf3,0}, - {"surf3a","Draw isosurface for 3D data transpared by other data","surf3a Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3a, mglc_surf3a,0}, - {"surf3c","Draw isosurface for 3D data colored by other data","surf3c Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3c, mglc_surf3c,0}, - {"surfa","Draw solid surface transpared by other data","surfa Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfa, mglc_surfa,0}, - {"surfc","Draw solid surface colored by other data","surfc Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfc, mglc_surfc,0}, - {"swap","Swap data (usefull after Fourier transform)","swap Dat 'dir'", mgls_swap, mglc_swap,0}, - {"tape","Draw binormales for 1D data","tape Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_tape, mglc_tape,0}, - {"tens","Draw tension plot for 1D data","tens Ydat Cdat ['fmt']|Xdat Ydat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_tens, mglc_tens,0}, - {"ternary","Switch on/off to use ternary axis","ternary val", mgls_ternary, mglc_ternary,2}, - {"text","Draw text at some position or along curve","text x y 'txt' ['fmt' size]|x y z 'txt' ['fmt' size]|x y dx dy 'txt' ['fmt' size]|x y z dx dy dz 'txt' ['fmt' size]|Ydat 'txt' ['font' sise]|Xdat Ydat 'txt' ['font' sise]", mgls_text, mglc_text,0}, - {"textmark","Draw TeX mark at point position","textmark Ydat Rdat 'text' ['fmt']|Xdat Ydat Rdat 'text' ['fmt']|Xdat Ydat Zdat Rdat 'text' ['fmt']", mgls_textmark, mglc_textmark,0}, - {"ticklen","Set tick length","ticklen val [stt]", mgls_ticklen, mglc_ticklen,2}, - {"ticktime","Set ticks in time format","ticktime 'dir' [dv 'tmpl']", mgls_ticktime, mglc_ticktime,2}, - {"tile","Draw horizontal tiles","tile Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_tile, mglc_tile,0}, - {"tiles","Draw horizontal tiles with variable size","tiles Zdat Rdat ['fmt']|Xdat Ydat Zdat Rdat ['fmt']", mgls_tiles, mglc_tiles,0}, - {"title","Add title for current subplot/inplot","title 'txt' ['fmt' size]", mgls_title, mglc_title,0}, - {"tlabel","Draw label for t-axis","tlabel 'txt' [pos size shift]", mgls_tlabel, mglc_tlabel,1}, - {"torus","Draw surface of curve rotation","torus Rdat ['fmt']|Zdat Rdat ['fmt']", mgls_torus, mglc_torus,0}, + {"surf","Draw solid surface","surf Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_surf, mglc_surf,8}, + {"surf3","Draw isosurface for 3D data","surf3 Adat ['fmt' num]|Xdat Ydat Zdat Adat ['fmt' num]|Adat val ['fmt']|Xdat Ydat Zdat Adat val ['fmt']", mgls_surf3, mglc_surf3,9}, + {"surf3a","Draw isosurface for 3D data transpared by other data","surf3a Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3a, mglc_surf3a,10}, + {"surf3c","Draw isosurface for 3D data colored by other data","surf3c Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3c, mglc_surf3c,10}, + {"surfa","Draw solid surface transpared by other data","surfa Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfa, mglc_surfa,10}, + {"surfc","Draw solid surface colored by other data","surfc Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfc, mglc_surfc,10}, + {"swap","Swap data (usefull after Fourier transform)","swap Dat 'dir'", mgls_swap, mglc_swap,16}, + {"table","Draw table with data values","table Dat ['txt' 'fmt']|x y Dat ['txt' 'fmt']", mgls_table, mglc_table,7}, + {"tape","Draw binormales for 1D data","tape Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_tape, mglc_tape,7}, + {"tens","Draw tension plot for 1D data","tens Ydat Cdat ['fmt']|Xdat Ydat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_tens, mglc_tens,7}, + {"ternary","Switch on/off to use ternary axis","ternary val", mgls_ternary, mglc_ternary,14}, + {"text","Draw text at some position or along curve","text x y 'txt' ['fmt' size]|x y z 'txt' ['fmt' size]|x y dx dy 'txt' ['fmt' size]|x y z dx dy dz 'txt' ['fmt' size]|Ydat 'txt' ['font' sise]|Xdat Ydat 'txt' ['font' sise]", mgls_text, mglc_text,15}, + {"textmark","Draw TeX mark at point position","textmark Ydat Rdat 'text' ['fmt']|Xdat Ydat Rdat 'text' ['fmt']|Xdat Ydat Zdat Rdat 'text' ['fmt']", mgls_textmark, mglc_textmark,7}, + {"ticklen","Set tick length","ticklen val [stt]", mgls_ticklen, mglc_ticklen,14}, + {"ticktime","Set ticks in time format","ticktime 'dir' [dv 'tmpl']", mgls_ticktime, mglc_ticktime,14}, + {"tile","Draw horizontal tiles","tile Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_tile, mglc_tile,8}, + {"tiles","Draw horizontal tiles with variable size","tiles Zdat Rdat ['fmt']|Xdat Ydat Zdat Rdat ['fmt']", mgls_tiles, mglc_tiles,10}, + {"title","Add title for current subplot/inplot","title 'txt' ['fmt' size]", mgls_title, mglc_title,5}, + {"tlabel","Draw label for t-axis","tlabel 'txt' [pos]", mgls_tlabel, mglc_tlabel,12}, + {"torus","Draw surface of curve rotation","torus Rdat ['fmt']|Zdat Rdat ['fmt']", mgls_torus, mglc_torus,7}, {"trace","Get trace of array","trace Res Dat", mgls_trace, mglc_trace,4}, - {"traj","Draw vectors along a curve","traj Xdat Ydat Udat Vdat ['fmt' len]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' len]", mgls_traj, mglc_traj,0}, + {"traj","Draw vectors along a curve","traj Xdat Ydat Udat Vdat ['fmt' len]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' len]", mgls_traj, mglc_traj,11}, {"transform","Do integral transform of data","transform Res 'how' Rdat Idat", mgls_transform, mglc_transform,4}, {"transforma","Do integral transform of data","transforma Res 'how' Adat Pdat", mgls_transforma, mglc_transforma,4}, - {"transpose","Transpose data array","transpose Dat ['dir']", mgls_transpose, mglc_transpose,3}, + {"transpose","Transpose data array","transpose Dat ['dir']", mgls_transpose, mglc_transpose,16}, {"transptype","Set type transparency","transptype val", mgls_transptype, mglc_transptype,2}, {"triangulate","Find triangles of randomly placed points","triangulate Res Xdat Ydat [er]|Res Xdat Ydat Zdat [er]", mgls_triangulate, mglc_triangulate,4}, {"tricont","Draw contour lines for surface of triangles","tricont Vdat Idat Xdat Ydat ['fmt']|Vdat Idat Xdat Ydat Zdat ['fmt']|Vdat Idat Xdat Ydat Zdat Cdat ['fmt'] ", mgls_tricont, mglc_tricont,0}, {"triplot","Draw surface of triangles","triplot Idat Xdat Ydat ['fmt']|Idat Xdat Ydat Zdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt'] ", mgls_triplot, mglc_triplot,0}, - {"tube","Draw curve by tube","tube Ydat Rdat ['fmt']|Ydat rval ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat rval ['fmt']|Xdat Ydat Zdat Rdat ['fmt']|Xdat Ydat Zdat rval ['fmt']", mgls_tube, mglc_tube,0}, - {"tuneticks","Set ticks tuning","tuneticks val [fctr]", mgls_tuneticks, mglc_tuneticks,2}, + {"tube","Draw curve by tube","tube Ydat Rdat ['fmt']|Ydat rval ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat rval ['fmt']|Xdat Ydat Zdat Rdat ['fmt']|Xdat Ydat Zdat rval ['fmt']", mgls_tube, mglc_tube,7}, + {"tuneticks","Set ticks tuning","tuneticks val [fctr]", mgls_tuneticks, mglc_tuneticks,14}, {"var","Create new 1D data and fill it in range","var Dat nx x1 [x2]", mgls_var, mglc_var,4}, - {"vect","Draw vector field","vect Udat Vdat ['fmt' kind]|Xdat Ydat Udat Vdat ['fmt' kind]|Udat Vdat Wdat ['fmt' kind]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' kind]", mgls_vect, mglc_vect,0}, + {"vect","Draw vector field","vect Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']|Udat Vdat Wdat ['fmt']|Xdat Ydat Zdat Udat Vdat Wdat ['fmt']", mgls_vect, mglc_vect,11}, + {"vect3","Draw vector field at slices of 3D data","vect Udat Vdat Wdat ['fmt' sval]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' sval]", mgls_vect3, mglc_vect3,11}, + {"view","Change view angles - use 'rotate' for plot rotation","view tetz tetx [tety]", mgls_view, mglc_view,5}, {"write","Write current image to graphical file","write 'fname' [solid]", mgls_write, mglc_write,2}, - {"xlabel","Draw label for x-axis","xlabel 'txt' [pos size shift]", mgls_xlabel, mglc_xlabel,1}, - {"xrange","Set range for x-axis","xrange Dat [add] | x1 x2", mgls_xrange, mglc_xrange,2}, - {"xtick","Set ticks for x-axis","xtick dx [sx tx] | 'tmpl' | Xdat 'lbl' [add] | v1 'lbl1' ...", mgls_xtick, mglc_xtick,2}, - {"ylabel","Draw label for y-axis","ylabel 'txt' [pos size shift]", mgls_ylabel, mglc_ylabel,1}, - {"yrange","Set range for y-axis","yrange Dat [add] | y1 y2", mgls_yrange, mglc_yrange,2}, - {"ytick","Set ticks for y-axis","ytick dy [sy ty] | 'tmpl' | Ydat 'lbl' [add] | v1 'lbl1' ...", mgls_ytick, mglc_ytick,2}, - {"zlabel","Draw label for z-axis","zlabel 'txt' [pos size shift]", mgls_zlabel, mglc_zlabel,1}, - {"zrange","Set range for z-axis","yrange Dat [add] | z1 z2", mgls_zrange, mglc_zrange,2}, - {"ztick","Set ticks for z-axis","ztick dz [sz tz] | 'tmpl' | Zdat 'lbl' [add] | v1 'lbl1' ...", mgls_ztick, mglc_ztick,2}, + {"xlabel","Draw label for x-axis","xlabel 'txt' [pos]", mgls_xlabel, mglc_xlabel,12}, + {"xrange","Set range for x-axis","xrange Dat [add] | x1 x2", mgls_xrange, mglc_xrange,14}, + {"xtick","Set ticks for x-axis","xtick dx [sx tx] | 'tmpl' | Xdat 'lbl' [add] | v1 'lbl1' ...", mgls_xtick, mglc_xtick,14}, + {"ylabel","Draw label for y-axis","ylabel 'txt' [pos]", mgls_ylabel, mglc_ylabel,12}, + {"yrange","Set range for y-axis","yrange Dat [add] | y1 y2", mgls_yrange, mglc_yrange,14}, + {"ytick","Set ticks for y-axis","ytick dy [sy ty] | 'tmpl' | Ydat 'lbl' [add] | v1 'lbl1' ...", mgls_ytick, mglc_ytick,14}, + {"zlabel","Draw label for z-axis","zlabel 'txt' [pos]", mgls_zlabel, mglc_zlabel,12}, + {"zoom","Zoom plot region","zoom x1 x2 y1 y2", mgls_zoom, mglc_zoom,5}, + {"zoomaxis","Zoom axis range","zoomaxis x1 x2|x1 x2 y1 y2|x1 x2 y1 y2 z1 z2|x1 x2 y1 y2 z1 z2 c1 c2", mgls_zoomaxis, mglc_zoomaxis,14}, + {"zrange","Set range for z-axis","yrange Dat [add] | z1 z2", mgls_zrange, mglc_zrange,14}, + {"ztick","Set ticks for z-axis","ztick dz [sz tz] | 'tmpl' | Zdat 'lbl' [add] | v1 'lbl1' ...", mgls_ztick, mglc_ztick,14}, {"","","",NULL,NULL,0}}; //----------------------------------------------------------------------------- diff --git a/src/export.cpp b/src/export.cpp index 66ce793..d95e12a 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * export.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -36,30 +36,33 @@ extern "C" { int mgl_pnga_save(const char *fname, int w, int h, unsigned char **p) { #if MGL_HAVE_PNG - FILE *fp = fopen(fname, "wb"); + bool fl = strcmp(fname,"-"); + FILE *fp = fl ? fopen(fname, "wb") : stdout; if (!fp) return 1; png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,0,0,0); - if (!png_ptr) { fclose(fp); return 1; } - png_infop info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { png_destroy_write_struct(&png_ptr,0); fclose(fp); return 1; } - - png_init_io(png_ptr, fp); - png_set_filter(png_ptr, 0, PNG_ALL_FILTERS); - png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); - png_set_IHDR(png_ptr, info_ptr, w, h, 8, - PNG_COLOR_TYPE_RGB_ALPHA, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT); - png_set_rows(png_ptr, info_ptr, p); - png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, 0); - png_write_end(png_ptr, info_ptr); - - png_destroy_write_struct(&png_ptr, &info_ptr); - fclose(fp); + if (png_ptr) + { + png_infop info_ptr = png_create_info_struct(png_ptr); + if (info_ptr) + { + png_init_io(png_ptr, fp); + png_set_filter(png_ptr, 0, PNG_ALL_FILTERS); + png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); + png_set_IHDR(png_ptr, info_ptr, w, h, 8, + PNG_COLOR_TYPE_RGB_ALPHA, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + png_set_rows(png_ptr, info_ptr, p); + png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, 0); + png_write_end(png_ptr, info_ptr); + } + png_destroy_write_struct(&png_ptr, &info_ptr); + } + if(fl) fclose(fp); return 0; #else + mglGlobalMess += "PNG support was disabled. Please, enable it and rebuild MathGL.\n"; return 1; #endif } @@ -67,37 +70,41 @@ int mgl_pnga_save(const char *fname, int w, int h, unsigned char **p) int mgl_png_save(const char *fname, int w, int h, unsigned char **p) { #if MGL_HAVE_PNG - FILE *fp = fopen(fname, "wb"); + bool fl = strcmp(fname,"-"); + FILE *fp = fl ? fopen(fname, "wb") : stdout; if (!fp) return 1; png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,0,0,0); - if (!png_ptr) { fclose(fp); return 1; } - png_infop info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { png_destroy_write_struct(&png_ptr,0); fclose(fp); return 1; } - - png_init_io(png_ptr, fp); - png_set_filter(png_ptr, 0, PNG_ALL_FILTERS); - png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); - png_set_IHDR(png_ptr, info_ptr, w, h, 8, - PNG_COLOR_TYPE_RGB, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT); - png_set_rows(png_ptr, info_ptr, p); - png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, 0); - png_write_end(png_ptr, info_ptr); - - png_destroy_write_struct(&png_ptr, &info_ptr); - fclose(fp); + if (png_ptr) + { + png_infop info_ptr = png_create_info_struct(png_ptr); + if (info_ptr) + { + png_init_io(png_ptr, fp); + png_set_filter(png_ptr, 0, PNG_ALL_FILTERS); + png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); + png_set_IHDR(png_ptr, info_ptr, w, h, 8, + PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + png_set_rows(png_ptr, info_ptr, p); + png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, 0); + png_write_end(png_ptr, info_ptr); + } + png_destroy_write_struct(&png_ptr, &info_ptr); + } + if(fl) fclose(fp); return 0; #else + mglGlobalMess += "PNG support was disabled. Please, enable it and rebuild MathGL.\n"; return 1; #endif } //----------------------------------------------------------------------------- int mgl_bmp_save(const char *fname, int w, int h, unsigned char **p) { - FILE *fp = fopen(fname,"wb"); + bool fl = strcmp(fname,"-"); + FILE *fp = fl ? fopen(fname, "wb") : stdout; if (!fp) return 1; char z[4] = {0,0,0,0}; @@ -122,13 +129,14 @@ int mgl_bmp_save(const char *fname, int w, int h, unsigned char **p) fwrite(q+1,1,1,fp); fwrite(q+0,1,1,fp); } - fclose(fp); + if(fl) fclose(fp); return 0; } //----------------------------------------------------------------------------- int mgl_tga_save(const char *fname, int w, int h, unsigned char **p) { - FILE *fp = fopen(fname,"wb"); + bool fl = strcmp(fname,"-"); + FILE *fp = fl ? fopen(fname, "wb") : stdout; if (!fp) return 1; // header char head[14]={0,0,2, 0,0,0,0,0, 0,0,0,0, 32,0}; @@ -146,7 +154,7 @@ int mgl_tga_save(const char *fname, int w, int h, unsigned char **p) fwrite(q+0,1,1,fp); fwrite(q+3,1,1,fp); } - fclose(fp); + if(fl) fclose(fp); return 0; } //----------------------------------------------------------------------------- @@ -155,12 +163,14 @@ int mgl_jpeg_save(const char *fname, int w, int h, unsigned char **p) #if MGL_HAVE_JPEG struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; - FILE * outfile; + + bool fl = strcmp(fname,"-"); + FILE *fp = fl ? fopen(fname, "wb") : stdout; + if (!fp) return 1; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); - if((outfile = fopen(fname, "wb")) == 0) return 1; - jpeg_stdio_dest(&cinfo, outfile); + jpeg_stdio_dest(&cinfo, fp); cinfo.image_width = w; cinfo.image_height = h; cinfo.input_components = 3; @@ -170,9 +180,10 @@ int mgl_jpeg_save(const char *fname, int w, int h, unsigned char **p) jpeg_write_scanlines(&cinfo, p, h); jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); - fclose(outfile); + if(fl) fclose(fp); return 0; #else + mglGlobalMess += "JPEG support was disabled. Please, enable it and rebuild MathGL.\n"; return 1; #endif } @@ -194,7 +205,9 @@ int mgl_bps_save(const char *fname, int w, int h, unsigned char **p) register long i,j; bool gz = fname[strlen(fname)-1]=='z'; - void *fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt"); + void *fp; + if(!strcmp(fname,"-")) fp = stdout; // allow to write in stdout + else fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt"); mgl_printf(fp, gz, "%%!PS-Adobe-3.0 EPSF-3.0\n%%%%BoundingBox: 0 0 %d %d\n",w,h); mgl_printf(fp, gz, "%%%%Created by MathGL library\n%%%%Title: %s\n", fname); mgl_printf(fp, gz, "%%%%CreationDate: %s\n",ctime(&now)); @@ -206,7 +219,7 @@ int mgl_bps_save(const char *fname, int w, int h, unsigned char **p) mgl_printf(fp, gz, "%02x%02x%02x",p[j][3*i],p[j][3*i+1],p[j][3*i+2]); } mgl_printf(fp, gz, "\n\nshowpage\n%%%%EOF\n"); - if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); + if(strcmp(fname,"-")) { if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); } return 0; } //----------------------------------------------------------------------------- @@ -245,6 +258,7 @@ int mgl_gif_save(const char *fname, int w, int h, unsigned char **l) EGifCloseFile(fg); delete []line; return 0; #else + mglGlobalMess += "GIF support was disabled. Please, enable it and rebuild MathGL.\n"; return 1; #endif } @@ -288,6 +302,8 @@ void mglCanvas::StartGIF(const char *fname, int ms) EGifPutExtensionFirst(gif,0xff,11,ext1); EGifPutExtensionLast(gif,0xff,3,ext3); EGifPutExtension(gif,0xf9,4,ext2); +#else + mglGlobalMess += "GIF support was disabled. Please, enable it and rebuild MathGL.\n"; #endif } //----------------------------------------------------------------------------- @@ -295,6 +311,8 @@ void mglCanvas::CloseGIF() { #if MGL_HAVE_GIF if(gif) EGifCloseFile(gif); +#else + mglGlobalMess += "GIF support was disabled. Please, enable it and rebuild MathGL.\n"; #endif gif = 0; } @@ -307,6 +325,8 @@ int mglCanvas::NewFrame() //----------------------------------------------------------------------------- void mglCanvas::EndFrame() { + Finish(); + if(get(MGL_VECT_FRAME)) PushDrwDat(); #if MGL_HAVE_GIF long width, height, n; unsigned char *f=0, **l=0; @@ -329,9 +349,20 @@ void mglCanvas::EndFrame() delete []line; free(l); if(f) free(f); #else - if(get(MGL_USEDRWDAT)) PushDrwDat(); - Finish(); + mglGlobalMess += "GIF support was disabled. Please, enable it and rebuild MathGL.\n"; +#endif +} +//----------------------------------------------------------------------------- +void mglCanvas::DelFrame(long i) +{ +#if MGL_HAVE_PTHREAD + pthread_mutex_lock(&mutexDrw); + if(get(MGL_VECT_FRAME)) DrwDat.erase(DrwDat.begin()+i); + pthread_mutex_unlock(&mutexDrw); +#else + if(get(MGL_VECT_FRAME)) DrwDat.erase(DrwDat.begin()+i); #endif + CurFrameId--; } //----------------------------------------------------------------------------- #undef _GR_ @@ -475,6 +506,7 @@ void mgl_write_frame(HMGL gr, const char *fname,const char *descr) if(!strcmp(fname+len-4,".jpg")) mgl_write_jpg(gr,fname,descr); if(!strcmp(fname+len-5,".jpeg"))mgl_write_jpg(gr,fname,descr); if(!strcmp(fname+len-4,".prc")) mgl_write_prc(gr,fname,descr,1); + if(!strcmp(fname+len-4,".pdf")) mgl_write_prc(gr,fname,descr,1); if(!strcmp(fname+len-4,".png")) mgl_write_png(gr,fname,descr); if(!strcmp(fname+len-4,".eps")) mgl_write_eps(gr,fname,descr); if(!strcmp(fname+len-4,".svg")) mgl_write_svg(gr,fname,descr); @@ -482,6 +514,13 @@ void mgl_write_frame(HMGL gr, const char *fname,const char *descr) if(!strcmp(fname+len-4,".bmp")) mgl_write_bmp(gr,fname,descr); if(!strcmp(fname+len-4,".tga")) mgl_write_tga(gr,fname,descr); if(!strcmp(fname+len-5,".mgld"))mgl_export_mgld(gr,fname,descr); + if(!strcmp(fname+len-4,".json")) mgl_write_json(gr,fname,descr); + if(!strcmp(fname+len-4,".obj")) mgl_write_obj(gr,fname,descr,1); + if(!strcmp(fname+len-4,".tex")) mgl_write_tex(gr,fname,descr); + if(!strcmp(fname+len-4,".xyz")) mgl_write_xyz(gr,fname,descr); + if(!strcmp(fname+len-4,".stl")) mgl_write_stl(gr,fname,descr); + if(!strcmp(fname+len-4,".off")) mgl_write_off(gr,fname,descr,0); +// if(!strcmp(fname+len-4,".x3d")) mgl_write_x3d(gr,fname,descr,1); } void mgl_write_frame_(uintptr_t *gr, const char *fname,const char *descr,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; diff --git a/src/export_2d.cpp b/src/export_2d.cpp index a92db4a..efe51da 100644 --- a/src/export_2d.cpp +++ b/src/export_2d.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * export_2d.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -19,33 +19,37 @@ ***************************************************************************/ #include "mgl2/canvas.h" #include "mgl2/canvas_cf.h" +#include "mgl2/font.h" #include #include #include +#include +#include #undef _GR_ #define _GR_ ((mglCanvas *)(*gr)) #define _Gr_ ((mglCanvas *)(gr)) void mgl_printf(void *fp, bool gz, const char *str, ...); //----------------------------------------------------------------------------- -char *mgl_get_dash(unsigned short d, mreal w) +const char *mgl_get_dash(unsigned short d, mreal w) { - static char s[64],b[4]; - if(d==0xffff) { strcpy(s,""); return s; } + static char b[32]; + static std::string s; + if(d==0xffff) return ""; int f=0, p=d&1, n=p?0:1, i, j; - strcpy(s, p ? "" : "0"); + s = p ? "" : "0"; for(i=0;i<16;i++) { j = i;//15-i; if(((d>>j)&1) == p) f++; else { - sprintf(b," %g",f*w); strcat(s,b); + sprintf(b," %g",f*w); s += b; p = (d>>j)&1; f = 1; n++; } } - sprintf(b," %g",f*w); strcat(s,b); - strcat(s,n%2 ? "" : " 0"); - return s; + sprintf(b," %g",f*w); s += b; + s += n%2 ? "" : " 0"; + return s.c_str(); } //----------------------------------------------------------------------------- bool mgl_is_same(HMGL gr, const mglPrim &pr,mreal wp,mglColor cp,int st) @@ -60,7 +64,8 @@ bool mgl_is_same(HMGL gr, const mglPrim &pr,mreal wp,mglColor cp,int st) //----------------------------------------------------------------------------- void put_line(HMGL gr, void *fp, bool gz, long i, mreal wp, mglColor cp,int st, const char *ifmt, const char *nfmt, bool neg, mreal fc) { - register long n1=gr->GetPrm(i).n1, n2=gr->GetPrm(i).n2; + long n1=gr->GetPrm(i).n1, n2=gr->GetPrm(i).n2; + if(n1>n2) { n1=gr->GetPrm(i).n2; n2=gr->GetPrm(i).n1; } if(n1<0 || n2<0) return; const mglPnt &pp1 = gr->GetPnt(n1), &pp2 = gr->GetPnt(n2); mreal x0=pp1.x, y0=pp1.y; @@ -116,7 +121,7 @@ void put_line(HMGL gr, void *fp, bool gz, long i, mreal wp, mglColor cp,int st, } } } - for(j=0;jGetPnt(ids[j]); x0 = p.x; y0 = p.y; @@ -145,8 +150,9 @@ void put_desc(HMGL gr, void *fp, bool gz, const char *pre, const char *ln1, cons g[n]=q.n4; s[n]=q.n3&7; n++; // add to list of described // "%c%c%c_%04x {" mgl_printf(fp, gz, pre, q.n3&1?'b':'n', q.n3&2?'i':'n', q.n4); - int nl=gr->GetFont()->GetNl(q.n3&3,q.n4); - const short *ln=gr->GetFont()->GetLn(q.n3&3,q.n4); + const mglGlyph &g = gr->GetGlf(q.n4); + int nl=g.nl; + const short *ln=g.line; long ik,ii; bool np=true; if(ln && nl>0) for(ik=0;ikGetPrmNum()<1) return; _Gr_->clr(MGL_FINISHED); _Gr_->Finish(false); time_t now; time(&now); bool gz = fname[strlen(fname)-1]=='z'; - void *fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt"); + void *fp; + if(!strcmp(fname,"-")) fp = stdout; // allow to write in stdout + else fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt"); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } mgl_printf(fp, gz, "%%!PS-Adobe-3.0 EPSF-3.0\n%%%%BoundingBox: 0 0 %d %d\n", _Gr_->GetWidth(), _Gr_->GetHeight()); mgl_printf(fp, gz, "%%%%Created by MathGL library\n%%%%Title: %s\n",descr ? descr : fname); @@ -198,9 +221,9 @@ void mgl_write_eps(HMGL gr, const char *fname,const char *descr) mgl_printf(fp, gz, "/np {newpath} def\n/cp {closepath} def\n"); mgl_printf(fp, gz, "/ll {lineto} def\n/mt {moveto} def\n"); mgl_printf(fp, gz, "/rl {rlineto} def\n/rm {rmoveto} def\n/dr {stroke} def\n"); - mgl_printf(fp, gz, "/ss {%g} def\n",0.4*gr->mark_size()); - mgl_printf(fp, gz, "/s2 {%g} def\n",0.8*gr->mark_size()); - mgl_printf(fp, gz, "/sm {-%g} def\n",0.4*gr->mark_size()); + mgl_printf(fp, gz, "/ss {%g} def\n",0.35*gr->mark_size()); + mgl_printf(fp, gz, "/s2 {%g} def\n",0.7*gr->mark_size()); + mgl_printf(fp, gz, "/sm {-%g} def\n",0.35*gr->mark_size()); mgl_printf(fp, gz, "/m_c {ss 0.3 mul 0 360 arc} def\n"); mgl_printf(fp, gz, "/d0 {[] 0 setdash} def\n/sd {setdash} def\n"); @@ -253,6 +276,7 @@ void mgl_write_eps(HMGL gr, const char *fname,const char *descr) put_desc(gr,fp,gz,"/%c%c_%04x { np\n", "\t%d %d mt ", "%d %d ll ", "cp\n", "} def\n"); // write primitives mreal wp=-1; + float qs_old=gr->mark_size()/gr->FontFactor(); mglColor cp; int st=0; char str[256]=""; @@ -267,13 +291,14 @@ void mgl_write_eps(HMGL gr, const char *fname,const char *descr) if(q.type==0) // mark { mreal x0 = p1.x,y0 = p1.y; - sprintf(str,"1 lw %.2g %.2g %.2g rgb ", cp.r,cp.g,cp.b); + sprintf(str,"%.2g lw %.2g %.2g %.2g rgb ", 50*q.s*q.w>1?50*q.s*q.w:1, cp.r,cp.g,cp.b); wp=1; - if(q.s!=gr->mark_size()/gr->FontFactor()) + if(q.s!=qs_old) { - mgl_printf(fp, gz, "/ss {%g} def\n",q.s*0.4*gr->FontFactor()); - mgl_printf(fp, gz, "/s2 {%g} def\n",q.s*0.8*gr->FontFactor()); - mgl_printf(fp, gz, "/sm {-%g} def\n",q.s*0.4*gr->FontFactor()); + mgl_printf(fp, gz, "/ss {%g} def\n",q.s); + mgl_printf(fp, gz, "/s2 {%g} def\n",q.s*2); + mgl_printf(fp, gz, "/sm {-%g} def\n",q.s); + qs_old = q.s; } switch(q.n4) { @@ -300,23 +325,19 @@ void mgl_write_eps(HMGL gr, const char *fname,const char *descr) case 'C': mgl_printf(fp, gz, "%g %g m_o %g %g m_c %sdr\n",x0,y0,x0,y0,str); break; default: mgl_printf(fp, gz, "%g %g m_c %sfill\n",x0,y0,str); } - if(q.s!=gr->mark_size()/gr->FontFactor()) - { - mgl_printf(fp, gz, "/ss {%g} def\n",0.4*gr->mark_size()); - mgl_printf(fp, gz, "/s2 {%g} def\n",0.8*gr->mark_size()); - mgl_printf(fp, gz, "/sm {-%g} def\n",0.4*gr->mark_size()); - } } else if(q.type==3) // quad { - const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3), p4=gr->GetPnt(q.n4); - mgl_printf(fp, gz, "np %g %g mt %g %g ll %g %g ll %g %g ll cp %sfill\n", + const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3), &p4=gr->GetPnt(q.n4); + if(p1.a>mgl_min_a || p2.a>mgl_min_a || p3.a>mgl_min_a || p4.a>mgl_min_a) + mgl_printf(fp, gz, "np %g %g mt %g %g ll %g %g ll %g %g ll cp %sfill\n", p1.x, p1.y, p2.x, p2.y, p4.x, p4.y, p3.x, p3.y, str); } else if(q.type==2) // trig { - const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3); - mgl_printf(fp, gz, "np %g %g mt %g %g ll %g %g ll cp %sfill\n", + const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3); + if(p1.a>mgl_min_a || p2.a>mgl_min_a || p3.a>mgl_min_a) + mgl_printf(fp, gz, "np %g %g mt %g %g ll %g %g ll cp %sfill\n", p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, str); } else if(q.type==1) // line @@ -328,9 +349,9 @@ void mgl_write_eps(HMGL gr, const char *fname,const char *descr) if(sd && sd[0]) mgl_printf(fp, gz, "%s [%s] %g sd dr\n",str,sd,q.w*q.s); else mgl_printf(fp, gz, "%s d0 dr\n",str); } - else if(q.type==4) // glyph + else if(q.type==4 && !mgl_isnan(q.w)) // glyph { - mreal ss = q.s/2, xx = p1.u, yy = p1.v, zz = p1.w; + mreal ss = q.s/2, xx = p1.u, yy = p1.v, zz = q.p; mgl_printf(fp, gz, "gsave\t%g %g translate %g %g scale %g rotate %s\n", p1.x, p1.y, ss, ss, -q.w, str); if(q.n3&8) // this is "line" @@ -353,7 +374,7 @@ void mgl_write_eps(HMGL gr, const char *fname,const char *descr) if(q.type==-1) q.type = 1; } mgl_printf(fp, gz, "\nshowpage\n%%%%EOF\n"); - if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); + if(strcmp(fname,"-")) { if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); } } void mgl_write_eps_(uintptr_t *gr, const char *fname,const char *descr,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; @@ -362,13 +383,16 @@ void mgl_write_eps_(uintptr_t *gr, const char *fname,const char *descr,int l,int //----------------------------------------------------------------------------- void mgl_write_svg(HMGL gr, const char *fname,const char *descr) { + if(!fname || *fname==0) return; if(gr->GetPrmNum()<1) return; _Gr_->clr(MGL_FINISHED); _Gr_->Finish(false); time_t now; time(&now); bool gz = fname[strlen(fname)-1]=='z'; long hh = _Gr_->GetHeight(); - void *fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt"); + void *fp; + if(!strcmp(fname,"-")) fp = stdout; // allow to write in stdout + else fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt"); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } mgl_printf(fp, gz, "\n"); mgl_printf(fp, gz, "\n"); @@ -396,13 +420,13 @@ void mgl_write_svg(HMGL gr, const char *fname,const char *descr) const mglPnt p1=gr->GetPnt(q.n1); if(q.type==0) { - mreal x=p1.x,y=hh-p1.y,s=0.4*gr->FontFactor()*q.s; + mreal x=p1.x,y=hh-p1.y,s=q.s; if(!strchr("xsSoO",q.n4)) s *= 1.1; wp = 1; if(strchr("SDVTLR",q.n4)) mgl_printf(fp, gz, "\n", int(255*cp.r),int(255*cp.g),int(255*cp.b)); else - mgl_printf(fp, gz, "\n", int(255*cp.r),int(255*cp.g),int(255*cp.b)); + mgl_printf(fp, gz, "\n", int(255*cp.r),int(255*cp.g),int(255*cp.b), 50*q.s*q.w>1?50*q.s*q.w:1); switch(q.n4) { case 'P': @@ -421,11 +445,11 @@ void mgl_write_svg(HMGL gr, const char *fname,const char *descr) case 'd': case 'D': mgl_printf(fp, gz, "\n", x-s,y,x,y-s,x+s,y,x,y+s); break; - case '^': - case 'T': - mgl_printf(fp, gz, "\n", x-s,y-s/2,x+s,y-s/2,x,y+s); break; case 'v': case 'V': + mgl_printf(fp, gz, "\n", x-s,y-s/2,x+s,y-s/2,x,y+s); break; + case '^': + case 'T': mgl_printf(fp, gz, "\n", x-s,y+s/2,x+s,y+s/2,x,y-s); break; case '<': case 'L': @@ -452,21 +476,8 @@ void mgl_write_svg(HMGL gr, const char *fname,const char *descr) } mgl_printf(fp, gz, "\n"); } - else if(q.type==2 && cp.a>0) - { - const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3); - mgl_printf(fp, gz, "\n", int(255*cp.r),int(255*cp.g),int(255*cp.b),cp.a); - mgl_printf(fp, gz, " \n", p1.x, hh-p1.y, p2.x, hh-p2.y, p3.x, hh-p3.y); - } - else if(q.type==3 && cp.a>0) - { - const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3), p4=gr->GetPnt(q.n4); - mgl_printf(fp, gz, "\n", int(255*cp.r),int(255*cp.g),int(255*cp.b),cp.a); - mgl_printf(fp, gz, " \n", p1.x, hh-p1.y, p2.x, hh-p2.y, p4.x, hh-p4.y, p3.x, hh-p3.y); - } else if(q.type==1) { - // const char *dash[]={"", "8 8","4 4","1 3","7 4 1 4","3 2 1 2"}; mgl_printf(fp,gz," \n"); } - else if(q.type==4) + else if(q.type==2 && cp.a>mgl_min_a) + { + const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3); + mgl_printf(fp, gz, "\n", int(255*cp.r),int(255*cp.g),int(255*cp.b),cp.a); + mgl_printf(fp, gz, " \n", p1.x, hh-p1.y, p2.x, hh-p2.y, p3.x, hh-p3.y); + } + else if(q.type==3 && cp.a>mgl_min_a) + { + const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3), &p4=gr->GetPnt(q.n4); + mgl_printf(fp, gz, "\n", int(255*cp.r),int(255*cp.g),int(255*cp.b),cp.a); + mgl_printf(fp, gz, " \n", p1.x, hh-p1.y, p2.x, hh-p2.y, p4.x, hh-p4.y, p3.x, hh-p3.y); + } + else if(q.type==4 && !mgl_isnan(q.w)) { - mreal ss = q.s/2, xx = p1.u, yy = p1.v, zz = p1.w; + mreal ss = q.s/2, xx = p1.u, yy = p1.v, zz = q.p; if(q.n3&8) // this is "line" { mgl_printf(fp, gz, "GetPrmNum();i++) { mglPrim &q=gr->GetPrm(i); if(q.type==-1) q.type = 1; } mgl_printf(fp, gz, ""); - if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); + if(strcmp(fname,"-")) { if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); } } void mgl_write_svg_(uintptr_t *gr, const char *fname,const char *descr,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; @@ -594,158 +617,6 @@ mglSVGName mgl_names[]={{"AliceBlue",.94,.972,1}, {"magenta", 1,0,1}, {"yellow", 1,1,0}, {"",-1,-1,-1}}; -/*mglSVGName mgl_names[]={{"AliceBlue",.94,.972,1}, - * {"AntiqueWhite",.98,.92,.844}, - * {"Aqua",0,1,1}, - * {"Aquamarine",.498,1,.83}, - * {"Azure",.94,1,1}, - * {"Beige",.96,.96,.864}, - * {"Bisque",1,.894,.77}, - * {"Black",0,0,0}, - * {"BlanchedAlmond",1,.92,.804}, - * {"Blue",0,0,1}, - * {"BlueViolet",.54,.17,.888}, - * {"Brown,.648",.165,.165}, - * {"BurlyWood",.87,.72,.53}, - * {"CadetBlue",.372,.62,.628}, - * {"Chartreuse",.498,1,0}, - * {"Chocolate",.824,.41,.116}, - * {"Coral",1,.498,.312}, - * {"CornflowerBlue",.392,.585,.93}, - * {"Cornsilk",1,.972,.864}, - * {"Crimson",.864,.08,.235}, - * {"Cyan",0,1,1}, - * {"DarkBlue",0,0,.545}, - * {"DarkCyan",0,.545,.545}, - * {"DarkGoldenrod",.72,.525,.044}, - * {"DarkGray",.664,.664,.664}, - * {"DarkGreen",0,.392,0}, - * {"DarkGrey",.664,.664,.664}, - * {"DarkKhaki",.74,.716,.42}, - * {"DarkMagenta",.545,0,.545}, - * {"DarkOliveGreen",.332,.42,.185}, - * {"DarkOrange",1,.55,0}, - * {"DarkOrchid",.6,.196,.8}, - * {"DarkRed",.545,0,0}, - * {"DarkSalmon",.912,.59,.48}, - * {"DarkSeaGreen",.56,.736,.56}, - * {"DarkSlateBlue",.284,.24,.545}, - * {"DarkSlateGray",.185,.31,.31}, - * {"DarkSlateGrey",.185,.31,.31}, - * {"DarkTurquoise",0,.808,.82}, - * {"DarkViolet",.58,0,.828}, - * {"DeepPink",1,.08,.576}, - * {"DeepSkyBlue",0,.75,1}, - * {"DimGray",.41,.41,.41}, - * {"DimGrey",.41,.41,.41}, - * {"DodgerBlue",.116,.565,1}, - * {"FireBrick",.698,.132,.132}, - * {"FloralWhite",1,.98,.94}, - * {"ForestGreen",.132,.545,.132}, - * {"Fuchsia",1,0,1}, - * {"Gainsboro",.864,.864,.864}, - * {"GhostWhite",.972,.972,1}, - * {"Gold",1,.844,0}, - * {"Goldenrod",.855,.648,.125}, - * {"Gray",.5,.5,.5}, - * {"Green",0,.5,0}, - * {"GreenYellow",.68,1,.185}, - * {"Grey",.5,.5,.5}, - * {"Honeydew",.94,1,.94}, - * {"HotPink",1,.41,.705}, - * {"IndianRed",.804,.36,.36}, - * {"Indigo",.294,0,.51}, - * {"Ivory",1,1,.94}, - * {"Khaki",.94,.9,.55}, - * {"Lavender",.9,.9,.98}, - * {"LavenderBlush",1,.94,.96}, - * {"LawnGreen",.488,.99,0}, - * {"LemonChiffon",1,.98,.804}, - * {"LightBlue",.68,.848,.9}, - * {"LightCoral",.94,.5,.5}, - * {"LightCyan",.88,1,1}, - * {"LightGoldenrod",.933,.867,.51}, - * {"LightGoldenrodYellow",.98,.98,.824}, - * {"LightGray",.828,.828,.828}, - * {"LightGreen",.565,.932,.565}, - * {"LightGrey",.828,.828,.828}, - * {"LightPink",1,.712,.756}, - * {"LightSalmon",1,.628,.48}, - * {"LightSeaGreen",.125,.698,.668}, - * {"LightSkyBlue",.53,.808,.98}, - * {"LightSlateBlue",.518,.44,1}, - * {"LightSlateGray",.468,.532,.6}, - * {"LightSlateGrey",.468,.532,.6}, - * {"LightSteelBlue",.69,.77,.87}, - * {"LightYellow",1,1,.88}, - * {"Lime",0,1,0}, - * {"LimeGreen",.196,.804,.196}, - * {"Linen",.98,.94,.9}, - * {"Magenta",1,0,1}, - * {"Maroon",.5,0,0}, - * {"MediumAquamarine",.4,.804,.668}, - * {"MediumBlue",0,0,.804}, - * {"MediumOrchid",.73,.332,.828}, - * {"MediumPurple",.576,.44,.86}, - * {"MediumSeaGreen",.235,.7,.444}, - * {"MediumSlateBlue",.484,.408,.932}, - * {"MediumSpringGreen",0,.98,.604}, - * {"MediumTurquoise",.284,.82,.8}, - * {"MediumVioletRed",.78,.084,.52}, - * {"MidnightBlue",.098,.098,.44}, - * {"MintCream",.96,1,.98}, - * {"MistyRose",1,.894,.884}, - * {"Moccasin",1,.894,.71}, - * {"NavajoWhite",1,.87,.68}, - * {"Navy",0,0,.5}, - * {"NavyBlue",0,0,.5}, - * {"OldLace",.992,.96,.9}, - * {"Olive",.5,.5,0}, - * {"OliveDrab",.42,.556,.136}, - * {"Orange",1,.648,0}, - * {"OrangeRed",1,.27,0}, - * {"Orchid",.855,.44,.84}, - * {"PaleGoldenrod",.932,.91,.668}, - * {"PaleGreen",.596,.985,.596}, - * {"PaleTurquoise",.688,.932,.932}, - * {"PaleVioletRed",.86,.44,.576}, - * {"PapayaWhip",1,.936,.835}, - * {"PeachPuff",1,.855,.725}, - * {"Peru",.804,.52,.248}, - * {"Pink",1,.752,.796}, - * {"Plum",.868,.628,.868}, - * {"PowderBlue",.69,.88,.9}, - * {"Purple",.5,0,.5}, - * {"Red",1,0,0}, - * {"RosyBrown",.736,.56,.56}, - * {"RoyalBlue",.255,.41,.884}, - * {"SaddleBrown",.545,.27,.075}, - * {"Salmon",.98,.5,.448}, - * {"SandyBrown",.956,.644,.376}, - * {"SeaGreen",.18,.545,.34}, - * {"Seashell",1,.96,.932}, - * {"Sienna",.628,.32,.176}, - * {"Silver",.752,.752,.752}, - * {"SkyBlue",.53,.808,.92}, - * {"SlateBlue",.415,.352,.804}, - * {"SlateGray",.44,.5,.565}, - * {"SlateGrey",.44,.5,.565}, - * {"Snow",1,.98,.98}, - * {"SpringGreen",0,1,.498}, - * {"SteelBlue",.275,.51,.705}, - * {"Tan",.824,.705,.55}, - * {"Teal",0,.5,.5}, - * {"Thistle",.848,.75,.848}, - * {"Tomato",1,.39,.28}, - * {"Turquoise",.25,.88,.815}, - * {"Violet",.932,.51,.932}, - * {"VioletRed",.816,.125,.565}, - * {"Wheat",.96,.87,.7}, - * {"White",1,1,1}, - * {"WhiteSmoke",.96,.96,.96}, - * {"Yellow",1,1,0}, - * {"YellowGreen",.604,.804,.196}, - * {"",-1,-1,-1}};*/ //----------------------------------------------------------------------------- const char *mglColorName(mglColor c) // return closest SVG color { @@ -764,67 +635,20 @@ void mgl_write_tex(HMGL gr, const char *fname,const char *descr) { if(gr->GetPrmNum()<1) return; _Gr_->clr(MGL_FINISHED); _Gr_->Finish(false); - FILE *fp=fopen("mglcolors.tex","wt"); - register int ii,jj,kk; // save colors which can be required at output - for(ii=0;ii<6;ii++) for(jj=0;jj<6;jj++) for(kk=0;kk<6;kk++) - fprintf(fp,"\\definecolor{mgl_%d}{RGB}{%d,%d,%d}\n",ii+6*(jj+6*kk),51*ii,51*jj,51*kk); - fclose(fp); - fp = fopen(fname,"wt"); + + FILE *fp = fopen(fname,"wt"); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } - fprintf(fp, "%% Created by MathGL library\n%% Title: %s\n",descr?descr:fname); - fprintf(fp, "\\input{mglcolors.tex}\n\\begin{tikzpicture}\n"); - mreal ms=0.4*gr->mark_size()/100; + fprintf(fp, "%% Created by MathGL library\n%% Title: %s\n\n",descr?descr:fname); + fprintf(fp, "\\begin{tikzpicture}\n"); - // write primitives + // write primitives first mreal wp=-1; register long i; + register int ii,jj,kk; int st=0; mglColor cp; char cname[16]; - // add mark definition if present - bool m_p=false,m_x=false,m_d=false,m_v=false,m_t=false, - m_s=false,m_a=false,m_o=false,m_O=false,m_T=false, - m_V=false,m_S=false,m_D=false,m_Y=false,m_l=false, - m_L=false,m_r=false,m_R=false,m_X=false,m_P=false; - for(i=0;iGetPrmNum();i++) - { - const mglPrim q = gr->GetPrm(i); - if(q.type>0) continue; if(q.n4=='+') m_p = true; - if(q.n4=='x') m_x = true; if(q.n4=='s') m_s = true; - if(q.n4=='d') m_d = true; if(q.n4=='v') m_v = true; - if(q.n4=='^') m_t = true; if(q.n4=='*') m_a = true; - if(q.n4=='O') m_O = true; if(q.n4=='o' || q.n4=='C') m_o = true; - if(q.n4=='S') m_S = true; if(q.n4=='D') m_D = true; - if(q.n4=='V') m_V = true; if(q.n4=='T') m_T = true; - if(q.n4=='<') m_l = true; if(q.n4=='L') m_L = true; - if(q.n4=='>') m_r = true; if(q.n4=='R') m_R = true; - if(q.n4=='Y') m_Y = true; - if(q.n4=='P') m_P = true; if(q.n4=='X') m_X = true; - } - if(m_P) { m_p=true; m_s=true; } - if(m_X) { m_x=true; m_s=true; } - if(m_p) fprintf(fp, "\\providecommand{\\mglp}[3]{\\draw[#3] (#1-%g, #2) -- (#1+%g,#2) (#1,#2-%g) -- (#1,#2+%g);}\n",ms,ms,ms,ms); - if(m_x) fprintf(fp, "\\providecommand{\\mglx}[3]{\\draw[#3] (#1-%g, #2-%g) -- (#1+%g,#2+%g) (#1+%g,#2-%g) -- (#1-%g,#2+%g);}\n", ms,ms,ms,ms, ms,ms,ms,ms); - if(m_s) fprintf(fp, "\\providecommand{\\mgls}[3]{\\draw[#3] (#1-%g, #2-%g) -- (#1+%g,#2-%g) -- (#1+%g,#2+%g) -- (#1-%g,#2+%g) -- cycle;}\n", ms,ms,ms,ms, ms,ms,ms,ms); - if(m_S) fprintf(fp, "\\providecommand{\\mglS}[3]{\\fill[#3] (#1-%g, #2-%g) -- (#1+%g,#2-%g) -- (#1+%g,#2+%g) -- (#1-%g,#2+%g) -- cycle;}\n", ms,ms,ms,ms, ms,ms,ms,ms); - if(m_d) fprintf(fp, "\\providecommand{\\mgld}[3]{\\draw[#3] (#1, #2-%g) -- (#1+%g,#2) -- (#1,#2+%g) -- (#1-%g,#2) -- cycle;}\n", ms,ms,ms,ms); - if(m_D) fprintf(fp, "\\providecommand{\\mglD}[3]{\\fill[#3] (#1, #2-%g) -- (#1+%g,#2) -- (#1,#2+%g) -- (#1-%g,#2) -- cycle;}\n", ms,ms,ms,ms); - if(m_v) fprintf(fp, "\\providecommand{\\mglv}[3]{\\draw[#3] (#1-%g, #2+%g) -- (#1+%g,#2+%g) -- (#1,#2-%g) -- cycle;}\n", ms,ms/2,ms,ms/2, ms); - if(m_V) fprintf(fp, "\\providecommand{\\mglV}[3]{\\fill[#3] (#1-%g, #2+%g) -- (#1+%g,#2+%g) -- (#1,#2-%g) -- cycle;}\n", ms,ms/2,ms,ms/2, ms); - if(m_t) fprintf(fp, "\\providecommand{\\mglt}[3]{\\draw[#3] (#1-%g, #2-%g) -- (#1+%g,#2-%g) -- (#1,#2+%g) -- cycle;}\n", ms,ms/2,ms,ms/2, ms); - if(m_T) fprintf(fp, "\\providecommand{\\mglT}[3]{\\fill[#3] (#1-%g, #2-%g) -- (#1+%g,#2-%g) -- (#1,#2+%g) -- cycle;}\n", ms,ms/2,ms,ms/2, ms); - if(m_l) fprintf(fp, "\\providecommand{\\mgll}[3]{\\draw[#3] (#1+%g, #2-%g) -- (#1+%g,#2+%g) -- (#1-%g,#2) -- cycle;}\n", ms/2,ms,ms/2,ms, ms); - if(m_L) fprintf(fp, "\\providecommand{\\mglL}[3]{\\fill[#3] (#1+%g, #2-%g) -- (#1+%g,#2+%g) -- (#1-%g,#2) -- cycle;}\n", ms/2,ms,ms/2,ms, ms); - if(m_r) fprintf(fp, "\\providecommand{\\mglr}[3]{\\draw[#3] (#1-%g, #2-%g) -- (#1-%g,#2+%g) -- (#1+%g,#2) -- cycle;}\n", ms/2,ms,ms/2,ms, ms); - if(m_R) fprintf(fp, "\\providecommand{\\mglR}[3]{\\fill[#3] (#1-%g, #2-%g) -- (#1-%g,#2+%g) -- (#1+%g,#2) -- cycle;}\n", ms/2,ms,ms/2,ms, ms); - if(m_Y) fprintf(fp, "\\providecommand{\\mglR}[3]{\\draw[#3] (#1, #2-%g) -- (#1,#2) -- (#1-%g,#2+%g) (#1,#2) -- (#1+%g,#2+%g);}\n", ms,ms,ms,ms, ms); - if(m_a) fprintf(fp, "\\providecommand{\\mgla}[3]{\\draw[#3] (#1-%g, #2) -- (#1+%g,#2) (#1-0.6*%g,#2-0.8*%g) -- (#1+0.6*%g,#2+0.8*%g) (#1-0.6*%g,#2+0.8*%g) -- (#1+0.6*%g,#2-0.8*%g);}\n", ms,ms,ms,ms, ms,ms,ms,ms, ms,ms); - if(m_o) fprintf(fp, "\\providecommand{\\mglo}[3]{\\draw[#3] (#1, #2) circle (%g);}\n", ms); - if(m_O) fprintf(fp, "\\providecommand{\\mglO}[3]{\\fill[#3] (#1, #2) circle (%g);}\n", ms); - // dots command is provided in any case - fprintf(fp, "\\providecommand{\\mglc}[3]{\\draw[#3] (#1, #2) circle (%g);}\n\n", 0.1*ms); - for(i=0;iGetPrmNum();i++) { const mglPrim &q = gr->GetPrm(i); @@ -837,53 +661,53 @@ void mgl_write_tex(HMGL gr, const char *fname,const char *descr) sprintf(cname,"mgl_%d",ii+6*(jj+6*kk)); // cname = mglColorName(cp); const mglPnt p1=gr->GetPnt(q.n1); - mreal x=p1.x/100,y=p1.y/100,s=0.4*gr->FontFactor()*q.s/100; + mreal x=p1.x/100,y=p1.y/100,s=q.s/100; if(q.type==0) { if(!strchr("xsSoO",q.n4)) s *= 1.1; wp = 1; - switch(q.n4) // TODO up to here !!!!!!!!!!!!!!!!!!!! + switch(q.n4) // NOTE: no thickness for marks in TeX { case 'P': - fprintf(fp, "\\mglp{%g}{%g}{%s} \\mgls{%g}{%g}{%s}\n", x,y,cname,x,y,cname); break; + fprintf(fp, "\\mglp{%g}{%g}{%s}{%g} \\mgls{%g}{%g}{%s}{%g}\n", x,y,cname,s,x,y,cname,s); break; case 'X': - fprintf(fp, "\\mglx{%g}{%g}{%s} \\mgls{%g}{%g}{%s}\n", x,y,cname,x,y,cname); break; + fprintf(fp, "\\mglx{%g}{%g}{%s}{%g} \\mgls{%g}{%g}{%s}{%g}\n", x,y,cname,s,x,y,cname,s); break; case 'C': - fprintf(fp, "\\mglc{%g}{%g}{%s} \\mglo{%g}{%g}{%s}\n", x,y,cname,x,y,cname); break; - case '+': fprintf(fp, "\\mglp{%g}{%g}{%s}\n", x,y,cname); break; - case 'x': fprintf(fp, "\\mglx{%g}{%g}{%s}\n", x,y,cname); break; - case 's': fprintf(fp, "\\mgls{%g}{%g}{%s}\n", x,y,cname); break; - case 'S': fprintf(fp, "\\mglS{%g}{%g}{%s}\n", x,y,cname); break; - case 'd': fprintf(fp, "\\mgld{%g}{%g}{%s}\n", x,y,cname); break; - case 'D': fprintf(fp, "\\mglD{%g}{%g}{%s}\n", x,y,cname); break; - case '^': fprintf(fp, "\\mglt{%g}{%g}{%s}\n", x,y,cname); break; - case 'T': fprintf(fp, "\\mglT{%g}{%g}{%s}\n", x,y,cname); break; - case 'v': fprintf(fp, "\\mglv{%g}{%g}{%s}\n", x,y,cname); break; - case 'V': fprintf(fp, "\\mglV{%g}{%g}{%s}\n", x,y,cname); break; - case '<': fprintf(fp, "\\mgll{%g}{%g}{%s}\n", x,y,cname); break; - case 'L': fprintf(fp, "\\mglL{%g}{%g}{%s}\n", x,y,cname); break; - case '>': fprintf(fp, "\\mglr{%g}{%g}{%s}\n", x,y,cname); break; - case 'R': fprintf(fp, "\\mglR{%g}{%g}{%s}\n", x,y,cname); break; - case 'Y': fprintf(fp, "\\mglY{%g}{%g}{%s}\n", x,y,cname); break; - case 'o': fprintf(fp, "\\mglo{%g}{%g}{%s}\n", x,y,cname); break; - case 'O': fprintf(fp, "\\mglO{%g}{%g}{%s}\n", x,y,cname); break; - case '*': fprintf(fp, "\\mgla{%g}{%g}{%s}\n", x,y,cname); break; + fprintf(fp, "\\mglc{%g}{%g}{%s}{%g} \\mglo{%g}{%g}{%s}{%g}\n", x,y,cname,s,x,y,cname,s); break; + case '+': fprintf(fp, "\\mglp{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'x': fprintf(fp, "\\mglx{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 's': fprintf(fp, "\\mgls{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'S': fprintf(fp, "\\mglS{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'd': fprintf(fp, "\\mgld{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'D': fprintf(fp, "\\mglD{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case '^': fprintf(fp, "\\mglt{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'T': fprintf(fp, "\\mglT{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'v': fprintf(fp, "\\mglv{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'V': fprintf(fp, "\\mglV{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case '<': fprintf(fp, "\\mgll{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'L': fprintf(fp, "\\mglL{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case '>': fprintf(fp, "\\mglr{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'R': fprintf(fp, "\\mglR{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'Y': fprintf(fp, "\\mglY{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'o': fprintf(fp, "\\mglo{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case 'O': fprintf(fp, "\\mglO{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; + case '*': fprintf(fp, "\\mgla{%g}{%g}{%s}{%g}\n", x,y,cname,s); break; default: fprintf(fp, "\\mglc{%g}{%g}{%s}\n", x,y,cname); break; } } - else if(q.type==2 && cp.a>0) + else if(q.type==2 && cp.a>mgl_min_a) { const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3); fprintf(fp, "\\fill[%s, fill opacity=%g] (%g,%g) -- (%g,%g) -- (%g,%g) -- cycle;\n", cname,cp.a, x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100); } - else if(q.type==3 && cp.a>0) + else if(q.type==3 && cp.a>mgl_min_a) { const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3), p4=gr->GetPnt(q.n4); fprintf(fp, "\\fill[%s, fill opacity=%g] (%g,%g) -- (%g,%g) -- (%g,%g) -- (%g,%g) -- cycle;\n", cname,cp.a, x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100); } else if(q.type==1) // lines { - // const char *dash[]={"", "8 8","4 4","1 3","7 4 1 4","3 2 1 2"}; + //const char *dash[]={"", "8 8","4 4","1 3","7 4 1 4","3 2 1 2"}; const char *w[]={"semithick","thick","very thick","ultra thick"}; register int iw=int(q.w-0.5); if(iw>3) iw=3; if(iw<0) fprintf(fp,"\\draw[%s] ",cname); @@ -893,23 +717,61 @@ void mgl_write_tex(HMGL gr, const char *fname,const char *descr) put_line(gr,fp,false,i,wp,cp,st, "(%g,%g)", " -- (%g,%g)", false, 0.01); fprintf(fp, ";\n"); } - else if(q.type==6) // text + else if(q.type==6 && !mgl_isnan(q.p)) // text { const mglText &t = gr->GetPtx(q.n3); - mreal ftet = mgl_isnan(p1.v)||mgl_isnan(p1.u) ? 0:-180*atan2(p1.v,p1.u)/M_PI; + mreal dy = q.w*cos(q.p*M_PI/180)/100, dx = q.w*sin(q.p*M_PI/180)/100; int f,a; mglGetStyle(t.stl.c_str(), &f, &a); std::string ss=cname; - if((a&3)==2) ss.append(",west"); if((a&3)==0) ss.append(",east"); + if((a&3)==0) ss.append(",anchor=base west"); + if((a&3)==1) ss.append(",anchor=base"); + if((a&3)==2) ss.append(",anchor=base east"); if(f&MGL_FONT_ITAL) ss.append(",font=\\itshape"); if(f&MGL_FONT_BOLD) ss.append(",font=\\bfshape"); if(t.text.find('\\')!=std::string::npos || t.text.find('{')!=std::string::npos || t.text.find('_')!=std::string::npos || t.text.find('^')!=std::string::npos) - fprintf(fp,"\\draw[%s] (%g,%g) node[rotate=%.2g]{$%ls$};\n", ss.c_str(),x,y, ftet, t.text.c_str()); + fprintf(fp,"\\draw[%s] (%g,%g) node[rotate=%.2g]{$%ls$};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str()); else - fprintf(fp,"\\draw[%s] (%g,%g) node[rotate=%.2g]{%ls};\n", ss.c_str(),x,y, ftet, t.text.c_str()); + fprintf(fp,"\\draw[%s] (%g,%g) node[rotate=%.2g]{%ls};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str()); } } fprintf(fp, "\\end{tikzpicture}\n"); for(i=0;iGetPrmNum();i++) { mglPrim &q=gr->GetPrm(i); if(q.type==-1) q.type = 1; } fclose(fp); + + // provide colors used by figure + fp=fopen("mglcolors.tex","wt"); + for(ii=0;ii<6;ii++) for(jj=0;jj<6;jj++) for(kk=0;kk<6;kk++) + fprintf(fp,"\\definecolor{mgl_%d}{RGB}{%d,%d,%d}\n",ii+6*(jj+6*kk),51*ii,51*jj,51*kk); + mreal ms=0.4*gr->mark_size()/100; // also provide marks + fprintf(fp, "\\providecommand{\\mglp}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1,#2-#4) -- (#1,#2+#4);}\n"); + fprintf(fp, "\\providecommand{\\mglx}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2+#4) (#1+#4,#2-#4) -- (#1-#4,#2+#4);}\n"); + fprintf(fp, "\\providecommand{\\mgls}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglS}[4]{\\fill[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mgld}[4]{\\draw[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglD}[4]{\\fill[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglv}[4]{\\draw[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglV}[4]{\\fill[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglt}[4]{\\draw[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglT}[4]{\\fill[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mgll}[4]{\\draw[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglL}[4]{\\fill[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglr}[4]{\\draw[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglR}[4]{\\fill[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n"); + fprintf(fp, "\\providecommand{\\mglR}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) -- (#1-#4,#2+#4) (#1,#2) -- (#1+#4,#2+#4);}\n"); + fprintf(fp, "\\providecommand{\\mgla}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1-0.6*#4,#2-0.8*#4) -- (#1+0.6*#4,#2+0.8*#4) (#1-0.6*#4,#2+0.8*#4) -- (#1+0.6*#4,#2-0.8*#4);}\n"); + fprintf(fp, "\\providecommand{\\mglY}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) (#1-#4,#2+#4) -- (#1,#2) (#1+#4,#2+#4) -- (#1,#2);}\n"); + fprintf(fp, "\\providecommand{\\mglo}[4]{\\draw[#3] (#1, #2) circle (#4);}\n"); + fprintf(fp, "\\providecommand{\\mglO}[4]{\\fill[#3] (#1, #2) circle (#4);}\n"); + fprintf(fp, "\\providecommand{\\mglc}[3]{\\draw[#3] (#1, #2) circle (%g);}\n\n", 0.1*ms); + fclose(fp); + + // provide main file for viewing figure + fp=fopen("mglmain.tex","wt"); + fprintf(fp, "\\documentclass{article}\n\n"); + fprintf(fp, "%% following lines should be placed before \\begin{document}\n"); + fprintf(fp,"\\usepackage{tikz}\n\\input{mglcolors.tex}\n"); + fprintf(fp, "\\begin{document}\n%% start figure itself\n\\input{%s}\\end{document}\n",fname); + fclose(fp); } +//----------------------------------------------------------------------------- diff --git a/src/export_3d.cpp b/src/export_3d.cpp index 3613476..9fe45ba 100644 --- a/src/export_3d.cpp +++ b/src/export_3d.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * export_3d.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -46,199 +46,244 @@ void mglTexture::GetRGBA(unsigned char *f) const } } //----------------------------------------------------------------------------- -// I'm not sure that it is good idea -- a lot of memory used, but gain only for small files -/*void mgl_rearrange_pnt(HMGL gr, std::vector &on, std::vector &no, bool coor=false) +void mgl_obj_glyph_old(HMGL gr, const mglPrim &q, const mglPnt &p, FILE *fp) { - // on -- for old-to-new index; no -- for new-to-old index - on.clear(); on.resize(gr->GetPntNum(),-1); no.clear(); - register size_t i,j; - for(i=0;iGetPntNum();i++) // collect data for groups - // it is rather expensive (extra 4b per primitive) but need for export to 3D + mreal f = q.p/2, dx=p.u/2, dy=p.v/2, x,y; + mreal c=q.s*cos(q.w*M_PI/180), s=-q.s*sin(q.w*M_PI/180); + double b[4] = {c,-s, s,c}; + long i=q.n1+1, ik,il=0; + + const mglGlyph &g = gr->GetGlf(q.n4); + const mreal dd = 0.004; + if(q.n3&8) { - const mglPnt &q = gr->GetPnt(i); - if(coor) for(j=0;jGetPnt(no[j]); - if(p.x==q.x && p.y==q.y && p.z==q.z) on[i]=j; + fprintf(fp,"f -1/%ld -3/%ld -2/%ld\n",i,i,i); + fprintf(fp,"f -4/%ld -2/%ld -3/%ld\n",i,i,i); } - else for(j=0;jGetPnt(no[j]); - if(p.x==q.x && p.y==q.y && p.z==q.z && p.c==q.c && p.t==q.t) on[i]=j; + fprintf(fp,"l -1/%ld -2/%ld\n",i,i); + fprintf(fp,"l -3/%ld -4/%ld\n",i,i); + fprintf(fp,"l -1/%ld -3/%ld\n",i,i); + fprintf(fp,"l -2/%ld -4/%ld\n",i,i); } - if(on[j]<0) { no.push_back(i); on[j]=no.size()-1; } } -}*/ + else + { + if(!(q.n3&4)) // glyph_fill(p,f,g, d); + { + for(ik=0;ik': - fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y+ss,p.z); - fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y-ss,p.z); - fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z); - fprintf(fp,"l -3/%ld -2/%ld\n", i,i); - fprintf(fp,"l -2/%ld -1/%ld\n", i,i); - fprintf(fp,"l -1/%ld -3/%ld\n", i,i); break; - case 'O': - for(j=0;j<=20;j++) - fprintf(fp,"v %g %g %g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z); - for(j=0;j<20;j++) - fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", j-21,i, j-20,i, i,i); - break; - case 'C': fprintf(fp,"p %ld\n", i); - case 'o': - for(j=0;j<=20;j++) - fprintf(fp,"v %g %g %g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z); - for(j=0;j<20;j++) - fprintf(fp,"l %ld/%ld %ld/%ld\n", j-21,i, j-20,i); - break; - } + case 0: + if(!strchr("xsSoO",type)) ss *= 1.1; + if(type=='.' || ss==0) fprintf(fp,"p %ld\n", i); + else switch(type) + { + case 'P': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z); + fprintf(fp,"l -4/%ld -3/%ld\n", i,i); + fprintf(fp,"l -3/%ld -2/%ld\n", i,i); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"l -1/%ld -4/%ld\n", i,i); + case '+': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z); + fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z); + fprintf(fp,"l -4/%ld -3/%ld\n", i,i); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); break; + case 'X': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z); + fprintf(fp,"l -4/%ld -3/%ld\n", i,i); + fprintf(fp,"l -3/%ld -2/%ld\n", i,i); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"l -1/%ld -4/%ld\n", i,i); + fprintf(fp,"l -1/%ld -3/%ld\n", i,i); + fprintf(fp,"l -2/%ld -4/%ld\n", i,i); break; + case 'x': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z); + fprintf(fp,"l -1/%ld -3/%ld\n", i,i); + fprintf(fp,"l -2/%ld -4/%ld\n", i,i); break; + case 'S': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z); + fprintf(fp,"f -4/%ld -3/%ld -2/%ld -1/%ld\n",i,i,i,i); break; + case 's': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss,p.z); + fprintf(fp,"l -4/%ld -3/%ld\n", i,i); + fprintf(fp,"l -3/%ld -2/%ld\n", i,i); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"l -1/%ld -4/%ld\n", i,i); break; + case 'D': + fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z); + fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z); + fprintf(fp,"f -4/%ld -3/%ld -2/%ld -1/%ld\n",i,i,i,i); break; + case 'd': + fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z); + fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z); + fprintf(fp,"l -4/%ld -3/%ld\n", i,i); + fprintf(fp,"l -3/%ld -2/%ld\n", i,i); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"l -1/%ld -4/%ld\n", i,i); break; + case 'Y': + fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+0.8*ss,p.y+0.6*ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-0.8*ss,p.y+0.6*ss,p.z); + fprintf(fp,"l -3/%ld %ld/%ld\n", i,i,i); + fprintf(fp,"l -2/%ld %ld/%ld\n", i,i,i); + fprintf(fp,"l -1/%ld %ld/%ld\n", i,i,i); break; + case '*': + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"v %g %g %g\n",p.x+0.6*ss,p.y+0.8*ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-0.6*ss,p.y-0.8*ss,p.z); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"v %g %g %g\n",p.x+0.6*ss,p.y-0.8*ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-0.6*ss,p.y+0.8*ss,p.z); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); break; + case 'T': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss/2,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss/2,p.z); + fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z); + fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i); break; + case '^': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y-ss/2,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y-ss/2,p.z); + fprintf(fp,"v %g %g %g\n",p.x,p.y+ss,p.z); + fprintf(fp,"l -3/%ld -2/%ld\n", i,i); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"l -1/%ld -3/%ld\n", i,i); break; + case 'V': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss/2,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss/2,p.z); + fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z); + fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i); break; + case 'v': + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y+ss/2,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y+ss/2,p.z); + fprintf(fp,"v %g %g %g\n",p.x,p.y-ss,p.z); + fprintf(fp,"l -3/%ld -2/%ld\n", i,i); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"l -1/%ld -3/%ld\n", i,i); break; + case 'L': + fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z); + fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i); break; + case '<': + fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss/2,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss,p.y,p.z); + fprintf(fp,"l -3/%ld -2/%ld\n", i,i); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"l -1/%ld -3/%ld\n", i,i); break; + case 'R': + fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z); + fprintf(fp,"f -3/%ld -2/%ld -1/%ld\n", i,i,i); break; + case '>': + fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y+ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x-ss/2,p.y-ss,p.z); + fprintf(fp,"v %g %g %g\n",p.x+ss,p.y,p.z); + fprintf(fp,"l -3/%ld -2/%ld\n", i,i); + fprintf(fp,"l -2/%ld -1/%ld\n", i,i); + fprintf(fp,"l -1/%ld -3/%ld\n", i,i); break; + case 'O': + for(j=0;j<=20;j++) + fprintf(fp,"v %g %g %g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z); + for(j=0;j<20;j++) + fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", j-21,i, j-20,i, i,i); break; - case 1: fprintf(fp,"l %ld/%ld %ld/%ld\n", n1,n1, n2,n2); break; - case 2: - fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", n1,n1, n2,n2, n3,n3); break; - case 3: - fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", n1,n1, n2,n2, n3,n3); - fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", n2,n2, n4,n4, n3,n3); break; - case 4: break; // TODO: add glyphs export later + case 'C': fprintf(fp,"p %ld\n", i); + case 'o': + for(j=0;j<=20;j++) + fprintf(fp,"v %g %g %g\n",p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z); + for(j=0;j<20;j++) + fprintf(fp,"l %ld/%ld %ld/%ld\n", j-21,i, j-20,i); + break; + } + break; + case 1: fprintf(fp,"l %ld/%ld %ld/%ld\n", n1,n1, n2,n2); break; + case 2: fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", n1,n1, n2,n2, n3,n3); break; + case 3: fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", n1,n1, n2,n2, n3,n3); + fprintf(fp,"f %ld/%ld %ld/%ld %ld/%ld\n", n2,n2, n4,n4, n3,n3); break; + case 4: mgl_obj_glyph_old(gr,q,p,fp); break; } } //----------------------------------------------------------------------------- -void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png) +void mgl_write_obj_old(HMGL gr, const char *fname,const char *descr, int use_png) { - if(gr->GetPrmNum()<=0) return; // nothing to do + if(gr->GetPrmNum()==0) return; // nothing to do register size_t i,j; long m1=0,m2=0,m; for(i=0;iGrp.size();i++) // prepare array of indirect indexing @@ -253,7 +298,7 @@ void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png) } delete []ng; - unsigned len=strlen(fname),ntxt=gr->GetTxtNum(); + size_t len=strlen(fname),ntxt=gr->GetTxtNum(); char *tname = new char[len+5]; strcpy(tname,fname); FILE *fp=fopen(fname,"wt"); // vertices definition @@ -275,18 +320,11 @@ void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png) for(j=0;jGetPrm(p[j]); - mgl_obj_prim(q, gr->GetPnt(q.n1), fp, q.s*gr->FontFactor()); + mgl_obj_prim_old(gr, q, gr->GetPnt(q.n1), fp, q.s*gr->FontFactor()); } gr->Grp[i].p.clear(); // we don't need indexes anymore } // try to save "ungrouped" primitives -/* fprintf(fp,"g ungrouped\n"); // I think this can be omitted - for(i=0;iGetPrmNum();i++) - { - const mglPrim q=gr->GetPrm(p[j]); m = q.id-m1; - if(m<0 || m>=m2-m1+1) - mgl_obj_prim(q, gr->GetPnt(q.n1), fp, q.s*gr->FontFactor()); - }*/ fclose(fp); // prepare MTL file tname[len-4]='.'; tname[len-3]='m'; tname[len-2]='t'; tname[len-1]='l'; @@ -312,14 +350,14 @@ void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png) else mgl_tga_save(tname,256,256*j,pbuf); free(pbuf); delete []buf; delete []tname; } -void mgl_write_obj_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int l,int n) +void mgl_write_obj_old_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; char *d=new char[n+1]; memcpy(d,descr,n); d[n]=0; - mgl_write_obj(_GR_,s,d,*use_png); delete []s; delete []d; } + mgl_write_obj_old(_GR_,s,d,*use_png); delete []s; delete []d; } //----------------------------------------------------------------------------- void mgl_write_stl(HMGL gr, const char *fname,const char *descr) { - if(gr->GetPrmNum()<=0) return; // nothing to do + if(gr->GetPrmNum()==0) return; // nothing to do FILE *fp = fopen(fname,"wt"); fprintf(fp,"solid %s\n",(descr && *descr)?descr:"mathgl"); register long i; @@ -369,7 +407,7 @@ void mgl_write_stl_(uintptr_t *gr, const char *fname,const char *descr,int l,int //----------------------------------------------------------------------------- void mgl_write_xyz(HMGL gr, const char *fname,const char *descr) { - if(gr->GetPrmNum()<=0) return; // nothing to do + if(gr->GetPrmNum()==0) return; // nothing to do register long i; FILE *fp=fopen(fname,"wt"), *ff; // vertices definition @@ -383,7 +421,7 @@ void mgl_write_xyz(HMGL gr, const char *fname,const char *descr) fclose(fp); // primitive definition - unsigned len=strlen(fname); + size_t len=strlen(fname); char *tname = new char[len+2]; strcpy(tname,fname); tname[len+1]=tname[len]=0; tname[len]='l'; fp = fopen(tname,"wt"); tname[len]='f'; ff = fopen(tname,"wt"); @@ -446,12 +484,16 @@ void mgl_write_off(HMGL gr, const char *fname,const char *descr, int colored) if(q.type==2) { const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3); - fprintf(fp,"3 %ld %ld %ld %.2g %.2g %.2g %.2g\n",q.n1,q.n2,q.n3, (p1.r+p2.r+p3.r)/3, (p1.g+p2.g+p3.g)/3, (p1.b+p2.b+p3.b)/3, (p1.a+p2.a+p3.a)/3); + if(p1.a>mgl_min_a || p2.a>mgl_min_a || p3.a>mgl_min_a) + fprintf(fp,"3 %ld %ld %ld %.2g %.2g %.2g %.2g\n",q.n1,q.n2,q.n3, + (p1.r+p2.r+p3.r)/3, (p1.g+p2.g+p3.g)/3, (p1.b+p2.b+p3.b)/3, (p1.a+p2.a+p3.a)/3); } if(q.type==3) { const mglPnt &p2=gr->GetPnt(q.n2), &p3=gr->GetPnt(q.n3), &p4=gr->GetPnt(q.n4); - fprintf(fp,"4 %ld %ld %ld %ld %.2g %.2g %.2g %.2g\n",q.n1,q.n2,q.n4,q.n3, (p1.r+p2.r+p3.r+p4.r)/4, (p1.g+p2.g+p3.g+p4.g)/4, (p1.b+p2.b+p3.b+p4.b)/4, (p1.a+p2.a+p3.a+p4.a)/4); + if(p1.a>mgl_min_a || p2.a>mgl_min_a || p3.a>mgl_min_a || p4.a>mgl_min_a) + fprintf(fp,"4 %ld %ld %ld %ld %.2g %.2g %.2g %.2g\n",q.n1,q.n2,q.n4,q.n3, + (p1.r+p2.r+p3.r+p4.r)/4, (p1.g+p2.g+p3.g+p4.g)/4, (p1.b+p2.b+p3.b+p4.b)/4, (p1.a+p2.a+p3.a+p4.a)/4); } } } @@ -469,25 +511,92 @@ void mgl_write_idtf_(uintptr_t *gr, const char *fname,const char *descr,int l,in char *f=new char[n+1]; memcpy(f,descr,n); f[n]=0; mgl_write_idtf(_GR_,s,f); delete []s; delete []f; } //----------------------------------------------------------------------------- -/*struct mglPrim +bool mglCanvas::WriteJSON(const char *fname) { - // NOTE: n4 is used as mark; n3 -- as pen style for type=0,1,4 - // NOTE: n3 is used as position of txt,font in Ptxt for type=6 - long n1,n2,n3,n4; ///< coordinates of corners - int type; ///< primitive type (0-point, 1-line, 2-trig, 3-quad, 4-glyph, 6-text) - int id; ///< object id - mreal z; ///< z-position - mreal s; ///< size (if applicable) or fscl - mreal w; ///< width (if applicable) or ftet - mreal p; -};*/ + bool fl = strcmp(fname,"-"); + FILE *fp = fl ? fopen(fname, "wb") : stdout; + if (!fp) return true; + ClearUnused(); // clear unused points + size_t i,l=Pnt.size(); + fprintf(fp,"{\n\"width\":%d,\t\"height\":%d,\t\"depth\":%d,\t\"plotid\":\"%s\",\t\"npnts\":%lu,\t\"pnts\":[\n", + Width, Height, Depth, PlotId.c_str(), (unsigned long)l); + for(i=0;i xy; // vector for glyphs coordinates (to be separated from pnts) + for(i=0;in2) { n1=p.n2; n2=p.n1; } + if(c.a==1 || p.type==0 || p.type==1 || p.type==4 || p.type==6) + fprintf(fp,"[%d,%ld,%ld,%ld,%ld,%d,%.4g,%.4g,%.4g,%.4g,\"#%02x%02x%02x\"]%c\n", + p.type, n1, n2, n3, n4, p.id, p.s, p.w==p.w?p.w:0, p.p==p.p?p.p:0, + 0., int(255*c.r), int(255*c.g), int(255*c.b), i+1WriteJSON(fname); } +void mgl_write_json_(uintptr_t *gr, const char *fname,const char *descr,int l,int n) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + char *f=new char[n+1]; memcpy(f,descr,n); f[n]=0; + mgl_write_json(_GR_,s,f); delete []s; delete []f; } +//----------------------------------------------------------------------------- bool mglCanvas::ExportMGLD(const char *fname, const char *descr) { if(Pnt.size()<1 || Prm.size()<1) return true; FILE *fp=fopen(fname,"wt"); if(!fp) return true; // NOTE: I'll save Ptx. So prim type=6 is useless,and no LaTeX - fprintf(fp,"MGLD %lu %lu %lu\n# %s\n", (unsigned long)Pnt.size(), (unsigned long)Prm.size(), (unsigned long)Txt.size(), (descr && *descr) ? descr : fname); + fprintf(fp,"MGLD %lu %lu %lu %lu %d %d\n# %s\n", (unsigned long)Pnt.size(), (unsigned long)Prm.size(), (unsigned long)Txt.size(), (unsigned long)Glf.size(), Width, Height, (descr && *descr) ? descr : fname); register size_t i; fprintf(fp,"# Vertexes: x y z c t ta u v w r g b a\n"); for(i=0;i=0?q.n1+npnt:-1; q.n2 = q.n2>=0?q.n2+npnt:-1; if(q.type==2 || q.type==3) - { - q.n3 = q.n3>=0?q.n3+npnt:-1; - q.n4 = q.n4>=0?q.n4+npnt:-1; - } + { q.n3 = q.n3>=0?q.n3+npnt:-1; q.n4 = q.n4>=0?q.n4+npnt:-1; } + if(q.type==4) + { q.n4 = q.n4>=0?q.n4+nglf:-1; q.s *= font_factor/(w\n%s\n", (descr && *descr)?descr:fname); fprintf(fp,"%g, %g, %g\n", BDef[0]/255., BDef[1]/255., BDef[2]/255.); fprintf(fp,"\n%g, %g, %g\n",AmbBr, AmbBr, AmbBr); - register unsigned long i,j; + register size_t i,j; if(get(MGL_ENABLE_LIGHT)) for(i=0;i<10;i++) if(light[i].n && mgl_isnan(light[i].r.x)) { @@ -973,7 +1125,7 @@ void mgl_write_x3d(HMGL gr, const char *fname,const char *descr) // 2. now find group for primitives long m1=0,m2=0,m; - register unsigned long i,j; + register size_t i,j; for(i=0;iGrp.size();i++) // prepare array of indirect indexing { m = gr->Grp[i].Id; if(mm2) m2=m; } long *ng = new long[m2-m1+1]; diff --git a/src/fit.cpp b/src/fit.cpp index 9223b67..cf2f494 100644 --- a/src/fit.cpp +++ b/src/fit.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * fit.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -31,7 +31,7 @@ int mglFitPnts=100; ///< Number of output points in fitting char mglFitRes[1024]; ///< Last fitted formula //----------------------------------------------------------------------------- -void mgl_puts_fit(HMGL gr, mreal x, mreal y, mreal z, const char *pre, const char *font, mreal size) +void mgl_puts_fit(HMGL gr, double x, double y, double z, const char *pre, const char *font, double size) { long n = strlen(mglFitRes)+(pre?strlen(pre):0)+1; char *buf = new char[n]; @@ -234,6 +234,8 @@ HMDT mgl_fit_xys(HMGL gr, HCDT xx, HCDT yy, HCDT ss, const char *eq, const char { gr->SetWarn(mglWarnLow,"Fit[S]"); return fit; } if(ss->GetNx()*ss->GetNy()*ss->GetNz() != m*yy->GetNy()*yy->GetNz()) { gr->SetWarn(mglWarnDim,"Fit[S]"); return fit; } + if(!var || *var==0) + { gr->SetWarn(mglWarnNull,"Fit[S]"); return fit; } if(nnSetWarn(mglWarnDim,"Fit[S]"); return fit; } if(m<2|| n<2) { gr->SetWarn(mglWarnLow,"Fit[S]"); return fit; } - + if(!var || *var==0) + { gr->SetWarn(mglWarnNull,"Fit[S]"); return fit; } + if(nnGetNx()*xx->GetNy()*xx->GetNz()==i && yy->GetNx()*yy->GetNy()*yy->GetNz()==i && zz->GetNx()*zz->GetNy()*zz->GetNz()==i; if(!(both || (xx->GetNx()==m && yy->GetNx()==n && zz->GetNx()==l))) { gr->SetWarn(mglWarnDim,"Fit[S]"); return fit; } - + if(!var || *var==0) + { gr->SetWarn(mglWarnNull,"Fit[S]"); return fit; } + if(nn * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -34,19 +34,18 @@ extern unsigned mgl_numg, mgl_cur; extern float mgl_fact; extern long mgl_gen_fnt[516][6]; extern short mgl_buf_fnt[246080]; -const float mgl_fgen = 4*14; extern mglTeXsymb mgl_tex_symb[]; +//mglFont mglDefFont("nofont"); mglFont mglDefFont; //----------------------------------------------------------------------------- char mglGetStyle(const char *how, int *font, int *align) { - const char *cols = MGL_COLORS; char col=0; if(align) *align = 1; // centering text by default if(!how || *how==0) return col; // NOTE: no brightness for text color for(;*how && *how!=':';how++) - if(strchr(cols,*how)) col=*how; + if(strchr(MGL_COLORS,*how)) col=*how; if(align) { *align = 1; @@ -71,7 +70,7 @@ float mglFont::Puts(const char *str,const char *how,float col) const { int font=0, align=1; char cc=mglGetStyle(how,&font,&align); - unsigned size = strlen(str)+1; + size_t size = strlen(str)+1; wchar_t *wcs = new wchar_t[size]; mbstowcs(wcs,str,size); float w = Puts(wcs,font,align,cc?-cc:col); @@ -83,7 +82,7 @@ float mglFont::Width(const char *str,const char *how) const { int font=0; mglGetStyle(how,&font); - unsigned size = strlen(str)+1; + size_t size = strlen(str)+1; wchar_t *wcs = new wchar_t[size]; mbstowcs(wcs,str,size); float w = Width(wcs,font); @@ -115,11 +114,20 @@ float mglFont::Puts(const wchar_t *str,int font,int align, float col) const unsigned *wcs = new unsigned[size], *buf=wcs; memcpy(wcs,str,size*sizeof(wchar_t)); Convert(str, wcs); - for(i=0;wcs[i];i++) if(wcs[i]=='\n') // parse '\n' symbol + for(i=0;wcs[i];i++) { - wcs[i]=0; w = Puts(buf,0,0,1.f,0x10|font,col); // find width - Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,col); // draw it really - buf=wcs+i+1; num++; if(w>ww) ww=w; + if(wcs[i]=='\n') // parse '\n' symbol + { + wcs[i]=0; w = Puts(buf,0,0,1.f,0x10|font,col); // find width + Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,col); // draw it really + buf=wcs+i+1; num++; if(w>ww) ww=w; + } + if(wcs[i]=='\\' && wcs[i+1]=='n' && (wcs[i+2]>' ' || wcschr(L"{}[]()!@#$%^&*/-?.,_=+\\\"", wcs[i+2]))) // parse '\n' symbol + { + wcs[i]=0; w = Puts(buf,0,0,1.f,0x10|font,col); // find width + Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,col); // draw it really + buf=wcs+i+2; num++; if(w>ww) ww=w; + } } // draw string itself w = Puts(buf,0,0,1.f,0x10|font,col); // find width @@ -158,7 +166,7 @@ float mglFont::Width(const wchar_t *str,int font) const { if(numg==0 || !str || *str==0) return 0; float ww=0,w=0; - unsigned size = wcslen(str)+1,i; + size_t size = wcslen(str)+1,i; if(parse) { unsigned *wcs = new unsigned[size], *buf=wcs; @@ -166,11 +174,11 @@ float mglFont::Width(const wchar_t *str,int font) const Convert(str, wcs); for(i=0;wcs[i];i++) if(wcs[i]=='\n') // parse '\n' symbol { - wcs[i]=0; w = Puts(buf,0,0,1.,0x10+font,'k'); // find width + wcs[i]=0; w = Puts(buf,0,0,1.,0x10|font,'k'); // find width buf=wcs+i+1; if(w>ww) ww=w; } - w = Puts(buf,0,0,1.,0x10+font,'k'); - if(w>ww) ww=w; + w = Puts(buf,0,0,1.,0x10|font,'k'); + if(w * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include "mgl2/canvas.h" +#include "mgl2/canvas_cf.h" +#undef _GR_ +#define _GR_ ((mglCanvas *)(*gr)) +#define _Gr_ ((mglCanvas *)(gr)) +int mgl_tga_save(const char *fname, int w, int h, unsigned char **p); +int mgl_pnga_save(const char *fname, int w, int h, unsigned char **p); +void mgl_printf(void *fp, bool gz, const char *str, ...); +//----------------------------------------------------------------------------- +#include +#include +#include +#include + +#include +#include +#include +#include +#ifdef __GNUC__ +#include +#endif +#include +#include + +/* Size prefixes for printf/scanf for size_t and ptrdiff_t */ +#ifdef _MSC_VER +# define PRIuS "Iu" /* printf size_t */ +# define PRIdS "Id" /* printf ptrdiff_t */ +#else +# define PRIuS "zu" /* printf size_t */ +# define PRIdS "zd" /* printf ptrdiff_t */ +#endif + +//----------------------------------------------------------------------------- +void mglTexture::GetRGBAOBJ(unsigned char *f) const +{ + const size_t bw = 128; //border width + register size_t i,j,i0; + mglColor c1,c2,c; + for(i=0;i<256;i++) + { + c1 = col[2*i]; c2 = col[2*i+1]; + for(j=0;j<512;j++) + { + i0 = 4*(j+512*(255-i)); + if (j511-bw) + c = c2; + else + c = c1 + (c2-c1)*((j-bw)/(255.)); + f[i0] = int(255*c.r); + f[i0+1] = int(255*c.g); + f[i0+2] = int(255*c.b); + f[i0+3] = int(255*c.a); + } + } + +} + +//----------------------------------------------------------------------------- + +struct ObjUV +{ + ObjUV() : + u(0.0), v(0.0) {} + ObjUV(mreal U, mreal V) : + u(U), v(V) {} + mreal u; + mreal v; + + void Set(mreal U, mreal V) + { u = U; v = V; } + + bool operator==(const ObjUV &c) const + { + return u==c.u && v==c.v; + } + bool operator!=(const ObjUV &c) const + { + return !(u==c.u && v==c.v); + } + bool operator<(const ObjUV &c) const + { + if(u!=c.u) + return (u texturecoords; + FILE* const fp; + ObjUVs(FILE *f) : fp(f) {} + + size_t addTextureCoords(mreal ta, mreal c, size_t ntxt) + { + const mreal gap = 1./512; + const mreal u = 0.25+0.5*(ta*(1-2*gap)+gap); + const mreal v = ((c-floor(c))*(1-2*gap) + gap + floor(c))/ntxt; + + const ObjUV point(u, v); + std::map::iterator pPoint = texturecoords.find(point); + if(pPoint!=texturecoords.end()) + return pPoint->second; + else + { + const size_t point_index = texturecoords.size()+1; + texturecoords.insert(std::make_pair(point,point_index)); + fprintf(fp,"vt %.15g %.15g\n",u,v); + + return point_index; + } + } + +}; + + +class ObjXYZ +{ + public : + mreal x; + mreal y; + mreal z; + ObjXYZ() : + x(0), y(0), z(0) {} + ObjXYZ(mreal fx, mreal fy, mreal fz) : + x(fx), y(fy), z(fz) {} + + void Set(mreal fx, mreal fy, mreal fz) + { x = fx; y = fy; z = fz; } + mreal Dot(const ObjXYZ & sPt) const + { return(x*sPt.x)+(y*sPt.y)+(z*sPt.z); } + mreal LengthSquared() + { return(x*x+y*y+z*z); } + + friend ObjXYZ operator + (const ObjXYZ& a, const ObjXYZ& b) + { return ObjXYZ(a.x+b.x,a.y+b.y,a.z+b.z); } + friend ObjXYZ operator - (const ObjXYZ& a) + { return ObjXYZ(-a.x,-a.y,-a.z); } + friend ObjXYZ operator - (const ObjXYZ& a, const ObjXYZ& b) + { return ObjXYZ(a.x-b.x,a.y-b.y,a.z-b.z); } + friend ObjXYZ operator * (const ObjXYZ& a, const mreal d) + { return ObjXYZ(a.x*d,a.y*d,a.z*d); } + friend ObjXYZ operator * (const mreal d, const ObjXYZ& a) + { return ObjXYZ(a.x*d,a.y*d,a.z*d); } + friend ObjXYZ operator / (const ObjXYZ& a, const mreal d) + { return ObjXYZ(a.x/d,a.y/d,a.z/d); } + friend ObjXYZ operator * (const ObjXYZ& a, const ObjXYZ& b) + { return ObjXYZ((a.y*b.z)-(a.z*b.y), (a.z*b.x)-(a.x*b.z), (a.x*b.y)-(a.y*b.x)); } + + mreal Length() + { + return sqrt(x*x+y*y+z*z); + } + + bool Normalize() + { + mreal fLength=Length(); + if(fLength < FLT_EPSILON) return false; + mreal factor=1.0/fLength; + x *= factor; + y *= factor; + z *= factor; + return true; + } + + bool operator==(const ObjXYZ &v) const + { + return x==v.x && y==v.y && z==v.z; + } + bool operator!=(const ObjXYZ &v) const + { + return !(x==v.x && y==v.y && z==v.z); + } + bool operator<(const ObjXYZ &v) const + { + if(x!=v.x) + return (x vertexcoords; + FILE* const fp; + ObjXYZs(FILE *f) : fp(f) {} + + size_t addVertexCoords(mreal x, mreal y, mreal z) + { + const ObjXYZ point(x,y,z); + + std::map::iterator pPoint = vertexcoords.find(point); + if(pPoint!=vertexcoords.end()) + return pPoint->second; + else + { + const size_t point_index = vertexcoords.size()+1; + vertexcoords.insert(std::make_pair(point,point_index)); + fprintf(fp,"v %.15g %.15g %.15g\n",x,y,z); + + return point_index; + } + } + +}; + +struct ObjTriangle { + size_t p1, p2, p3; + size_t t1, t2, t3; + ObjTriangle() : + p1(0), p2(0), p3(0), t1(0), t2(0), t3(0) {} + ObjTriangle(size_t P1, size_t T1, size_t P2, size_t T2, size_t P3, size_t T3) : + p1(P1), p2(P2), p3(P3), t1(T1), t2(T2), t3(T3) {} +}; + +struct ObjLine { + size_t p1, p2; + ObjLine() : + p1(0), p2(0) {} + ObjLine(size_t P1, size_t P2) : + p1(P1), p2(P2) {} +}; + +struct ObjGroup { + std::deque triangles; + mglColor commoncolor; + bool samecolor; + std::map > lines; + std::map > points; + FILE* const fp; + ObjXYZs &vertexcoords; + ObjGroup(FILE *f,ObjXYZs& v) : commoncolor(NC), samecolor(true), fp(f), vertexcoords(v) {} + +// const HMGL gr; + +// ObjGroup(const HMGL g) : samecolor(true), gr(g) {} + + void addSegment(size_t m, size_t p1, size_t p2) + { + lines[m].push_back(ObjLine(p1,p2)); + } + void addLines(size_t m, size_t n, const size_t* p) + { + for (size_t i=0; i >::const_iterator pm = lines.begin(); pm != lines.end(); pm++) + { + fprintf(fp,"usemtl Material%"PRIuS"\n", pm->first); + for(std::deque::const_iterator pl = pm->second.begin(); pl != pm->second.end(); pl++) + fprintf(fp,"l %"PRIuS" %"PRIuS"\n", pl->p1, pl->p2); + } + } + void writePoints() { + for(std::map >::const_iterator pm = points.begin(); pm != points.end(); pm++) + { + fprintf(fp,"usemtl Material%"PRIuS"\n", pm->first); + for(std::deque::const_iterator pp = pm->second.begin(); pp != pm->second.end(); pp++) + fprintf(fp,"p %"PRIuS"\n", *pp); + } + } + void writeTriangles() { + for(std::deque::const_iterator pt = triangles.begin(); pt != triangles.end(); pt++) + fprintf(fp,"f %"PRIuS" %"PRIuS" %"PRIuS"\n", pt->p1, pt->p2, pt->p3); + } + void writeTexturedTriangles() { + for(std::deque::const_iterator pt = triangles.begin(); pt != triangles.end(); pt++) + fprintf(fp,"f %"PRIuS"/%"PRIuS" %"PRIuS"/%"PRIuS" %"PRIuS"/%"PRIuS"\n", pt->p1,pt->t1, pt->p2,pt->t2, pt->p3,pt->t3); + } +}; + +struct lt_mglColor +{ + bool operator()(const mglColor& c1, const mglColor& c2) const + { + if(c1.r!=c2.r) + return (c1.r colormap; + + +struct ObjMaterials { + colormap materialmap; + FILE* const fp; + ObjMaterials(FILE *f) : fp(f) {} + + size_t addColor(const mglColor& color) + { + colormap::iterator pc = materialmap.find(color); + if(pc!=materialmap.end()) + return pc->second; + else + { + const size_t color_index = materialmap.size(); + materialmap.insert(std::make_pair(color,color_index)); + fprintf(fp,"newmtl Material%"PRIuS"\n", color_index); + fprintf(fp,"Ka 0.1 0.1 0.1\n"); + fprintf(fp,"Kd %g %g %g\n", color.r, color.g, color.b); + fprintf(fp,"Ks 0.0 0.0 0.0\n"); + fprintf(fp,"d %g\nillum 2\nNs 15.0\n",color.a); + + return color_index; + } + } + size_t addColor(mreal r, mreal g, mreal b, mreal a) + { + const mglColor color(r,g,b,a); + return addColor(color); + } + size_t addColorInfo(const mglPnt& p) + { + return addColor(p.r,p.g,p.b,p.a); + } +}; + + +static size_t power_of_two(size_t input) +{ + size_t value = 1; + while ( value < input ) { + value <<= 1; + } + return value; +} + + +void mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png) +{ + if(gr->GetPrmNum()==0) return; // nothing to do + + register size_t i,j; + { + long mmin=0,mmax=0,m; + for(i=0;iGrp.size();i++) // prepare array of indirect indexing + { m = gr->Grp[i].Id; if(mmmax) mmax=m; } + long *ng = new long[mmax-mmin+1]; + for(i=0;iGrp.size();i++) ng[gr->Grp[i].Id-mmin] = i; + for(i=0;iGetPrmNum());i++) // collect data for groups + // it is rather expensive (extra 4b per primitive) but need for export to 3D + { + m = gr->GetPrm(i).id-mmin; + if(m>=0 && mGrp[ng[m]].p.push_back(i); + } + delete []ng; + } + + const size_t len=strlen(fname); + const size_t ntxt=gr->GetTxtNum(); + const size_t Ntxt=power_of_two(ntxt); + const size_t pntnum = gr->GetPntNum(); + char *tname = new char[len+5]; strcpy(tname,fname); + FILE *fp=fopen(fname,"wt"); + ObjXYZs vertexcoords(fp); + std::vector vcs(pntnum); // vertex coord ids + ObjUVs texturecoords(fp); + std::vector tcs(pntnum); // texture coord ids + + // center point + mglPnt p0; + const mreal width = dynamic_cast(gr)->GetWidth(); + const mreal height = dynamic_cast(gr)->GetHeight(); + const mreal depth = sqrt(width*height); + + p0.x = width/2.; + p0.y = height/2.; + p0.z = (1.f-sqrt(width*height)/(2*depth))*depth; + + // vertices definition + fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname); + for(i=0;iGetPnt(i); + vcs[i] = vertexcoords.addVertexCoords(pp.x-p0.x, pp.y-p0.y, pp.z-p0.z); + tcs[i] = texturecoords.addTextureCoords(pp.ta, pp.c, Ntxt); + } + + // prepare MTL file + tname[len-4]='.'; tname[len-3]='m'; tname[len-2]='t'; tname[len-1]='l'; + FILE *fpmat=fopen(tname,"wt"); + tname[len-4]='\0'; + fprintf(fpmat,"newmtl Material\n"); + fprintf(fpmat,"Ka 0.0 0.0 0.0\n"); + fprintf(fpmat,"Kd 1.0 1.0 1.0\n"); + fprintf(fpmat,"Ks 0.0 0.0 0.0\n"); + fprintf(fpmat,"d 1.0\nillum 2\n"); + if(use_png) + fprintf(fpmat,"map_Kd %s_txt.png\n",tname); + else + fprintf(fpmat,"map_Kd %s_txt.tga\n",tname); + if(use_png) + strcat(tname,"_txt.png"); + else + strcat(tname,"_txt.tga"); + // prepare texture file (TGA or PNG) + const size_t txtwidth = 512; + unsigned char *buf = new unsigned char[4*256*txtwidth*Ntxt]; + unsigned char **pbuf= (unsigned char **)malloc(256*Ntxt*sizeof(unsigned char *)); + for(i=0;i<256*Ntxt;i++) pbuf[i] = buf+4*txtwidth*i; + for(i=0;iGetTxt(i).GetRGBAOBJ(buf+(Ntxt-1-i)*256*txtwidth*4); + for(i=ntxt;iGrp.size();i++) + { + std::vector &p = gr->Grp[i].p; + ObjGroup grp(fp, vertexcoords); + for(j=0;jGetPrm(p[j]); + + register long n1=q.n1,n2=q.n2,n3=q.n3,n4=q.n4; + switch(q.type) + { + case 0: + if (gr->GetPnt(q.n1).a > mgl_min_a) { + const mglPnt p = gr->GetPnt(q.n1) - p0; + const mreal size = q.s*gr->FontFactor(); + const char type = q.n4; + mreal ss=size*0.35; + const mglColor c(p.r, p.g, p.b, p.a); + + if(!strchr("xsSoO",type)) ss *= 1.1; + if(type=='.' || ss==0) + { + const size_t m = materials.addColor(c); + grp.addPoint(m, vcs[n1]); + } + else + switch(type) + { + case 'P': + { + const size_t m = materials.addColor(c); + const mreal P[5][3] = + { + { p.x-ss,p.y-ss,p.z }, + { p.x+ss,p.y-ss,p.z }, + { p.x+ss,p.y+ss,p.z }, + { p.x-ss,p.y+ss,p.z }, + { p.x-ss,p.y-ss,p.z } + }; + grp.addLines(m, 5, P); + } + case '+': + { + const size_t m = materials.addColor(c); + const mreal P1[2][3] = + { + { p.x-ss,p.y,p.z }, + { p.x+ss,p.y,p.z } + }; + grp.addLines(m, 2, P1); + const mreal P2[2][3] = + { + { p.x,p.y-ss,p.z }, + { p.x,p.y+ss,p.z } + }; + grp.addLines(m, 2, P2); + } + break; + case 'X': + { + const size_t m = materials.addColor(c); + const mreal P[5][3] = + { + { p.x-ss,p.y-ss,p.z }, + { p.x+ss,p.y-ss,p.z }, + { p.x+ss,p.y+ss,p.z }, + { p.x-ss,p.y+ss,p.z }, + { p.x-ss,p.y-ss,p.z } + }; + grp.addLines(m, 5, P); + const mreal P1[2][3] = + { + { p.x-ss,p.y-ss,p.z }, + { p.x+ss,p.y+ss,p.z } + }; + grp.addLines(m, 2, P1); + const mreal P2[2][3] = + { + { p.x+ss,p.y-ss,p.z }, + { p.x-ss,p.y+ss,p.z } + }; + grp.addLines(m, 2, P2); + } + break; + case 'x': + { + const size_t m = materials.addColor(c); + const mreal P1[2][3] = + { + { p.x-ss,p.y-ss,p.z }, + { p.x+ss,p.y+ss,p.z } + }; + grp.addLines(m, 2, P1); + const mreal P2[2][3] = + { + { p.x+ss,p.y-ss,p.z }, + { p.x-ss,p.y+ss,p.z } + }; + grp.addLines(m, 2, P2); + } + break; + case 'S': + { + const size_t ti = tcs[n1]; grp.addColourInfo(p); + + const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss,p.y-ss,p.z); + const size_t pi2 = vertexcoords.addVertexCoords(p.x+ss,p.y-ss,p.z); + const size_t pi3 = vertexcoords.addVertexCoords(p.x-ss,p.y+ss,p.z); + const size_t pi4 = vertexcoords.addVertexCoords(p.x+ss,p.y+ss,p.z); + + grp.addTriangle(pi1, ti, pi2, ti, pi3, ti); + grp.addTriangle(pi4, ti, pi3, ti, pi2, ti); + } + break; + case 's': + { + const size_t m = materials.addColor(c); + const mreal P[5][3] = + { + { p.x-ss,p.y-ss,p.z }, + { p.x+ss,p.y-ss,p.z }, + { p.x+ss,p.y+ss,p.z }, + { p.x-ss,p.y+ss,p.z }, + { p.x-ss,p.y-ss,p.z } + }; + grp.addLines(m, 5, P); + } + break; + case 'D': + { + const size_t ti = tcs[n1]; grp.addColourInfo(p); + + const size_t pi1 = vertexcoords.addVertexCoords(p.x,p.y-ss,p.z); + const size_t pi2 = vertexcoords.addVertexCoords(p.x+ss,p.y,p.z); + const size_t pi3 = vertexcoords.addVertexCoords(p.x-ss,p.y,p.z); + const size_t pi4 = vertexcoords.addVertexCoords(p.x,p.y+ss,p.z); + + grp.addTriangle(pi1, ti, pi2, ti, pi3, ti); + grp.addTriangle(pi4, ti, pi3, ti, pi2, ti); + } + break; + case 'd': + { + const size_t m = materials.addColor(c); + const mreal P[5][3] = + { + { p.x,p.y-ss,p.z }, + { p.x+ss,p.y,p.z }, + { p.x,p.y+ss,p.z }, + { p.x-ss,p.y,p.z }, + { p.x,p.y-ss,p.z } + }; + grp.addLines(m, 5, P); + } + break; + case 'Y': + { + const size_t m = materials.addColor(c); + const mreal P1[3][3] = + { + { p.x, p.y-ss, p.z }, + { p.x, p.y, p.z }, + { p.x+0.8*ss,p.y+0.6*ss,p.z } + }; + grp.addLines(m, 3, P1); + const mreal P2[2][3] = + { + { p.x, p.y, p.z }, + { p.x-0.8*ss,p.y+0.6*ss,p.z } + }; + grp.addLines(m, 2, P2); + } + break; + case '*': + { + const size_t m = materials.addColor(c); + const mreal P1[2][3] = + { + { p.x-ss,p.y,p.z }, + { p.x+ss,p.y,p.z } + }; + grp.addLines(m, 2, P1); + const mreal P2[2][3] = + { + { p.x-0.6*ss,p.y-0.8*ss,p.z }, + { p.x+0.6*ss,p.y+0.8*ss,p.z } + }; + grp.addLines(m, 2, P2); + const mreal P3[2][3] = + { + { p.x-0.6*ss,p.y+0.8*ss,p.z }, + { p.x+0.6*ss,p.y-0.8*ss,p.z } + }; + grp.addLines(m, 2, P3); + + } + break; + case 'T': + { + const size_t ti = tcs[n1]; grp.addColourInfo(p); + + const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss,p.y-ss/2,p.z); + const size_t pi2 = vertexcoords.addVertexCoords(p.x+ss,p.y-ss/2,p.z); + const size_t pi3 = vertexcoords.addVertexCoords(p.x,p.y+ss,p.z); + + grp.addTriangle(pi1, ti, pi2, ti, pi3, ti); + } + break; + case '^': + { + const size_t m = materials.addColor(c); + const mreal P[4][3] = + { + { p.x-ss,p.y-ss/2,p.z }, + { p.x+ss,p.y-ss/2,p.z }, + { p.x, p.y+ss, p.z }, + { p.x-ss,p.y-ss/2,p.z } + }; + grp.addLines(m, 4, P); + } + break; + case 'V': + { + const size_t ti = tcs[n1]; grp.addColourInfo(p); + + const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss,p.y+ss/2,p.z); + const size_t pi2 = vertexcoords.addVertexCoords(p.x,p.y-ss,p.z); + const size_t pi3 = vertexcoords.addVertexCoords(p.x+ss,p.y+ss/2,p.z); + + grp.addTriangle(pi1, ti, pi2, ti, pi3, ti); + } + break; + case 'v': + { + const size_t m = materials.addColor(c); + const mreal P[4][3] = + { + { p.x-ss,p.y+ss/2,p.z }, + { p.x+ss,p.y+ss/2,p.z }, + { p.x, p.y-ss, p.z }, + { p.x-ss,p.y+ss/2,p.z } + }; + grp.addLines(m, 4, P); + } + break; + case 'L': + { + const size_t ti = tcs[n1]; grp.addColourInfo(p); + + const size_t pi1 = vertexcoords.addVertexCoords(p.x+ss/2,p.y+ss,p.z); + const size_t pi2 = vertexcoords.addVertexCoords(p.x-ss, p.y, p.z); + const size_t pi3 = vertexcoords.addVertexCoords(p.x+ss/2,p.y-ss,p.z); + + grp.addTriangle(pi1, ti, pi2, ti, pi3, ti); + } + break; + case '<': + { + const size_t m = materials.addColor(c); + const mreal P[4][3] = + { + { p.x+ss/2,p.y+ss,p.z }, + { p.x+ss/2,p.y-ss,p.z }, + { p.x-ss, p.y, p.z }, + { p.x+ss/2,p.y+ss,p.z } + }; + grp.addLines(m, 4, P); + } + break; + case 'R': + { + const size_t ti = tcs[n1]; grp.addColourInfo(p); + + const size_t pi1 = vertexcoords.addVertexCoords(p.x-ss/2,p.y+ss,p.z); + const size_t pi2 = vertexcoords.addVertexCoords(p.x-ss/2,p.y-ss,p.z); + const size_t pi3 = vertexcoords.addVertexCoords(p.x+ss, p.y, p.z); + + grp.addTriangle(pi1, ti, pi2, ti, pi3, ti); + } + break; + case '>': + { + const size_t m = materials.addColor(c); + const mreal P[4][3] = + { + { p.x-ss/2,p.y+ss,p.z }, + { p.x-ss/2,p.y-ss,p.z }, + { p.x+ss, p.y, p.z }, + { p.x-ss/2,p.y+ss,p.z } + }; + grp.addLines(m, 4, P); + } + break; + case 'O': + { + const size_t ti = tcs[n1]; grp.addColourInfo(p); + + const size_t cpi=vertexcoords.addVertexCoords(p.x, p.y, p.z); + size_t pnti[21]; + for(size_t k=0;k<=20;k++) + pnti[k]=vertexcoords.addVertexCoords(p.x+ss*cos(k*M_PI/10),p.y+ss*sin(k*M_PI/10),p.z); + for(size_t k=0;k<=20;k++) { + grp.addTriangle(pnti[k], ti, pnti[k+1], ti, cpi, ti); + } + } + break; + case 'C': + { + const size_t m = materials.addColor(c); + grp.addPoint(m, vcs[n1]); + } + case 'o': + { + const size_t m = materials.addColor(c); + mreal P[21][3]; + for(size_t k=0;k<=20;k++) { + P[k][0] = p.x+ss*cos(k*M_PI/10); + P[k][1] = p.y+ss*sin(k*M_PI/10); + P[k][2] = p.z; + } + grp.addLines(m, 21, P); + } + break; + } + } + break; + case 1: + if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a) { + const mglPnt& p1 = gr->GetPnt(q.n1); + const mglPnt& p2 = gr->GetPnt(q.n2); + const size_t m = materials.addColor((p1.r+p2.r)/2, (p1.g+p2.g)/2, (p1.b+p2.b)/2, (p1.a+p2.a)/2); + grp.addSegment(m, vcs[n1], vcs[n2]); + } + break; + case 2: + if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a || gr->GetPnt(q.n3).a > mgl_min_a) { + grp.addTriangle(vcs[n1],tcs[n1], vcs[n2],tcs[n2], vcs[n3],tcs[n3]); + grp.addColourInfo(gr->GetPnt(n1)); + grp.addColourInfo(gr->GetPnt(n2)); + grp.addColourInfo(gr->GetPnt(n3)); + } + break; + case 3: + if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a || gr->GetPnt(q.n3).a > mgl_min_a || gr->GetPnt(q.n4).a > mgl_min_a) { + grp.addTriangle(vcs[n1],tcs[n1], vcs[n2],tcs[n2], vcs[n3],tcs[n3]); + grp.addTriangle(vcs[n2],tcs[n2], vcs[n4],tcs[n4], vcs[n3],tcs[n3]); + grp.addColourInfo(gr->GetPnt(n1)); + grp.addColourInfo(gr->GetPnt(n2)); + grp.addColourInfo(gr->GetPnt(n3)); + grp.addColourInfo(gr->GetPnt(n4)); + } + break; + case 4: + { + const mglPnt p = gr->GetPnt(q.n1) - p0; + + const mreal f = q.p/2, dx=p.u/2, dy=p.v/2; + const mreal c=q.s*cos(q.w*M_PI/180), s=-q.s*sin(q.w*M_PI/180); + const double b[4] = {c,-s, s,c}; + long ik,il=0; + + const mglGlyph &g = gr->GetGlf(q.n4); + const mreal dd = 0.004; + if(q.n3&8) + { + const size_t p_4 = vertexcoords.addVertexCoords(p.x+b[0]*dx+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z); + const size_t p_3 = vertexcoords.addVertexCoords(p.x+b[0]*dx+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z); + const size_t p_2 = vertexcoords.addVertexCoords(p.x+b[0]*(dx+f)+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z); + const size_t p_1 = vertexcoords.addVertexCoords(p.x+b[0]*(dx+f)+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z); + + if(!(q.n3&4)) // glyph_line(p,f,true, d); + { + const size_t ti = tcs[n1]; grp.addColourInfo(p); + grp.addMonoTriangle(ti, p_1, p_3, p_2); + grp.addMonoTriangle(ti, p_4, p_2, p_3); + } + else // glyph_line(p,f,false, d); + { + const size_t m = materials.addColor(p.r, p.g, p.b, p.a); + grp.addSegment(m, p_1, p_2); + grp.addSegment(m, p_3, p_4); + grp.addSegment(m, p_1, p_3); + grp.addSegment(m, p_2, p_4); + } + } + else + { + if(!(q.n3&4)) // glyph_fill(p,f,g, d); + { + for(ik=0;ikGrp[i].Lbl.c_str()); + + if (!grp.triangles.empty()) { + if (grp.samecolor) { + fprintf(fp,"usemtl Material%"PRIuS"\n", materials.addColor(grp.commoncolor)); + grp.writeTriangles(); + } else { + fprintf(fp,"usemtl Material\n"); + grp.writeTexturedTriangles(); + } + } + grp.writeLines(); + grp.writePoints(); + + gr->Grp[i].p.clear(); // we don't need indexes anymore + } + fclose(fp); + fclose(fpmat); + delete []tname; +} + +void mgl_write_obj_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int l,int n) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]='\0'; + char *d=new char[n+1]; memcpy(d,descr,n); d[n]='\0'; + mgl_write_obj(_GR_,s,d,*use_png); delete []s; delete []d; } +//----------------------------------------------------------------------------- diff --git a/src/opengl.cpp b/src/opengl.cpp index fb233aa..31f78f2 100644 --- a/src/opengl.cpp +++ b/src/opengl.cpp @@ -35,7 +35,7 @@ void mglCanvasGL::Finish(bool fast) int pdef=PDef; mreal ss=pPos, ww=PenWidth; mglPrim p; - for(unsigned long i=0;i * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -27,7 +27,7 @@ // DensX, DensY, DensZ series // //----------------------------------------------------------------------------- -void mgl_dens_x(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_dens_x(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { register long i,j,k,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); @@ -58,7 +58,7 @@ void mgl_dens_x(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); } //----------------------------------------------------------------------------- -void mgl_dens_y(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_dens_y(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { register long i,j,k,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); @@ -89,7 +89,7 @@ void mgl_dens_y(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); } //----------------------------------------------------------------------------- -void mgl_dens_z(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_dens_z(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { register long i,j,k,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); @@ -141,7 +141,7 @@ void mgl_dens_z_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sv, const // //----------------------------------------------------------------------------- void mgl_cont_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z, mreal c, int text,long ak); -void mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { register long i,j,k,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); @@ -151,7 +151,7 @@ void mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const ch static int cgid=1; gr->StartGroup("ContX",cgid++); mglData xx,yy,zz,aa; - bool text=(sch && strchr(sch,'t')); + bool text=(mglchr(sch,'t')); long ss=gr->AddTexture(sch); gr->SetPenPal(sch); @@ -182,7 +182,7 @@ void mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const ch gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { register long i,j,k,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); @@ -192,7 +192,7 @@ void mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const ch static int cgid=1; gr->StartGroup("ContY",cgid++); mglData xx,yy,zz,aa; - bool text=(sch && strchr(sch,'t')); + bool text=(mglchr(sch,'t')); long ss=gr->AddTexture(sch); gr->SetPenPal(sch); @@ -223,7 +223,7 @@ void mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const ch gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { register long i,j,k,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); @@ -233,7 +233,7 @@ void mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const ch static int cgid=1; gr->StartGroup("ContZ",cgid++); mglData xx,yy,zz,aa; - bool text=(sch && strchr(sch,'t')); + bool text=(mglchr(sch,'t')); long ss=gr->AddTexture(sch); gr->SetPenPal(sch); @@ -263,7 +263,7 @@ void mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const ch gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_cont_x(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_cont_x(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { mreal r = gr->SaveState(opt); long Num = (mgl_isnan(r) || r<=0) ? 7:long(r+0.5); @@ -273,7 +273,7 @@ void mgl_cont_x(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_cont_y(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_cont_y(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { mreal r = gr->SaveState(opt); long Num = (mgl_isnan(r) || r<=0) ? 7:long(r+0.5); @@ -283,7 +283,7 @@ void mgl_cont_y(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_cont_z(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_cont_z(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { mreal r = gr->SaveState(opt); long Num = (mgl_isnan(r) || r<=0) ? 7:long(r+0.5); @@ -328,7 +328,7 @@ void mgl_cont_z_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, // //----------------------------------------------------------------------------- void mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT y, HCDT z, mreal c, long ak); -void mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { register long i,j,k,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); @@ -366,7 +366,7 @@ void mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const c gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { register long i,j,k,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); @@ -404,7 +404,7 @@ void mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const c gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_contf_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_contf_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { register long i,j,k,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); @@ -441,7 +441,7 @@ void mgl_contf_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, mreal sv, const c gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_contf_x(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_contf_x(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { mreal r = gr->SaveState(opt); long Num = (mgl_isnan(r) || r<=0) ? 7:long(r+0.5); @@ -450,7 +450,7 @@ void mgl_contf_x(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_contf_y(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_contf_y(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { mreal r = gr->SaveState(opt); long Num = (mgl_isnan(r) || r<=0) ? 7:long(r+0.5); @@ -459,7 +459,7 @@ void mgl_contf_y(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_contf_z(HMGL gr, HCDT a, const char *sch, mreal sv, const char *opt) +void mgl_contf_z(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { mreal r = gr->SaveState(opt); long Num = (mgl_isnan(r) || r<=0) ? 7:long(r+0.5); diff --git a/src/parser.cpp b/src/parser.cpp index 3e8af72..fac8f1e 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * parse.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -43,6 +43,21 @@ mglFunc::mglFunc(long p, const wchar_t *f) if(narg<0 || narg>9) narg=0; } //----------------------------------------------------------------------------- +size_t mglParser::GetParLen() +{ + register size_t i,s=0,t; + for(i=0;i<40;i++) + { t = par[i].length(); s = sd.Create(1,1,1); - a[0].type = 0; a[0].d = &(v->d); + v->Create(1,1,1); + a[0].type = 0; a[0].d = v; a[0].w = var; k[0] = 1; } char *o=0; @@ -133,27 +151,6 @@ int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const w return res; } //----------------------------------------------------------------------------- -void mglVar::MoveAfter(mglVar *var) -{ - if(prev) prev->next = next; - if(next) next->prev = prev; - prev = next = 0; - if(var) - { - prev = var; next = var->next; - var->next = this; - if(func==0) func = var->func; - } - if(next) next->prev = this; -} -//----------------------------------------------------------------------------- -mglVar::~mglVar() -{ - if(func) func(o); - if(prev) prev->next = next; - if(next) next->prev = prev; -} -//----------------------------------------------------------------------------- void mglNum::MoveAfter(mglNum *var) { if(prev) prev->next = next; @@ -172,48 +169,51 @@ mglNum::~mglNum() //----------------------------------------------------------------------------- mglParser::mglParser(bool setsize) { - DataList=0; NumList=0; fn_stack=0; + DataList=0; NumList=0; // wchar_t *par[40]; ///< Parameter for substituting instead of $1, ..., $9 - out=0; *leg=0; InUse = 1; + out=0; InUse = 1; Skip=Stop=for_br=false; memset(for_stack,0,40*sizeof(int)); memset(if_stack,0,40*sizeof(int)); memset(if_for,0,40*sizeof(int)); - if_pos=fn_pos=fn_num=for_addr=0; - for(long i=0;i<40;i++) par[i]=0; + if_pos=for_addr=0; + for(long i=0;i<40;i++) par[i]=L""; Cmd = mgls_base_cmd; - AllowSetSize=setsize; - Once = true; parlen=320; + AllowSetSize=setsize; AllowFileIO=true; + Once = true; op1 = new wchar_t[4096]; op2 = new wchar_t[4096]; fval = new mglData[40]; } //----------------------------------------------------------------------------- mglParser::~mglParser() +{ + DeleteAll(); + delete []op1; delete []op2; delete []fval; + if(Cmd && Cmd!=mgls_base_cmd) delete []Cmd; +} +//----------------------------------------------------------------------------- +void mglParser::DeleteAll() { if(DataList) { while(DataList->next) delete DataList->next; delete DataList; } - for(long i=0;i<40;i++) if(par[i]) delete [](par[i]); - delete []op1; delete []op2; delete []fval; - if(Cmd && Cmd!=mgls_base_cmd) delete []Cmd; - if(fn_stack) free(fn_stack); } //----------------------------------------------------------------------------- -bool mglParser::AddParam(int n, const char *str, bool isstr) +void mglParser::AddParam(int n, const char *str) { unsigned s = strlen(str)+1; wchar_t *wcs = new wchar_t[s]; mbstowcs(wcs,str,s); - bool r = AddParam(n,wcs,isstr); - delete []wcs; return r; + AddParam(n,wcs); + delete []wcs; } //----------------------------------------------------------------------------- int mglParser::Parse(mglGraph *gr, const char *str, long pos) { - unsigned s = strlen(str)+1; + size_t s = strlen(str)+1; wchar_t *wcs = new wchar_t[s]; mbstowcs(wcs,str,s); int r = Parse(gr,wcs,pos); @@ -222,7 +222,7 @@ int mglParser::Parse(mglGraph *gr, const char *str, long pos) //----------------------------------------------------------------------------- mglVar *mglParser::AddVar(const char *str) { - unsigned s = strlen(str)+1; + size_t s = strlen(str)+1; wchar_t *wcs = new wchar_t[s]; mbstowcs(wcs,str,s); mglVar *v = AddVar(wcs); @@ -232,7 +232,8 @@ mglVar *mglParser::AddVar(const char *str) //----------------------------------------------------------------------------- mglVar *mglParser::FindVar(const char *str) { - unsigned s = strlen(str)+1; + if(!str || *str==0) return DataList; + size_t s = strlen(str)+1; wchar_t *wcs = new wchar_t[s]; mbstowcs(wcs,str,s); mglVar *v = FindVar(wcs); @@ -242,7 +243,7 @@ mglVar *mglParser::FindVar(const char *str) //----------------------------------------------------------------------------- mglNum *mglParser::AddNum(const char *str) { - unsigned s = strlen(str)+1; + size_t s = strlen(str)+1; wchar_t *wcs = new wchar_t[s]; mbstowcs(wcs,str,s); mglNum *v = AddNum(wcs); @@ -252,7 +253,7 @@ mglNum *mglParser::AddNum(const char *str) //----------------------------------------------------------------------------- mglNum *mglParser::FindNum(const char *str) { - unsigned s = strlen(str)+1; + size_t s = strlen(str)+1; wchar_t *wcs = new wchar_t[s]; mbstowcs(wcs,str,s); mglNum *v = FindNum(wcs); @@ -260,18 +261,15 @@ mglNum *mglParser::FindNum(const char *str) return v; } //----------------------------------------------------------------------------- -bool mglParser::AddParam(int n, const wchar_t *str, bool isstr) +void mglParser::AddParam(int n, const wchar_t *str) { - if(n<0 || n>39 || wcschr(str,'$')) return false; - if(!isstr) parlen += wcslen(str); - if(par[n]) delete [](par[n]); - par[n] = new wchar_t[wcslen(str)+1]; - wcscpy(par[n],str); - return true; +// if(str && n>=0 && n<40 && !wcschr(str,'$')) par[n] = str; + if(str && n>=0 && n<40) par[n] = str; } //----------------------------------------------------------------------------- mglVar *mglParser::FindVar(const wchar_t *name) { + if(!name || *name==0) return DataList; mglVar *v=DataList; while(v) { @@ -378,35 +376,34 @@ void mglParser::FillArg(mglGraph *gr, int k, wchar_t **arg, mglArg *a) else if(arg[n][0]=='\'') { // this is string (simplest case) a[n-1].type = 1; arg[n][wcslen(arg[n])-1] = 0; -// if(wcslen(arg[n]+1)>=2048) arg[n][2048]=0; a[n-1].w = arg[n]+1; arg[n][wcslen(arg[n])] = '\''; } else if(arg[n][0]=='{') { // this is temp data arg[n][wcslen(arg[n])-1] = 0; u=new mglVar; u->temp=true; - a[n-1].w = L"/*"+std::wstring(arg[n])+L"*/"; + a[n-1].w = L"/*"+std::wstring(arg[n]+1)+L"*/"; if(DataList) u->MoveAfter(DataList); else DataList = u; - a[n-1].type = 0; a[n-1].d = &(u->d); - ParseDat(gr, arg[n]+1, u->d); // TODO: Check it + a[n-1].type = 0; a[n-1].d = u; + ParseDat(gr, arg[n]+1, *u); } else if((v = FindVar(arg[n]))!=0) // have to find normal variables (for data creation) - { a[n-1].type=0; a[n-1].d=&(v->d); a[n-1].w=v->s; } + { a[n-1].type=0; a[n-1].d=v; a[n-1].w=v->s; } else if((f = FindNum(arg[n]))!=0) // have to find normal variables (for data creation) { a[n-1].type=2; a[n-1].d=0; a[n-1].v=f->d; a[n-1].w = f->s; } else { // parse all numbers and formulas by unified way - const mglData &d=mglFormulaCalc(arg[n], this); + mglData d = mglFormulaCalc(arg[n], this); if(d.nx*d.ny*d.nz==1) { a[n-1].type = 2; a[n-1].v = d.a[0]; } else { - u=new mglVar; u->temp=true; u->d=d; + u=new mglVar; u->temp=true; u->Set(d); a[n-1].w = L"/*"+std::wstring(arg[n])+L"*/"; if(DataList) u->MoveAfter(DataList); else DataList = u; - a[n-1].type = 0; a[n-1].d = &(u->d); + a[n-1].type = 0; a[n-1].d = u; } } } @@ -447,13 +444,13 @@ int mglParser::PreExec(mglGraph *, long k, wchar_t **arg, mglArg *a) if(t==1) nx = j>nx ? j:nx; if(t==1) // list of numeric values { - v->d.Create(nx,ny); + v->Create(nx,ny); j=t=0; for(i=2;id.a[j+nx*t] = a[i-1].v; j++; } + { v->a[j+nx*t] = a[i-1].v; j++; } } } if(t==2) // list of data @@ -463,25 +460,25 @@ int mglParser::PreExec(mglGraph *, long k, wchar_t **arg, mglArg *a) if(b->nz>1) return 2; if(b->ny>1) { - v->d.Create(b->nx, b->ny, nx); + v->Create(b->nx, b->ny, nx); nn = b->nx*b->ny; for(i=2,j=0;inx*b->ny) continue; - memcpy(v->d.a+j*nn,b->a,nn*(b->nz)*sizeof(mreal)); + memcpy(v->a+j*nn,b->a,nn*(b->nz)*sizeof(mreal)); j+=b->nz; } } else { - v->d.Create(b->nx, nx); + v->Create(b->nx, nx); nn = b->nx; for(i=2,j=0;inx) continue; - memcpy(v->d.a+j*nn,b->a,nn*(b->ny)*sizeof(mreal)); + memcpy(v->a+j*nn,b->a,nn*(b->ny)*sizeof(mreal)); j+=b->ny; } } @@ -493,31 +490,29 @@ int mglParser::PreExec(mglGraph *, long k, wchar_t **arg, mglArg *a) //----------------------------------------------------------------------------- void mglParser::PutArg(const wchar_t *string, wchar_t *str, bool def) { - if(parlen>0) + wchar_t *sb = new wchar_t[wcslen(string)+1], *t; + if(def) str = str+10; + register long n; + while((t=wcschr(str,'$'))!=0) { - wchar_t *sb = new wchar_t[wcslen(string)+1], *t; - if(def) str = str+10; - register long n; - while((t=wcschr(str,'$'))!=0) - { - wcscpy(sb,t+2); t[0]=0; - n = t[1]-'0'; if(n>=0 && n<=9 && par[n]) wcscat(str,par[n]); - n = t[1]-'a'; if(n>=0 && n<='z'-'a' && par[n+10]) wcscat(str,par[n+10]); - if(t[1]=='$') wcscat(str,L"\xffff"); - wcscat(str,sb); - } - delete []sb; - while((t=wcschr(str,L'\xffff'))!=0) *t='$'; + wcscpy(sb,t+2); t[0]=0; + n = t[1]-'0'; if(n>=0 && n<=9) wcscat(str,par[n].c_str()); + n = t[1]-'a'; if(n>=0 && n<='z'-'a') wcscat(str,par[n+10].c_str()); + if(t[1]=='$') wcscat(str,L"\xffff"); + wcscat(str,sb); } + delete []sb; + while((t=wcschr(str,L'\xffff'))!=0) *t='$'; } //----------------------------------------------------------------------------- // return values: 0 - OK, 1 - wrong arguments, 2 - wrong command, 3 - string too long, 4 -- unclosed string int mglParser::Parse(mglGraph *gr, const wchar_t *string, long pos) { if(Stop) return 0; - wchar_t *str, *s = new wchar_t[wcslen(string)+1+40*parlen],*arg[1024],*t; - str = s; - wcscpy(str,string); mgl_wcstrim(str); + size_t lstr = wcslen(string)+2+GetParLen(string); + wchar_t *str, *arg[1024],*t; + wchar_t *s = new wchar_t[lstr]; + wcscpy(s,string); mgl_wcstrim(s); str = s; long n,k=0,m=0,mm=0; // try parse ':' -- several commands in line for(n=0;n=0 && nn<='z'-'a'+10) { res = 0; str +=2; mgl_wcstrim(str); - const mglData &d=mglFormulaCalc(str, this); + mreal d = mglFormulaCalc(str, this).a[0]; char *buf=new char[128]; - sprintf(buf,"%g",d.a[0]); + sprintf(buf,"%g",d); AddParam(nn, buf); delete []buf; } delete []s; return res; @@ -573,8 +569,8 @@ int mglParser::Parse(mglGraph *gr, const wchar_t *string, long pos) if(*str=='$' && nn>=0 && nn<='z'-'a'+10) { res = 0; str +=2; mgl_wcstrim(str); - const mglData &d=mglFormulaCalc(str, this); - wchar_t buf[2]={0,0}; buf[0] = wchar_t(d.a[0]); + mreal d=mglFormulaCalc(str, this).a[0]; + wchar_t buf[2]={0,0}; buf[0] = wchar_t(d); AddParam(nn, buf); } delete []s; return res; @@ -594,6 +590,7 @@ int mglParser::Parse(mglGraph *gr, const wchar_t *string, long pos) { mgl_ask_func(str,res); if(*res) AddParam(nn, res); } delete []s; return mgl_ask_func?0:1; } + else return 1; } wcscpy(str,string); mgl_wcstrim(str); if(!skip() && !wcsncmp(str,L"for",3) && (str[3]==' ' || str[3]=='\t')) @@ -641,8 +638,7 @@ int mglParser::Parse(mglGraph *gr, const wchar_t *string, long pos) if(k==3) { mglNum *v=AddNum(arg[1]); - mglData d=mglFormulaCalc(arg[2],this); - v->d = d.a[0]; + v->d = mglFormulaCalc(arg[2],this).a[0]; } delete []s; delete []a; return k==3?0:1; } @@ -663,30 +659,22 @@ int mglParser::Parse(mglGraph *gr, const wchar_t *string, long pos) } else if(n) { - if(!fn_stack) - { fn_num = 100; - fn_stack = (mglFnStack*)malloc(fn_num*sizeof(mglFnStack)); - memset(fn_stack,0,fn_num*sizeof(mglFnStack)); } - if(fn_pos >= fn_num) - { fn_num+= 100; - fn_stack = (mglFnStack*)realloc(fn_stack,fn_num*sizeof(mglFnStack)); - memset(fn_stack+fn_num-100,0,100*sizeof(mglFnStack)); } - memcpy(fn_stack[fn_pos].par,par+1,9*sizeof(wchar_t*)); - memset(par+1,0,9*sizeof(wchar_t*)); + mglFnStack fn; fn.pos = pos; + for(int i=0;i<10;i++) { fn.par[i] = par[i]; par[i]=L""; } for(int i=1;iDataList=DataList; prs->NumList=NumList; prs->Cmd=Cmd; - for(i=10;i<30;i++) prs->AddParam(i,par[i]); + for(i=10;i<30;i++) prs->AddParam(i,par[i].c_str()); prs->Execute(gr,fp); - for(i=10;i<30;i++) AddParam(i,prs->par[i]); + for(i=10;i<30;i++) AddParam(i,prs->par[i].c_str()); DataList=prs->DataList; prs->DataList=0; NumList =prs->NumList; prs->NumList=0; prs->Cmd=0; delete prs; fclose(fp); @@ -727,7 +715,7 @@ int mglParser::Parse(mglGraph *gr, const wchar_t *string, long pos) { for_stack[i]=for_stack[i-1]; if_for[i]=if_for[i-1]; } for_stack[0] = r+1; fval[r].nz = pos; if_for[0]=if_pos; wchar_t buf[32]; mglprintf(buf,32,L"%g",fval[r].a[0]); - AddParam(r, buf,true); fval[r].ny = 1; + AddParam(r, buf); fval[r].ny = 1; } } delete []s; delete []a; return n; @@ -752,14 +740,14 @@ int mglParser::Parse(mglGraph *gr, const wchar_t *string, long pos) // return values: 0 - OK, 1 - wrong arguments, 2 - wrong command, 3 - string too long, 4 -- unclosed string int mglParser::ParseDat(mglGraph *gr, const wchar_t *string, mglData &res) { - wchar_t *str, *s = new wchar_t[wcslen(string)+1+parlen],*arg[32]; + wchar_t *str, *s = new wchar_t[wcslen(string)+1+GetParLen(string)],*arg[32]; str = s; wcscpy(str,string); mgl_wcstrim(str); long n,k=0; for(k=0;k<32;k++) // parse string to substrings (by spaces) { n = mglFindArg(str); - if(n<0) { str[-n]=0; break; } + if(n<1) { if(n<0) str[-n]=0; break; } str[n]=0; arg[k] = str;// k++; str = str+n+1; mgl_wcstrim(str); } @@ -857,10 +845,10 @@ int mglParser::FlowExec(mglGraph *, const wchar_t *com, long m, mglArg *a) } else if(!skip() && !wcscmp(com, L"return")) // parse command "delete" { - if(!fn_pos) return 2; - fn_pos--; n = -fn_stack[fn_pos].pos-1; - for(int i=1;i<10;i++) if(par[i]) delete []par[i]; - memcpy(par+1,fn_stack[fn_pos].par,9*sizeof(wchar_t*)); + if(fn_stack.size()<1) return 2; + const mglFnStack &fn=fn_stack.back(); + for(int i=0;i<10;i++) par[i]=fn.par[i]; + n = -fn.pos-1; fn_stack.pop_back(); } else if(!ifskip() && !Skip && !wcscmp(com,L"next")) { @@ -872,7 +860,7 @@ int mglParser::FlowExec(mglGraph *, const wchar_t *com, long m, mglArg *a) if(fval[r].nyMessage()); } @@ -919,7 +909,7 @@ void mglParser::Execute(mglGraph *gr, int n, const wchar_t **text) if(n<1 || text==0) return; long i, r; char buf[64]; - for_br=Skip=false; if_pos=fn_pos=0; ScanFunc(0); + for_br=Skip=false; if_pos=0; ScanFunc(0); fn_stack.clear(); for(i=0;iAddParam(id,str); } -void mgl_add_paramw(HMPR p, int id, const wchar_t *str) { p->AddParam(id,str); } -HMDT mgl_add_var(HMPR p, const char *name) { mglVar *v=p->AddVar(name); return &(v->d); } -HMDT mgl_find_var(HMPR p, const char *name) { mglVar *v=p->FindVar(name); return &(v->d); } -void mgl_del_var(HMPR p, const char *name) { p->DeleteVar(name); } -int mgl_parse(HMGL gr, HMPR p, const char *str, int pos) +void mgl_parser_add_param(HMPR p, int id, const char *str) { p->AddParam(id,str); } +void mgl_parser_add_paramw(HMPR p, int id, const wchar_t *str) { p->AddParam(id,str); } +HMDT mgl_parser_add_var(HMPR p, const char *name) { mglVar *v=p->AddVar(name); return v; } +HMDT mgl_parser_find_var(HMPR p, const char *name) { mglVar *v=p->FindVar(name); return v; } +void mgl_parser_del_var(HMPR p, const char *name) { p->DeleteVar(name); } +HMDT mgl_parser_add_varw(HMPR p, const wchar_t *name) { mglVar *v=p->AddVar(name); return v; } +HMDT mgl_parser_find_varw(HMPR p, const wchar_t *name) { mglVar *v=p->FindVar(name); return v; } +void mgl_parser_del_varw(HMPR p, const wchar_t *name) { p->DeleteVar(name); } +int mgl_parse_line(HMGL gr, HMPR p, const char *str, int pos) { return p->Parse(gr, str, pos); } -int mgl_parsew(HMGL gr, HMPR p, const wchar_t *str, int pos) +int mgl_parse_linew(HMGL gr, HMPR p, const wchar_t *str, int pos) { return p->Parse(gr, str, pos); } void mgl_parse_text(HMGL gr, HMPR p, const char *str) { p->Execute(gr, str); } -void mgl_parsew_text(HMGL gr, HMPR p, const wchar_t *str) +void mgl_parse_textw(HMGL gr, HMPR p, const wchar_t *str) { p->Execute(gr, str); } void mgl_parse_file(HMGL gr, HMPR p, FILE *fp, int print) { p->Execute(gr,fp,print); } -void mgl_restore_once(HMPR p) { p->RestoreOnce(); } +void mgl_parser_restore_once(HMPR p) { p->RestoreOnce(); } void mgl_parser_stop(HMPR p) { p->Stop = true; } -void mgl_parser_allow_setsize(HMPR p, int a) { p->AllowSetSize = a; } +void mgl_parser_allow_setsize(HMPR p, int a) { p->AllowSetSize= a; } +void mgl_parser_allow_file_io(HMPR p, int a) { p->AllowFileIO = a; } //----------------------------------------------------------------------------- #define _PR_ ((mglParser *)(*p)) uintptr_t mgl_create_parser_() { return uintptr_t(new mglParser); } void mgl_delete_parser_(uintptr_t* p) { delete _PR_; } -void mgl_add_param_(uintptr_t* p, int *id, const char *str, int l) +void mgl_parser_add_param_(uintptr_t* p, int *id, const char *str, int l) { char *s=new char[l+1]; memcpy(s,str,l); s[l]=0; _PR_->AddParam(*id, s); delete []s; } /*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ -uintptr_t mgl_add_var_(uintptr_t* p, const char *name, int l) +uintptr_t mgl_parser_add_var_(uintptr_t* p, const char *name, int l) { char *s=new char[l+1]; memcpy(s,name,l); s[l]=0; - mglVar *v=_PR_->AddVar(s); delete []s; - return uintptr_t(&(v->d)); } + mglVar *v=_PR_->AddVar(s); delete []s; return uintptr_t(v); } /*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ -uintptr_t mgl_find_var_(uintptr_t* p, const char *name, int l) +uintptr_t mgl_parser_find_var_(uintptr_t* p, const char *name, int l) { char *s=new char[l+1]; memcpy(s,name,l); s[l]=0; - mglVar *v=_PR_->FindVar(s); delete []s; - return uintptr_t(&(v->d)); } + mglVar *v=_PR_->FindVar(s); delete []s; return uintptr_t(v); } void mgl_del_var_(uintptr_t* p, const char *name, int l) { char *s=new char[l+1]; memcpy(s,name,l); s[l]=0; _PR_->DeleteVar(s); delete []s; } -int mgl_parse_(uintptr_t* gr, uintptr_t* p, const char *str, int *pos, int l) +int mgl_parse_line_(uintptr_t* gr, uintptr_t* p, const char *str, int *pos, int l) { char *s=new char[l+1]; memcpy(s,str,l); s[l]=0; int r = _PR_->Parse(_GR_, s, *pos); delete []s; return r; } void mgl_parse_text_(uintptr_t* gr, uintptr_t* p, const char *str, int l) { char *s=new char[l+1]; memcpy(s,str,l); s[l]=0; _PR_->Execute(_GR_, s); delete []s; } -void mgl_restore_once_(uintptr_t* p) { _PR_->RestoreOnce(); } -void mgl_parser_allow_setsize_(uintptr_t* p, int *a) -{ _PR_->AllowSetSize = *a; } +void mgl_parser_restore_once_(uintptr_t* p) { _PR_->RestoreOnce(); } +void mgl_parser_allow_setsize_(uintptr_t* p, int *a) { _PR_->AllowSetSize= *a; } +void mgl_parser_allow_file_io_(uintptr_t* p, int *a) { _PR_->AllowFileIO = *a; } void mgl_parser_stop_(uintptr_t* p) { _PR_->Stop = true; } //----------------------------------------------------------------------------- long mgl_use_parser(HMPR pr, int inc) @@ -1076,23 +1068,45 @@ long mgl_use_parser(HMPR pr, int inc) long mgl_use_parser_(uintptr_t *p, int *inc) { _PR_->InUse+=*inc; return _PR_->InUse; } //--------------------------------------------------------------------------- -int mgl_cmd_type(HMPR pr, const char *name) +int mgl_parser_cmd_type(HMPR pr, const char *name) { mglCommand *cmd = pr->FindCommand(name); return cmd ? cmd->type + 1 : 0; } -int mgl_cmd_type_(uintptr_t* p, const char *str, int l) +int mgl_parser_cmd_type_(uintptr_t* p, const char *str, int l) { char *s=new char[l+1]; memcpy(s,str,l); s[l]=0; - l = mgl_cmd_type(_PR_, s); delete []s; return l; } + l = mgl_parser_cmd_type(_PR_, s); delete []s; return l; } //--------------------------------------------------------------------------- -const char *mgl_cmd_desc(HMPR pr, const char *name) +const char *mgl_parser_cmd_desc(HMPR pr, const char *name) { mglCommand *cmd = pr->FindCommand(name); return cmd ? cmd->desc : 0; } -const char *mgl_cmd_frmt(HMPR pr, const char *name) +const char *mgl_parser_cmd_frmt(HMPR pr, const char *name) { mglCommand *cmd = pr->FindCommand(name); return cmd ? cmd->form : 0; } //--------------------------------------------------------------------------- +const char *mgl_parser_cmd_name(HMPR pr, long id) +{ return (id=0) ? pr->Cmd[id].name:""; } +long mgl_parser_cmd_num(HMPR pr) +{ register long i=0; while(pr->Cmd[i].name[0]) i++; return i; } +//--------------------------------------------------------------------------- +HMDT mgl_parser_calc(HMPR pr, const char *formula) +{ + size_t s = strlen(formula)+1; + wchar_t *wcs = new wchar_t[s]; + mbstowcs(wcs,formula,s); + HMDT d = mgl_parser_calcw(pr,wcs); + delete []wcs; return d; +} +HMDT mgl_parser_calcw(HMPR pr, const wchar_t *formula) +{ mglData *d = new mglData(mglFormulaCalc(formula,pr)); return d; } +uintptr_t mgl_parser_calc_(uintptr_t *p, const char *str,int l) +{ char *s=new char[l+1]; memcpy(s,str,l); s[l]=0; + uintptr_t d = (uintptr_t)mgl_parser_calc(_PR_, s); delete []s; return d; } +//--------------------------------------------------------------------------- +void mgl_parser_del_all(HMPR p) { p->DeleteAll(); } +void mgl_parser_del_all_(uintptr_t *p) { _PR_->DeleteAll(); } +//--------------------------------------------------------------------------- diff --git a/src/pde.cpp b/src/pde.cpp index 1c6a3ca..ae646c7 100644 --- a/src/pde.cpp +++ b/src/pde.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_pde.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -36,7 +36,7 @@ struct mgl_pde_ham void *mgl_pde_hprep(void *par) { mglThreadD *t=(mglThreadD *)par; - mgl_pde_ham *f = (mgl_pde_ham *)t->v; + const mgl_pde_ham *f = (const mgl_pde_ham *)t->v; mglFormula *eqs = f->eqs; register long i,j,i0, nx=2*f->nx, ny=2*f->ny; mreal var[MGL_VS]; @@ -230,7 +230,7 @@ struct mgl_ap { double x0,y0,x1,y1; // vectors {l, g1, g2} double t1,ch,q1,pt,dt,d1; // theta_{1,2}, chi, q_{1,2}, p_t, dtau, dq_{1,2} - mgl_ap() { memset(this,0,sizeof(mgl_ap)); }; + mgl_ap() { memset(this,0,sizeof(mgl_ap)); } }; //----------------------------------------------------------------------------- void mgl_init_ra(int n, const mreal *r, mgl_ap *ra) // prepare some intermediate data for mglPDE2d @@ -275,7 +275,7 @@ struct mgl_qo2d_ham void *mgl_qo2d_hprep(void *par) { mglThreadD *t=(mglThreadD *)par; - mgl_qo2d_ham *f = (mgl_qo2d_ham *)t->v; + const mgl_qo2d_ham *f = (const mgl_qo2d_ham *)t->v; mgl_ap *ra = f->ra; mglFormula *h = f->h; const mreal *r = f->r; diff --git a/src/pixel.cpp b/src/pixel.cpp index 92f618b..4c07e9b 100644 --- a/src/pixel.cpp +++ b/src/pixel.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * pixel.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -37,7 +37,7 @@ void mglDrawReg::set(mglCanvas *gr, int nx, int ny, int m) { int mx = m%nx, my = m/nx; x1 = gr->GetWidth()*mx/nx; y1 = gr->GetHeight()-gr->GetHeight()*(my+1)/ny; - x2 = gr->GetWidth()*(mx+1)/nx; y2 = gr->GetHeight()-gr->GetHeight()*my/ny; + x2 = gr->GetWidth()*(mx+1)/nx-1; y2 = gr->GetHeight()-gr->GetHeight()*my/ny-1; } //----------------------------------------------------------------------------- void mglCanvas::PutDrawReg(mglDrawReg *d, const mglCanvas *gr) @@ -60,99 +60,40 @@ void mglCanvas::PostScale(mglPoint &p) const p.x = B.x + q.x*B.b[0] + q.y*B.b[1] + q.z*B.b[2]; p.y = B.y + q.x*B.b[3] + q.y*B.b[4] + q.z*B.b[5]; p.z = B.z + q.x*B.b[6] + q.y*B.b[7] + q.z*B.b[8]; -/* if(Persp) - { - register mreal d = (1-Persp*Depth/2)/(1-Persp*p.z); - p.x = Width/2 + d*(p.x-Width/2); - p.y = Height/2 + d*(p.y-Height/2); - }*/ } //----------------------------------------------------------------------------- bool mglCanvas::ScalePoint(mglPoint &p, mglPoint &n, bool use_nan) const { bool res = get(MGL_DISABLE_SCALE) || mglBase::ScalePoint(p,n,use_nan); - if(TernAxis&4) return res; +// if(TernAxis&4) return res; PostScale(p); mglPoint y=n; -// n.x = (B.b[4]*B.b[8]-B.b[5]*B.b[7])*y.x-(B.b[3]*B.b[8]-B.b[5]*B.b[6])*y.y+(B.b[3]*B.b[7]-B.b[4]*B.b[6])*y.z; -// n.y = (B.b[2]*B.b[7]-B.b[1]*B.b[8])*y.x+(B.b[0]*B.b[8]-B.b[2]*B.b[6])*y.y-(B.b[0]*B.b[7]-B.b[1]*B.b[6])*y.z; -// n.y = (B.b[1]*B.b[5]-B.b[2]*B.b[4])*y.x-(B.b[0]*B.b[5]-B.b[2]*B.b[3])*y.y+(B.b[0]*B.b[4]-B.b[1]*B.b[3])*y.z; n.x = y.x*B.b[0] + y.y*B.b[1] + y.z*B.b[2]; // simpler for rotation only n.y = y.x*B.b[3] + y.y*B.b[4] + y.z*B.b[5]; n.z = y.x*B.b[6] + y.y*B.b[7] + y.z*B.b[8]; n.Normalize(); -/* if(Persp) - { - register mreal d = (1-Persp*Depth/2)/(1-Persp*p.z); - // NOTE: No d* since I use transformed p here. - register mreal dd = Persp*n.z/(1-Persp*p.z); - n.x = d*n.x + dd*(p.x-Width/2); - n.y = d*n.y + dd*(p.y-Height/2); - }*/ return res; } //----------------------------------------------------------------------------- -long mglCanvas::ProjScale(int nf, long id) +long mglCanvas::ProjScale(int nf, long id, bool text) { - const mglPnt &p0=Pnt[id]; - mglPoint pp(p0.x,p0.y,p0.z), nn(p0.u,p0.v,p0.w); + mglPoint pp = GetPntP(id), nn = GetPntN(id), q, p, n, u; if(mgl_isnan(pp.x)) return -1; - mglPoint q=pp/(2*B.pf), p, n=nn; + q = RestorePnt(pp)/(2*B.pf); + u = RestorePnt(nn,true); u.Normalize(); mreal w=B1.b[0]/2, h=B1.b[4]/2, d=B1.b[8]/2, xx=B1.x-w/2, yy=B1.y-h/2; - if(TernAxis&1) // usual ternary axis - { - if(nf==0) - { p.x = xx+w/2 + (q.x+(q.y+1)/2)*w/2; - n.x = (nn.x+nn.y/2)*w/2; - p.y = yy+h + q.y*h/2; n.y = nn.y*h/2; } - } - else if(TernAxis&2) // quaternary axis - { - if(nf==0) - { p.x = xx+w/2 + (q.x+(q.y+1)/2)*w/2; - n.x = (nn.x+nn.y/2)*w/2; - p.y = yy+h + q.y*h/2; - n.y = nn.y*h/2; } - else if(nf==1) - { p.x = xx+w/2 + (q.x+(1-q.z)/2)*w/2; - n.x = (nn.x-nn.z/2)*w/2; - p.y = yy+h - q.z*h/2; - n.y = -nn.z*h/2; } - else if(nf==2) - { p.x = xx+w/2 + (q.y-q.z)/2*w/2; - n.x = (nn.y-nn.z/2)*w/2; - p.y = yy+h + (q.y+q.z)*h/2; - n.y = (nn.y+nn.z)/2*h/2; } - else - { p.x = xx+w/2 + (q.x+1+(q.y+q.z)/2)*w/2; - n.x = (nn.x+(nn.y+nn.z)/2)*w/2; - p.y = yy+h + (q.y+(q.z+1)/3)*h/2; - n.y = (nn.y+nn.z/3)*h/2; } - } + if(nf==0) + { p.x = xx + q.x*w; p.y = yy + q.y*h; p.z = B1.z + q.z*d; n = u; } + else if(nf==1) + { p.x = xx + q.x*w; p.y = yy+h + q.z*h; p.z = B1.z + q.y*d; n = mglPoint(u.x,u.z,u.y); } + else if(nf==2) + { p.x = xx+w + q.z*w; p.y = yy + q.y*h; p.z = B1.z+ q.x*d; n = mglPoint(u.z,u.y,u.x); } else - { - if(nf==0) - { p.x = xx + q.x*w; n.x = nn.x*w/2; - p.y = yy + q.y*h; n.y = nn.y*h/2; - p.z = B1.z + q.z*d; n.z = nn.z*d/2; } - else if(nf==1) - { p.x = xx + q.x*w; n.x = nn.x*w/2; - p.y = yy+h + q.z*h; n.y = nn.z*h/2; - p.z = B1.z + q.y*d; n.z = nn.y*d/2; } - else if(nf==2) - { p.x = xx+w + q.z*w; n.x = nn.z*w/2; - p.y = yy + q.y*h; n.y = nn.y*h/2; - p.z = B1.z+ q.x*d; n.z = nn.x*d/2; } - else - { p.x = xx+w + q.x*B.b[0]/2 + q.y*B.b[1]/2 + q.z*B.b[2]/2; - p.y = yy+h + q.x*B.b[3]/2 + q.y*B.b[4]/2 + q.z*B.b[5]/2; - p.z = B.z + q.x*B.b[6]/2 + q.y*B.b[7]/2 + q.z*B.b[8]/2; - n.x = (nn.x*B.b[0] + nn.y*B.b[1] + nn.z*B.b[2])/2; - n.y = (nn.x*B.b[3] + nn.y*B.b[4] + nn.z*B.b[5])/2; - n.z = (nn.x*B.b[6] + nn.y*B.b[7] + nn.z*B.b[8])/2; } - } - return CopyProj(id,p,n); + { p.x = xx+w + q.x*B.b[0]/2 + q.y*B.b[1]/2 + q.z*B.b[2]/2; n = nn; + p.y = yy+h + q.x*B.b[3]/2 + q.y*B.b[4]/2 + q.z*B.b[5]/2; + p.z = B.z + q.x*B.b[6]/2 + q.y*B.b[7]/2 + q.z*B.b[8]/2; } + return CopyProj(id,p,text?n:nn); } //----------------------------------------------------------------------------- void mglCanvas::LightScale() @@ -167,34 +108,67 @@ void mglCanvas::LightScale() } } //----------------------------------------------------------------------------- -// NOTE: Perspective, transformation formulas and lists are not support just now !!! Also it use LAST InPlot parameters!!! -mglPoint mglCanvas::CalcXYZ(int xs, int ys) const +// NOTE: Perspective is not support just now !!! Also it use LAST InPlot parameters!!! +mglPoint mglCanvas::RestorePnt(mglPoint ps, bool norm) const { - mreal s3 = 2*B.pf, x, y, z; // TODO: Take into account z-value of z-buffer - ys = Height - ys; - mreal xx = xs-B.x, yy = ys-B.y; - mreal d1=B.b[0]*B.b[4]-B.b[1]*B.b[3], d2=B.b[1]*B.b[5]-B.b[2]*B.b[4], d3=B.b[0]*B.b[5]-B.b[2]*B.b[3]; - if(fabs(d1) > fabs(d2) && fabs(d1) > fabs(d3)) // x-y plane + mreal s3 = 2*B.pf; + mglPoint p; + + mreal W=Width/2, H=Height/2, D=Depth/2; + mreal cx = B.z*Bp.b[2]+B.y*Bp.b[1]+B.x*Bp.b[0]-Bp.x*W-Bp.b[0]*W+W-Bp.b[1]*H-Bp.b[2]*D; + mreal c0 = B.b[6]*Bp.b[2]+B.b[3]*Bp.b[1]+B.b[0]*Bp.b[0]; + mreal c1 = B.b[7]*Bp.b[2]+B.b[4]*Bp.b[1]+B.b[1]*Bp.b[0]; + mreal c2 = B.b[8]*Bp.b[2]+B.b[5]*Bp.b[1]+B.b[2]*Bp.b[0]; + mreal cy = B.z*Bp.b[5]+B.y*Bp.b[4]+B.x*Bp.b[3]-Bp.b[3]*W-Bp.y*H-Bp.b[4]*H+H-Bp.b[5]*D; + mreal c3 = B.b[6]*Bp.b[5]+B.b[3]*Bp.b[4]+B.b[0]*Bp.b[3]; + mreal c4 = B.b[7]*Bp.b[5]+B.b[4]*Bp.b[4]+B.b[1]*Bp.b[3]; + mreal c5 = B.b[8]*Bp.b[5]+B.b[5]*Bp.b[4]+B.b[2]*Bp.b[3]; + mreal cz = B.z*Bp.b[8]+B.y*Bp.b[7]+B.x*Bp.b[6]-Bp.b[6]*W-Bp.b[7]*H-Bp.z*D-Bp.b[8]*D+D; + mreal c6 = B.b[6]*Bp.b[8]+B.b[3]*Bp.b[7]+B.b[0]*Bp.b[6]; + mreal c7 = B.b[7]*Bp.b[8]+B.b[4]*Bp.b[7]+B.b[1]*Bp.b[6]; + mreal c8 = B.b[8]*Bp.b[8]+B.b[5]*Bp.b[7]+B.b[2]*Bp.b[6]; + if(norm) cx=cy=cz=0; + + mreal xx = ps.x-cx, yy = ps.y-cy, zz = ps.z-cz; + mreal d1=c0*c4-c1*c3, d2=c1*c5-c2*c4, d3=c0*c5-c2*c3; + + if(zz==zz) // try to use z-values + { + // put inverse matrix here: [x,y,z]=B^(-1)[xx,yy,zz] + mreal det = (-c0*c4*c8+c1*c3*c8+c0*c5*c7-c2*c3*c7-c1*c5*c6+c2*c4*c6)/s3; + p.x = (c2*c4-c1*c5)*zz+(c1*c8-c2*c7)*yy+(c5*c7-c4*c8)*xx; p.x /= det; + p.y = (c0*c5-c2*c3)*zz+(c2*c6-c0*c8)*yy+(c3*c8-c5*c6)*xx; p.y /= det; + p.z = (c1*c3-c0*c4)*zz+(c0*c7-c1*c6)*yy+(c4*c6-c3*c7)*xx; p.z /= det; + } + else if(fabs(d1) > fabs(d2) && fabs(d1) > fabs(d3)) // x-y plane { - z = 0; - x = s3*(B.b[4]*xx-B.b[1]*yy)/d1; - y = s3*(B.b[0]*yy-B.b[3]*xx)/d1; + p.z = 0; + p.x = s3*(c4*xx-c1*yy)/d1; + p.y = s3*(c0*yy-c3*xx)/d1; } else if(fabs(d2) > fabs(d3)) // y-z { - x = 0; - y = s3*(B.b[5]*xx-B.b[2]*yy)/d2; - z = s3*(B.b[1]*yy-B.b[4]*xx)/d2; + p.x = 0; + p.y = s3*(c5*xx-c2*yy)/d2; + p.z = s3*(c1*yy-c4*xx)/d2; } else // x-z { - y = 0; - x = s3*(B.b[5]*xx-B.b[2]*yy)/d3; - z = s3*(B.b[0]*yy-B.b[3]*xx)/d3; + p.y = 0; + p.x = s3*(c5*xx-c2*yy)/d3; + p.z = s3*(c0*yy-c3*xx)/d3; } - return mglPoint(Min.x + (Max.x-Min.x)*(x+1)/2, - Min.y + (Max.y-Min.y)*(y+1)/2, - Min.z + (Max.z-Min.z)*(z+1)/2); + return p; +} +//----------------------------------------------------------------------------- +mglPoint mglCanvas::CalcXYZ(int xs, int ys, bool real) const +{ + mglPoint p, ps(xs,Height-ys,NAN); + float zz = Z[3*(xs+Width*(Height-1-ys))]; + if(zz>-1e20f) { ps.z = zz; real=false; } + p = RestorePnt(ps); + return real ? mglPoint(NAN,NAN,NAN) : mglPoint(Min.x + (Max.x-Min.x)*(p.x+1)/2, + Min.y + (Max.y-Min.y)*(p.y+1)/2, Min.z + (Max.z-Min.z)*(p.z+1)/2); } //----------------------------------------------------------------------------- void mglCanvas::CalcScr(mglPoint p, int *xs, int *ys) const @@ -209,36 +183,28 @@ mglPoint mglCanvas::CalcScr(mglPoint p) const { int x,y; CalcScr(p,&x,&y); return mglPoint(x,y); } //----------------------------------------------------------------------------- //mglCanvas *mgl_tmp_gr; +int mgl_type_prior[8]={1,2,4,5, 0,3,0, 7}; bool operator<(const mglPrim &a, const mglPrim &b) { - if( a.z < b.z-0.5 ) return true; - if( a.z > b.z+0.5 ) return false; - if( a.w < b.w ) return true; - if( a.w > b.w ) return false; - if( a.n3 < b.n3 ) return true; - if( a.n3 > b.n3 ) return false; - return a.type < b.type; -// if( type != a.type ) return type < a.type; -// if( a1->type==1 && (a1->xx(mgl_tmp_gr)!=a2->xx(mgl_tmp_gr)) ) -// return (a2->xx(mgl_tmp_gr)xx(mgl_tmp_gr)) ? 1 : -1; -// if( a1->type==1 ) return (a2->yy(mgl_tmp_gr)yy(mgl_tmp_gr)) ? 1 : -1; -// return 0; + register int t1 = mgl_type_prior[a.type], t2 = mgl_type_prior[b.type]; + if(a.z!=b.z) return a.z < b.z; + if(t1!=t2) return t1 > t2; + if(a.w!=b.w) return a.w > b.w; + return a.n3 > b.n3; } //----------------------------------------------------------------------------- bool operator>(const mglPrim &a, const mglPrim &b) { - if( a.z < b.z-0.5 ) return false; - if( a.z > b.z+0.5 ) return true; - if( a.w < b.w ) return false; - if( a.w > b.w ) return true; - if( a.n3 < b.n3 ) return false; - if( a.n3 > b.n3 ) return true; - return a.type > b.type; + register int t1 = mgl_type_prior[a.type], t2 = mgl_type_prior[b.type]; + if(a.z!=b.z) return a.z > b.z; + if(t1!=t2) return t1 < t2; + if(a.w!=b.w) return a.w < b.w; + return a.n3 < b.n3; } //----------------------------------------------------------------------------- void *mgl_canvas_thr(void *par) { mglThreadG *t=(mglThreadG *)par; (t->gr->*(t->f))(t->id, t->n, t->p); return NULL; } -void mglStartThread(void (mglCanvas::*func)(unsigned long i, unsigned long n, const void *p), mglCanvas *gr, unsigned long n, const void *p=NULL) +void mglStartThread(void (mglCanvas::*func)(size_t i, size_t n, const void *p), mglCanvas *gr, size_t n, const void *p=NULL) { if(!func || !gr) return; #if MGL_HAVE_PTHREAD @@ -259,77 +225,43 @@ void mglStartThread(void (mglCanvas::*func)(unsigned long i, unsigned long n, co { mglNumThr = 1; (gr->*func)(0,n,p); } } //----------------------------------------------------------------------------- -void mglCanvas::pxl_primdr(unsigned long id, unsigned long n, const void *) -{ - int nx=1,ny=1,pdef=PDef; - register unsigned long i; - if(id0) clr(MGL_FINISHED); if(get(MGL_FINISHED)) return; // nothing to do if(!(Quality&4) && Prm.size()>0) { PreparePrim(fast); bp=Bp; -// mglStartThread(&mglCanvas::pxl_primdr,this,Prm.size()); // TODO: check conflicts in pthreads - pxl_primdr(-1,Prm.size(),NULL); + clr(MGL_FINISHED); + mglStartThread(&mglCanvas::pxl_primdr,this,Prm.size()); } - unsigned long n=Width*Height; + size_t n=Width*Height; BDef[3] = (Flag&3)!=2 ? 0:255; if(Quality&2) mglStartThread(&mglCanvas::pxl_combine,this,n); - else mglStartThread(&mglCanvas::pxl_memcpy,this,n); + else mglStartThread(&mglCanvas::pxl_memcpy,this,n); BDef[3] = 255; mglStartThread(&mglCanvas::pxl_backgr,this,n); set(MGL_FINISHED); } //----------------------------------------------------------------------------- -void mglCanvas::ClfZB() +void mglCanvas::ClfZB(bool force) { - if(Quality&4) return; + if(!force && (Quality&4)) return; register long i,n=Width*Height; memset(C,0,12*n); memset(OI,0,n*sizeof(int)); - for(i=0;i<3*n;i++) Z[i] = -1e20f; // TODO: Parallelization ?!? + for(i=0;i<3*n;i++) Z[i] = -1e20f; clr(MGL_FINISHED); } //----------------------------------------------------------------------------- void mglCanvas::Clf(mglColor Back) { Fog(0); PDef = 0xffff; pPos = 0; StartAutoGroup(NULL); - Pnt.clear(); Prm.clear(); Ptx.clear(); - Sub.clear(); Leg.clear(); Grp.clear(); + Pnt.clear(); Prm.clear(); Ptx.clear(); Glf.clear(); + Sub.clear(); Leg.clear(); Grp.clear(); Act.clear(); Txt.clear(); Txt.reserve(3); - Txt.push_back(mglTexture(MGL_DEF_PAL,-1)); - Txt.push_back(mglTexture("BbcyrR",1)); + MGL_PUSH(Txt,mglTexture(MGL_DEF_PAL,-1),mutexTxt); + MGL_PUSH(Txt,mglTexture("BbcyrR",1),mutexTxt); - if(Back==0) Back = 'w'; + if(Back==0) Back = 'w'; if((Flag&3)==2) Back = 'k'; BDef[0]=Back.r*255; BDef[1]=Back.g*255;BDef[2]=Back.b*255; BDef[3]=0; - ClfZB(); + ClfZB(true); } //----------------------------------------------------------------------------- -void mglCanvas::pxl_other(unsigned long id, unsigned long n, const void *p) +void mglCanvas::pxl_other(size_t id, size_t n, const void *p) { - unsigned long i,j,k; + size_t i,j,k; const mglCanvas *gr = (const mglCanvas *)p; if(!gr) return; for(k=id;kZ[3*k+2],gr->C+12*k+8); - pnt_plot(i,j,gr->Z[3*k+1],gr->C+12*k+4); + pnt_plot(i,j,gr->Z[3*k+2],gr->C+12*k+8,gr->OI[k]); + pnt_plot(i,j,gr->Z[3*k+1],gr->C+12*k+4,gr->OI[k]); } - pnt_plot(i,j,gr->Z[3*k],gr->C+12*k); + pnt_plot(i,j,gr->Z[3*k],gr->C+12*k,gr->OI[k]); } } //----------------------------------------------------------------------------- @@ -455,11 +418,11 @@ void mglCanvas::MPI_Recv(int id) set(MGL_FINISHED); } #else -void mglCanvas::MPI_Send(int /*id*/) {} -void mglCanvas::MPI_Recv(int /*id*/) {} +void mglCanvas::MPI_Send(int /*id*/) { mglGlobalMess += "MPI support was disabled. Please, enable it and rebuild MathGL.\n"; } +void mglCanvas::MPI_Recv(int /*id*/) { mglGlobalMess += "MPI support was disabled. Please, enable it and rebuild MathGL.\n"; } #endif //----------------------------------------------------------------------------- -void mglCanvas::pnt_plot(long x,long y,mreal z,const unsigned char ci[4]) +void mglCanvas::pnt_plot(long x,long y,mreal z,const unsigned char ci[4], int obj_id) { long i0=x+Width*(Height-1-y); if(ci[3]==0) return; @@ -469,23 +432,23 @@ void mglCanvas::pnt_plot(long x,long y,mreal z,const unsigned char ci[4]) if(zf<0) // add fog { int d = int(255.f-255.f*exp(5.f*zf)); - unsigned char cb[4] = {BDef[0], BDef[1], BDef[2], d}; + unsigned char cb[4] = {BDef[0], BDef[1], BDef[2], (unsigned char)d}; if(d==255) return; combine(c,cb); } if(Quality&2) { - if(z>zz[1]) // shift point on slice down and paste new point + if(z>=zz[1]) // shift point on slice down and paste new point { zz[2] = zz[1]; combine(cc+8,cc+4); - if(z>zz[0]) - { zz[1] = zz[0]; zz[0] = z; OI[i0]=ObjId; + if(z>=zz[0]) + { zz[1] = zz[0]; zz[0] = z; OI[i0]=obj_id; memcpy(cc+4,cc,4); memcpy(cc,c,4); } else { zz[1] = z; memcpy(cc+4,c,4); } } else { - if(z>zz[2]) // shift point on slice down and paste new point + if(z>=zz[2]) // shift point on slice down and paste new point { zz[2] = z; combine(cc+8,c); } else // point below the background { combine(c,cc+8); memcpy(cc+8,c,4); } @@ -493,12 +456,12 @@ void mglCanvas::pnt_plot(long x,long y,mreal z,const unsigned char ci[4]) } else { - if(z>zz[0]) // point upper the background - { zz[0]=z; memcpy(cc,c,4); OI[i0]=ObjId; } + if(z>=zz[0]) // point upper the background + { zz[0]=z; memcpy(cc,c,4); OI[i0]=obj_id; } } } //----------------------------------------------------------------------------- -unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r) +unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id) { if(!r) return r; if(p.a<=0) { memset(r,0,4*sizeof(unsigned char)); return r; } @@ -566,7 +529,7 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r) else { b0=p.r; b1=p.g; b2=p.b; } // try to highlight faces - if(ObjId==HighId) { b0*=0.7; b1*=0.7; b2*=0.7; } + if(obj_id==HighId) { b0*=0.7; b1*=0.7; b2*=0.7; } r[0] = (unsigned char)(255*b0); r[1] = (unsigned char)(255*b1); r[2] = (unsigned char)(255*b2); @@ -576,7 +539,7 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r) } //----------------------------------------------------------------------------- /// color mixing: color c1 is under color c2 !!! -void mglCanvas::combine(unsigned char *c1,unsigned char *c2) +void mglCanvas::combine(unsigned char *c1, const unsigned char *c2) { if(!c2[3]) return; register unsigned int a1=c1[3], a2=c2[3],b1=255-a2; @@ -626,7 +589,6 @@ void mglCanvas::quad_draw(long k1, long k2, long k3, long k4, mglDrawReg *d) fast_draw(k1,k2,d); fast_draw(k1,k3,d); fast_draw(k4,k2,d); fast_draw(k4,k3,d); return; } - clr(MGL_FINISHED); unsigned char r[4]; long y1,x1,y2,x2; float dd,dsx,dsy; @@ -637,8 +599,8 @@ void mglCanvas::quad_draw(long k1, long k2, long k3, long k4, mglDrawReg *d) y1 = long(fmin(fmin(p1.y,p2.y),fmin(p3.y,p4.y))); x2 = long(fmax(fmax(p1.x,p2.x),fmax(p3.x,p4.x))); y2 = long(fmax(fmax(p1.y,p2.y),fmax(p3.y,p4.y))); - x1=x1>d->x1?x1:d->x1; x2=x2x2?x2:d->x2-1; - y1=y1>d->y1?y1:d->y1; y2=y2y2?y2:d->y2-1; + x1=x1>d->x1?x1:d->x1; x2=x2x2?x2:d->x2; + y1=y1>d->y1?y1:d->y1; y2=y2y2?y2:d->y2; if(x1>x2 || y1>y2) return; dd = d1.x*d2.y-d1.y*d2.x; @@ -684,7 +646,7 @@ void mglCanvas::quad_draw(long k1, long k2, long k3, long k4, mglDrawReg *d) p = p1+d1*u+d2*v+d3*(u*v); if(mgl_isnan(p.u) && !mgl_isnan(p.v)) { p.u = nr.x; p.v = nr.y; p.w = nr.z; } - pnt_plot(i,j,p.z,col2int(p,r)); + pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId); } } //----------------------------------------------------------------------------- @@ -698,7 +660,6 @@ void mglCanvas::trig_draw(long k1, long k2, long k3, bool anorm, mglDrawReg *d) fast_draw(k1,k2,d); fast_draw(k1,k3,d); fast_draw(k2,k3,d); return; } - clr(MGL_FINISHED); unsigned char r[4]; long y1,x1,y2,x2; float dxu,dxv,dyu,dyv; @@ -714,8 +675,8 @@ void mglCanvas::trig_draw(long k1, long k2, long k3, bool anorm, mglDrawReg *d) y1 = long(fmin(fmin(p1.y,p2.y),p3.y)); x2 = long(fmax(fmax(p1.x,p2.x),p3.x)); y2 = long(fmax(fmax(p1.y,p2.y),p3.y)); - x1=x1>d->x1?x1:d->x1; x2=x2x2?x2:d->x2-1; - y1=y1>d->y1?y1:d->y1; y2=y2y2?y2:d->y2-1; + x1=x1>d->x1?x1:d->x1; x2=x2x2?x2:d->x2; + y1=y1>d->y1?y1:d->y1; y2=y2y2?y2:d->y2; if(x1>x2 || y1>y2) return; // default normale mglPoint nr = mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z); @@ -733,30 +694,34 @@ void mglCanvas::trig_draw(long k1, long k2, long k3, bool anorm, mglDrawReg *d) p = p1+d1*u+d2*v; if(mgl_isnan(p.u) && !mgl_isnan(p.v) && anorm) { p.u = nr.x; p.v = nr.y; p.w = nr.z; } - pnt_plot(i,j,p.z,col2int(p,r)); + pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId); } - else pnt_plot(i,j,p1.z,col2int(p1,r)); + else pnt_plot(i,j,p1.z,col2int(p1,r,d->ObjId),d->ObjId); } } //----------------------------------------------------------------------------- void mglCanvas::line_draw(long k1, long k2, mglDrawReg *dr) { + if(k1>k2) { long kk=k1; k1=k2; k2=kk; } // rearrange start/end for proper dashing if(!(Quality&3)) { fast_draw(k1,k2,dr); return; } - clr(MGL_FINISHED); unsigned char r[4]; long y1,x1,y2,x2; - float pw=PenWidth*sqrt(font_factor/400), dxu,dxv,dyu,dyv,dd,dpw=3; - if(ObjId==HighId) { pw *= 2; dpw=2; } + float pw=dr->PenWidth, dxu,dxv,dyu,dyv,dd,dpw=3; + float dz = Width>2 ? 1 : 1e-5*Width; // provide additional height to be well visible on the surfaces + + if(dr->ObjId==HighId) { pw *= 2; dpw=2; } const mglPnt &p1=Pnt[k1], &p2=Pnt[k2]; mglPnt d=p2-p1, p; bool hor = fabs(d.x)>fabs(d.y); x1 = long(fmin(p1.x,p2.x)); y1 = long(fmin(p1.y,p2.y)); // bounding box x2 = long(fmax(p1.x,p2.x)); y2 = long(fmax(p1.y,p2.y)); - x1=x1>dr->x1?x1:dr->x1; x2=x2x2?x2:dr->x2-1; - y1=y1>dr->y1?y1:dr->y1; y2=y2y2?y2:dr->y2-1; - dd = sqrt(d.x*d.x + d.y*d.y); + x1 -= pw+3.5; x2 += pw+3.5; + y1 -= pw+3.5; y2 += pw+3.5; + x1=x1>dr->x1?x1:dr->x1; x2=x2x2?x2:dr->x2; + y1=y1>dr->y1?y1:dr->y1; y2=y2y2?y2:dr->y2; + dd = hypot(d.x, d.y); if(x1>x2 || y1>y2 || dd<1e-5) return; dxv = d.y/dd; dyv =-d.x/dd; @@ -770,39 +735,39 @@ void mglCanvas::line_draw(long k1, long k2, mglDrawReg *dr) { y1 = int(p1.y+d.y*(i-p1.x)/d.x - pw - 3.5); y2 = int(p1.y+d.y*(i-p1.x)/d.x + pw + 3.5); - y1=y1>dr->y1?y1:dr->y1; y2=y2y2?y2:dr->y2-1; + y1=y1>dr->y1?y1:dr->y1; y2=y2y2?y2:dr->y2; if(y1>y2) continue; for(j=y1;j<=y2;j++) { xx = (i-p1.x); yy = (j-p1.y); u = dxu*xx+dyu*yy; v = dxv*xx+dyv*yy; v = v*v; - if(u<0) { v += u*u; u = 0; } - else if(u>dd) { v += (u-dd)*(u-dd); u = dd; } + if(u<0) v += u*u; + else if(u>dd) v += (u-dd)*(u-dd); if(v>pw*pw) continue; - if(!( PDef & ( 1<PDef & ( 1<pPos+u/pw/1.5, 16)) ) )) continue; + p = p1+d*(u/dd); col2int(p,r,dr->ObjId); r[3] = v<(pw-1)*(pw-1)/4 ? 255 : (unsigned char)(255/cosh(dpw*(sqrt(v)+(1-pw)/2))); - pnt_plot(i,j,p.z+pw,r); + pnt_plot(i,j,p.z+dz,r,dr->ObjId); } } else for(j=y1;j<=y2;j++) { x1 = int(p1.x+d.x*(j-p1.y)/d.y - pw - 3.5); x2 = int(p1.x+d.x*(j-p1.y)/d.y + pw + 3.5); - x1=x1>dr->x1?x1:dr->x1; x2=x2x2?x2:dr->x2-1; + x1=x1>dr->x1?x1:dr->x1; x2=x2x2?x2:dr->x2; if(x1>x2) continue; for(i=x1;i<=x2;i++) { xx = (i-p1.x); yy = (j-p1.y); u = dxu*xx+dyu*yy; v = dxv*xx+dyv*yy; v = v*v; - if(u<0) { v += u*u; u = 0; } - else if(u>dd) { v += (u-dd)*(u-dd); u = dd; } + if(u<0) v += u*u; + else if(u>dd) v += (u-dd)*(u-dd); if(v>pw*pw) continue; - if(!(PDef & (1<PDef & (1<pPos+u/pw/1.5, 16))))) continue; + p = p1+d*(u/dd); col2int(p,r,dr->ObjId); r[3] = v<(pw-1)*(pw-1)/4 ? 255 : (unsigned char)(255/cosh(dpw*(sqrt(v)+(1-pw)/2))); - pnt_plot(i,j,p.z+pw,r); + pnt_plot(i,j,p.z+dz,r,dr->ObjId); } } set(aa,MGL_ENABLE_ALPHA); @@ -810,13 +775,11 @@ void mglCanvas::line_draw(long k1, long k2, mglDrawReg *dr) //----------------------------------------------------------------------------- void mglCanvas::fast_draw(long k1, long k2, mglDrawReg *dr) { - clr(MGL_FINISHED); const mglPnt &p1=Pnt[k1], &p2=Pnt[k2]; mglPnt d=p2-p1; - unsigned char r[4]; col2int(p1,r); + unsigned char r[4]; col2int(p1,r,dr->ObjId); long y1,x1,y2,x2; - float pw = PenWidth*sqrt(font_factor/400); bool hor = fabs(d.x)>fabs(d.y); x1 = long(fmin(p1.x,p2.x)); y1 = long(fmin(p1.y,p2.y)); // bounding box @@ -826,27 +789,28 @@ void mglCanvas::fast_draw(long k1, long k2, mglDrawReg *dr) if(x1>x2 || y1>y2) return; register long i, c; - if(hor) for(i=x1;i<=x2;i++) + if(hor && d.x!=0) for(i=x1;i<=x2;i++) { c = long(p1.y+d.y*(i-p1.x)/d.x); if(c>=y1 && c<=y2) - pnt_plot(i, c, p1.z+d.z*(i-p1.x)/d.x+pw, r); + pnt_plot(i, c, p1.z+d.z*(i-p1.x)/d.x, r,dr->ObjId); } - else for(i=y1;i<=y2;i++) + else if(d.y!=0) for(i=y1;i<=y2;i++) { c = long(p1.x+d.x*(i-p1.y)/d.y); if(c>=x1 && c<=x2) - pnt_plot(c, i, p1.z+d.z*(i-p1.y)/d.y+pw, r); + pnt_plot(c, i, p1.z+d.z*(i-p1.y)/d.y, r,dr->ObjId); } } //----------------------------------------------------------------------------- void mglCanvas::pnt_draw(long k, mglDrawReg *dr) { register long i,j,s,x,y; - register float v,pw=2*PenWidth*sqrt(font_factor/400),dpw=3; - if(ObjId==HighId) { pw *= 2; dpw=2; } + register float v,pw=2*dr->PenWidth*sqrt(font_factor/400),dpw=3; + if(dr->ObjId==HighId) { pw *= 2; dpw=2; } const mglPnt &p=Pnt[k]; - unsigned char cs[4], cc; col2int(p,cs); cc = cs[3]; + unsigned char cs[4], cc; + col2int(p,cs,dr->ObjId); cc = cs[3]; if(cc==0) return; s = long(5.5+fabs(pw)); for(j=-s;j<=s;j++) for(i=-s;i<=s;i++) @@ -857,26 +821,29 @@ void mglCanvas::pnt_draw(long k, mglDrawReg *dr) if(cs[3]==0) continue; x=p.x+i; y=p.y+j; if(x>=dr->x1 && x<=dr->x2 && y>=dr->y1 && y<=dr->y2) - pnt_plot(p.x+i,p.y+j,p.z,cs); + pnt_plot(p.x+i,p.y+j,p.z,cs,dr->ObjId); } } //----------------------------------------------------------------------------- void mglCanvas::mark_draw(long k, char type, mreal size, mglDrawReg *d) { const mglPnt &q=Pnt[k]; - unsigned char cs[4]; col2int(q,cs); cs[3] = size>0 ? 255 : 255*q.t; - unsigned long pos = Pnt.size(), qos=pos; + unsigned char cs[4]; col2int(q,cs,d->ObjId); cs[3] = size>0 ? 255 : 255*q.t; mglPnt p=q; - mreal ss=fabs(size)*0.35*font_factor; + mreal ss=fabs(size); register long i,j; #if MGL_HAVE_PTHREAD pthread_mutex_lock(&mutexPnt); #endif + size_t pos = Pnt.size(), qos=pos; if(type=='.' || ss==0) pnt_draw(k,d); else { - mreal pw = PenWidth; PenWidth = 1; - int pd = PDef; PDef = 0xffff; + if(d) + { + d->PDef = 0xffff; d->PenWidth*=fabs(50*size); + if(d->PenWidth<1) d->PenWidth=1; + } if(!strchr("xsSoO",type)) ss *= 1.1; switch(type) { @@ -986,8 +953,8 @@ void mglCanvas::mark_draw(long k, char type, mreal size, mglDrawReg *d) for(j=long(-ss);j<=long(ss);j++) for(i=long(-ss);i<=long(ss);i++) { register long x=long(q.x)+i, y=long(q.y)+j; - if(i*i+j*j>=ss*ss || xx1 || x>d->x2 || yy1 || y>d->y2) continue; - pnt_plot(x,y,q.z+1,cs); + if(i*i+j*j>=ss*ss || !d || xx1 || x>d->x2 || yy1 || y>d->y2) continue; + pnt_plot(x,y,q.z+1,cs,d->ObjId); } case 'o': for(i=0;i<=20;i++) @@ -1005,7 +972,6 @@ void mglCanvas::mark_draw(long k, char type, mreal size, mglDrawReg *d) } break; } - PDef = pd; PenWidth = pw; Pnt.erase(Pnt.begin()+pos,Pnt.end()); } #if MGL_HAVE_PTHREAD @@ -1015,17 +981,38 @@ void mglCanvas::mark_draw(long k, char type, mreal size, mglDrawReg *d) //----------------------------------------------------------------------------- void mglCanvas::glyph_draw(const mglPrim *P, mglDrawReg *d) { - mglPnt p=Pnt[P->n1]; - mreal f = p.w; + mglPnt p=Pnt[P->n1], q=Pnt[P->n2]; + // scale direction for new view/zoom + float dv = (1-Bp.pf)/(1-Bp.pf*q.z/Depth); + float x,y,z,c=Bp.pf/(1-Bp.pf)/Depth,ll,phi=P->w; + x = Bp.b[0]*q.u + Bp.b[1]*q.v + Bp.b[2]*q.w; + y = Bp.b[3]*q.u + Bp.b[4]*q.v + Bp.b[5]*q.w; + z = Bp.b[6]*q.u + Bp.b[7]*q.v + Bp.b[8]*q.w; + +// register float d = (1-Bp.pf)/(1-Bp.pf*p.z/Depth); +// p.x = Width/2 + d*p.x; p.y = Height/2 + d*p.y; + + // po = (pn-w/2)/dv, dr = dv*dx+po*((1-pf)*pf/depth/(1-...)^2)*dz + + x += (q.x-Width/2)*z*c*dv; + y += (q.y-Height/2)*z*c*dv; + ll = x*x+y*y; + if(ll < 1e-10) return; + if(ll==ll) phi = -atan2(y,x)*180/M_PI; + + mreal pf=sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2), f = P->p*pf; #if MGL_HAVE_PTHREAD pthread_mutex_lock(&mutexPnt); #endif Push(); B.clear(); - B.b[0] = B.b[4] = B.b[8] = P->s*P->p; - RotateN(P->w,0,0,1); B.pf = P->p; - B.x=p.x; B.y=p.y; B.z=p.z; + B.b[0] = B.b[4] = B.b[8] = P->s; +// mreal cw=cos(phi), sw=-sin(phi); +// mreal tet = 180/M_PI*atan2(-Bp.b[3]*cw-Bp.b[4]*sw, Bp.b[0]*cw+Bp.b[1]*sw); + RotateN(phi,0,0,1); + B.x=p.x; B.y=p.y; B.z=p.z; B.pf = 1; + p.u *= pf; p.v *= pf; - int ss=P->n3&3; + const mglGlyph &g = Glf[P->n4]; if(P->n3&8) { if(!(P->n3&4)) glyph_line(p,f,true, d); @@ -1033,8 +1020,8 @@ void mglCanvas::glyph_draw(const mglPrim *P, mglDrawReg *d) } else { - if(!(P->n3&4)) glyph_fill(p,f,fnt->GetNt(ss,P->n4),fnt->GetTr(ss,P->n4), d); - glyph_wire(p,f,fnt->GetNl(ss,P->n4),fnt->GetLn(ss,P->n4), d); + if(!(P->n3&4)) glyph_fill(p,f,g, d); + glyph_wire(p,f,g, d); } Pop(); #if MGL_HAVE_PTHREAD @@ -1042,65 +1029,59 @@ void mglCanvas::glyph_draw(const mglPrim *P, mglDrawReg *d) #endif } //----------------------------------------------------------------------------- -void mglCanvas::glyph_fill(const mglPnt &pp, mreal f, int nt, const short *trig, mglDrawReg *d) +void mglCanvas::glyph_fill(const mglPnt &pp, mreal f, const mglGlyph &g, mglDrawReg *d) { - if(!trig || nt<=0) return; + if(!g.trig || g.nt<=0) return; long ik,ii,pos=Pnt.size(); mglPnt p=pp; p.u=p.v=NAN; - mreal pw = Width>2 ? fabs(PenWidth) : 1e-5*Width; - mglPoint p1,p2,p3; - for(ik=0;ikPDef = 0xffff; d->PenWidth=0.75; } mglPoint p1,p2; - for(ik=0;ik2 ? fabs(PenWidth) : 1e-5*Width; - unsigned pdef=PDef; PDef = 0xffff; - mreal opw=PenWidth; PenWidth=1; + if(d) { d->PDef = 0xffff; d->PenWidth=1; } mglPoint p1,p2,p3,p4; long pos=Pnt.size(); @@ -1110,10 +1091,10 @@ void mglCanvas::glyph_line(const mglPnt &pp, mreal f, bool solid, mglDrawReg *d) p3 = mglPoint(fabs(f)+pp.u,pp.v+dy,0); PostScale(p3); p4 = mglPoint(fabs(f)+pp.u,pp.v-dy,0); PostScale(p4); - p.x = p1.x; p.y = p1.y; p.z = p1.z+(solid?pw:0); Pnt.push_back(p); - p.x = p2.x; p.y = p2.y; p.z = p2.z+(solid?pw:0); Pnt.push_back(p); - p.x = p3.x; p.y = p3.y; p.z = p3.z+(solid?pw:0); Pnt.push_back(p); - p.x = p4.x; p.y = p4.y; p.z = p4.z+(solid?pw:0); Pnt.push_back(p); + p.x = p1.x; p.y = p1.y; p.z = p1.z; Pnt.push_back(p); + p.x = p2.x; p.y = p2.y; p.z = p2.z; Pnt.push_back(p); + p.x = p3.x; p.y = p3.y; p.z = p3.z; Pnt.push_back(p); + p.x = p4.x; p.y = p4.y; p.z = p4.z; Pnt.push_back(p); if(solid) quad_draw(pos,pos+1,pos+3,pos+2,d); else @@ -1121,7 +1102,135 @@ void mglCanvas::glyph_line(const mglPnt &pp, mreal f, bool solid, mglDrawReg *d) line_draw(pos,pos+1,d); line_draw(pos+2,pos+1,d); line_draw(pos,pos+3,d); line_draw(pos+2,pos+3,d); } - PDef = pdef; PenWidth=opw; Pnt.erase(Pnt.begin()+pos,Pnt.end()); } //----------------------------------------------------------------------------- +long mglCanvas::setPp(mglPnt &q, const mglPoint &p) +{ + q.xx=q.x=p.x; q.yy=q.y=p.y; q.zz=q.z=p.z; + MGL_PUSH(Pnt,q,mutexPnt); + return Pnt.size()-1; +} +//----------------------------------------------------------------------------- +void mglCanvas::arrow_draw(long n1, long n2, char st, float ll) +{ + if(n1<0 || n2<0 || !strchr("AVKSDTIO",st)) return; + const mglPnt &p1=Pnt[n1], &p2=Pnt[n2]; + mglPnt q=p1; //q.u=q.v=q.w=0; + + mglPoint kl=mglPoint(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z), kt, p0=mglPoint(p1.x,p1.y,p1.z), p; + mreal d = hypot(kl.x,kl.y); + if(d==0) return; + kl /= d; kt = !kl; + kl *= ll; kt *= ll; + + Reserve(8); + long k1,k2,k3,k4; + + switch(st) // S,D -- cube, T -- sq.pyramid, I -- square, O -- sphere???, A,K,V -- cone??? + { + case 'I': + k1=setPp(q,p0+kt); k2=setPp(q,p0-kt); line_plot(k1,k2); break; + case 'D': + k1=setPp(q,p0+kl); k2=setPp(q,p0-kl); k3=setPp(q,p0+kt); k4=setPp(q,p0-kt); + trig_plot(k1,k2,k3); trig_plot(k1,k2,k4); break; + case 'S': + k1=setPp(q,p0+kl+kt); k2=setPp(q,p0+kl-kt); + k3=setPp(q,p0-kl-kt); k4=setPp(q,p0-kl+kt); + quad_plot(k1,k2,k4,k3); break; + case 'T': + k1=setPp(q,p0-kl+kt); k2=setPp(q,p0-kl-kt); k3=setPp(q,p0+kl); + trig_plot(k1,k2,k3); break; + case 'K': + k1=setPp(q,p0+kt); k2=setPp(q,p0-kt); line_plot(k1,k2); + case 'A': + k1=setPp(q,p0-2.*kl+kt); k2=setPp(q,p0-2.*kl-kt); k3=setPp(q,p0-1.5*kl); + trig_plot(n1,k3,k1); trig_plot(n1,k3,k2); break; + case 'V': + k1=setPp(q,p0+2.*kl+kt); k2=setPp(q,p0+2.*kl-kt); k3=setPp(q,p0+1.5*kl); + trig_plot(n1,k3,k1); trig_plot(n1,k3,k2); break; + case 'O': // let draw icosahedron + { + const int n = 12; k1=setPp(q,p0+kl); + for(int i=1;i<=n;i++) + { + mreal u = 2*i*M_PI/n; + k2 = k1; k1 = setPp(q,p0+kl*cos(u)+kt*sin(u)); + trig_plot(n1,k1,k2); + } + break; + } + } +} +//----------------------------------------------------------------------------- +void mglCanvas::arrow_plot_3d(long n1, long n2, char st, float ll) +{ + if(n1<0 || n2<0 || !strchr("AVKSDTIO",st)) return; + const mglPnt &p1=Pnt[n1], &p2=Pnt[n2]; + mglPnt q=p1; //q.u=q.v=q.w=0; + + mglPoint kl=mglPoint(p1.x-p2.x,p1.y-p2.y,p1.z-p2.z), kt, kz, p0=mglPoint(p1.x,p1.y,p1.z), p; + if(kl.norm()==0) return; + kl.Normalize(); kt = !kl; kz = kl^kt; + kl *= ll; kt *= ll; kz *= ll; + + Reserve(8); + long k1,k2,k3,k4,k5, k6,k7,k8; + + switch(st) // S,D -- cube, T -- sq.pyramid, I -- square, O -- sphere???, A,K,V -- cone??? + { + case 'I': + k1=setPp(q,p0+kt); k2=setPp(q,p0+kz); + k3=setPp(q,p0-kt); k4=setPp(q,p0-kz); + quad_plot(k1,k2,k4,k3); break; + case 'D': + k1=setPp(q,p0+kl); k2=setPp(q,p0-kl); k5=k3=setPp(q,p0+kt); + k4=setPp(q,p0+kz); trig_plot(k1,k3,k4); trig_plot(k2,k3,k4); k3=k4; + k4=setPp(q,p0-kt); trig_plot(k1,k3,k4); trig_plot(k2,k3,k4); k3=k4; + k4=setPp(q,p0-kz); trig_plot(k1,k3,k4); trig_plot(k2,k3,k4); k3=k4; + trig_plot(k1,k3,k5); trig_plot(k2,k3,k5); break; + case 'S': + k1=setPp(q,p0+kl+kt); k2=setPp(q,p0+kl+kz); k3=setPp(q,p0+kl-kt); k4=setPp(q,p0+kl-kz); + k5=setPp(q,p0-kl+kt); k6=setPp(q,p0-kl+kz); k7=setPp(q,p0-kl-kt); k8=setPp(q,p0-kl-kz); + quad_plot(k1,k2,k4,k3); quad_plot(k1,k2,k5,k6); quad_plot(k3,k2,k7,k6); + quad_plot(k1,k4,k5,k8); quad_plot(k3,k4,k7,k8); quad_plot(k5,k6,k8,k7); break; + case 'T': + k1=setPp(q,p0-kl+kt); k2=setPp(q,p0-kl+kz); k3=setPp(q,p0-kl-kt); + k4=setPp(q,p0-kl-kz); k5=setPp(q,p0+kl); + trig_plot(k1,k2,k5); trig_plot(k2,k3,k5); + trig_plot(k3,k4,k5); trig_plot(k1,k4,k5); break; + case 'K': + k1=setPp(q,p0+kt); k2=setPp(q,p0+kz); + k3=setPp(q,p0-kt); k4=setPp(q,p0-kz); quad_plot(k1,k2,k4,k3); + case 'A': + k1=setPp(q,p0-2.*kl+kt); k2=setPp(q,p0-2.*kl+kz); k3=setPp(q,p0-2.*kl-kt); + k4=setPp(q,p0-2.*kl-kz); k5=setPp(q,p0-1.5*kl); + trig_plot(n1,k5,k1); trig_plot(n1,k5,k2); + trig_plot(n1,k5,k3); trig_plot(n1,k5,k4); break; + case 'V': + k1=setPp(q,p0+2.*kl+kt); k2=setPp(q,p0+2.*kl+kz); k3=setPp(q,p0+2.*kl-kt); + k4=setPp(q,p0+2.*kl-kz); k5=setPp(q,p0+1.5*kl); + trig_plot(n1,k5,k1); trig_plot(n1,k5,k2); + trig_plot(n1,k5,k3); trig_plot(n1,k5,k4); break; + case 'O': // let draw icosahedron + { + const int n = 12, m = n/2; Reserve(n*m); + register long i,j; + long *nn=new long[2*n], n1=setPp(q,p0+kl), n2=setPp(q,p0-kl); + mreal u,v,rr; + for(i=0;i0 && i0) quad_plot(nn[j-1], nn[j], nn[j+n-1], nn[j+n]); + } + delete []nn; break; + } + } +} +//----------------------------------------------------------------------------- diff --git a/src/plot.cpp b/src/plot.cpp index 4dcc56b..c68c474 100644 --- a/src/plot.cpp +++ b/src/plot.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * plot.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -30,12 +30,13 @@ void mgl_fplot(HMGL gr, const char *eqY, const char *pen, const char *opt) if(eqY==0 || eqY[0]==0) return; // nothing to plot mreal r = gr->SaveState(opt); long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5); + long nm = gr->FaceNum?gr->FaceNum*n:10000, nd = gr->FaceNum?gr->FaceNum*10:1000; mreal *x = (mreal *)malloc(n*sizeof(mreal)); mreal *y = (mreal *)malloc(n*sizeof(mreal)); mglFormula *eq = new mglFormula(eqY); register int i; - mreal d = (gr->Max.x - gr->Min.x)/(n-1.), xs, ys, yr, ym=fabs(gr->Max.y - gr->Min.y)/1000; + mreal d = (gr->Max.x - gr->Min.x)/(n-1.), xs, ys, yr, ym=fabs(gr->Max.y - gr->Min.y)/nd; #define islog(a, b) (((a)>0 && (b)>10*(a)) || ((b)<0 && (a)<10*(b))) // initial data filling if(gr->Min.x>0 && gr->Max.x>100*gr->Min.x) for(i=0,d=log(2*gr->Max.x/gr->Min.x)/(n-1);iMin.x + i*d; y[i]=eq->Calc(x[i]); } - for(i=0;iStop) { delete eq; return; } xs=(x[i]+x[i+1])/2; @@ -160,7 +161,7 @@ void mgl_radar(HMGL gr, HCDT a, const char *pen, const char *opt) x.a[n+(n+1)*j] = r+a->v(0,j); y.a[n+(n+1)*j] = 0; } mgl_plot_xy(gr,&x,&y,pen,0); - if(pen && strchr(pen,'#')) // draw "grid" + if(mglchr(pen,'#')) // draw "grid" { m = 1.1*(a->Maximal()+r); x.Create(2); y.Create(2); @@ -201,7 +202,7 @@ void mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const c static int cgid=1; gr->StartGroup("Candle",cgid++); gr->SaveState(opt); gr->SetPenPal(pen,&pal); gr->NextColor(pal); gr->Reserve(8*n); - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); long n1,n2,n3,n4; mreal m1,m2,xx,x1,x2,d; @@ -230,6 +231,7 @@ void mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const c if(sh) gr->NextColor(pal); } if(d1) delete y1; if(d2) delete y2; + gr->EndGroup(); } //----------------------------------------------------------------------------- void mgl_candle_yv(HMGL gr, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt) @@ -280,7 +282,7 @@ void mgl_plot_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char * bool t1,t2,t3; mglPoint p1,nn,p2,pt; long n1=-1,n2=-1,n3=-1; - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); for(j=0;jline_plot(n1,n2); - if(i==0) gr->arrow_plot(n1,n2,gr->Arrow1); + if(i==1) gr->arrow_plot(n2,n1,gr->Arrow1); if(i==n-1) gr->arrow_plot(n1,n2,gr->Arrow2); } if(i>0 && ((t1 && !t2) || (t2 && !t1))) // do smoothing { mreal i1=0, i2=1, ii; - t3=t1; n3=n1; // copy current + mglPoint q(NAN),p; do { ii = (i1+i2)/2; pt.x = p1.x*ii+p2.x*(1-ii); pt.y = p1.y*ii+p2.y*(1-ii); - pt.z = p1.z*ii+p2.z*(1-ii); - n1 = gr->AddPnt(pt); t1 = n1>=0; - if((t1 && t3) || (t2 && !t1)) i2 = ii; + pt.z = p1.z*ii+p2.z*(1-ii); p=pt; + t3 = gr->ScalePoint(p,q,false); + if((t1 && t3) || (t2 && !t3)) i2 = ii; else i1 = ii; } while(fabs(i2-i1)>1e-3); - if(t2) gr->line_plot(n1,n2); - else gr->line_plot(n3,n1); + n3 = gr->AddPnt(pt,-1,q,-1,2); + if(t2) gr->line_plot(n3,n2); + else gr->line_plot(n1,n3); } if(sh) gr->NextColor(pal); } @@ -394,26 +397,27 @@ void mgl_tens_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *pen, cons if(t1 && t2) { gr->line_plot(n1,n2); - if(i==0) gr->arrow_plot(n1,n2,gr->Arrow1); + if(i==1) gr->arrow_plot(n2,n1,gr->Arrow1); if(i==n-1) gr->arrow_plot(n1,n2,gr->Arrow2); } if(i>0 && ((t1 && !t2) || (t2 && !t1))) // do smoothing { mreal i1=0, i2=1, ii; - t3=t1; n3=n1; // copy current + mglPoint q(NAN),p; do { ii = (i1+i2)/2; pt.x = p1.x*ii+p2.x*(1-ii); pt.y = p1.y*ii+p2.y*(1-ii); - pt.z = p1.z*ii+p2.z*(1-ii); + pt.z = p1.z*ii+p2.z*(1-ii); p=pt; pt.c = p1.c*ii+p2.c*(1-ii); - n1 = gr->AddPnt(pt,gr->GetC(ss,pt.c)); t1 = n1>=0; - if((t1 && t3) || (t2 && !t1)) i2 = ii; + t3 = gr->ScalePoint(p,q,false); + if((t1 && t3) || (t2 && !t3)) i2 = ii; else i1 = ii; } while(fabs(i2-i1)>1e-3); - if(t2) gr->line_plot(n1,n2); - else gr->line_plot(n3,n1); + n3 = gr->AddPnt(pt,gr->GetC(ss,pt.c),q,-1,2); + if(t2) gr->line_plot(n3,n2); + else gr->line_plot(n1,n3); } } } @@ -468,8 +472,8 @@ void mgl_area_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char * gr->SaveState(opt); static int cgid=1; gr->StartGroup("Area3",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; - bool sh = pen && strchr(pen,'!'); - bool wire = pen && strchr(pen,'#'); + bool sh = mglchr(pen,'!'); + bool wire = mglchr(pen,'#'); mreal z0=gr->GetOrgZ('x'); mreal c1,c2; @@ -517,8 +521,8 @@ void mgl_area_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) mreal c1,c2; mglPoint nn=mglPoint(0,0,1); long n1,n2,n3,n4; - bool sh = pen && strchr(pen,'!'); - bool wire = pen && strchr(pen,'#'); + bool sh = mglchr(pen,'!'); + bool wire = mglchr(pen,'#'); gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); // long s=gr->AddTexture(pen,1); @@ -590,8 +594,8 @@ void mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen, const cha long n1,n2,n3,n4; mreal xx,f1,f2,f3,f4; mreal zm = gr->AdjustZMin(); - bool inside = (pen && strchr(pen,'i')); // NOTE: check if 'i' is free (used here for inside flag) - bool sh = pen && strchr(pen,'!'); + bool inside = (mglchr(pen,'i')); // NOTE: check if 'i' is free (used here for inside flag) + bool sh = mglchr(pen,'!'); gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); // long s=gr->AddTexture(pen,1); @@ -650,7 +654,7 @@ void mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char * gr->SaveState(opt); static int cgid=1; gr->StartGroup("Step3",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); long n1,n2; @@ -667,7 +671,7 @@ void mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char * n2 = n1; // horizontal p = mglPoint(x->v(i,mx), y->v(i,my), z->v(i-1,mz)); n1 = gr->AddPnt(p); gr->line_plot(n1,n2); - if(i==1) gr->arrow_plot(n1,n2,gr->Arrow1); + if(i==1) gr->arrow_plot(n2,n1,gr->Arrow1); n2 = n1; // vertical p.z = z->v(i,mz); n1 = gr->AddPnt(p); @@ -688,7 +692,7 @@ void mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) gr->SaveState(opt); static int cgid=1; gr->StartGroup("Step",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); mreal zVal =gr->AdjustZMin(); char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); @@ -706,7 +710,7 @@ void mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) n2 = n1; // horizontal p = mglPoint(x->v(i,mx), y->v(i-1,my), zVal); n1 = gr->AddPnt(p); gr->line_plot(n1,n2); - if(i==1) gr->arrow_plot(n1,n2,gr->Arrow1); + if(i==1) gr->arrow_plot(n2,n1,gr->Arrow1); n2 = n1; // vertical p.y = y->v(i,my); n1 = gr->AddPnt(p); @@ -755,7 +759,7 @@ void mgl_stem_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char * gr->SaveState(opt); static int cgid=1; gr->StartGroup("Stem3",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); mreal z0=gr->GetOrgZ('x'); char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); @@ -785,7 +789,7 @@ void mgl_stem_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) gr->SaveState(opt); static int cgid=1; gr->StartGroup("Stem",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); mreal zVal = gr->AdjustZMin(), y0=gr->GetOrgY('x'), vv; char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); @@ -844,10 +848,10 @@ void mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char * gr->SaveState(opt); static int cgid=1; gr->StartGroup("Bars3",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); - bool wire = pen && strchr(pen,'#'); - bool above = pen && strchr(pen,'a'), fall = pen && strchr(pen,'f'); + bool wire = mglchr(pen,'#'); + bool above = mglchr(pen,'a'), fall = mglchr(pen,'f'); if(above) fall = false; mreal c1,c2,c; mglPoint p1,p2,p3,p4,nn; @@ -911,10 +915,10 @@ void mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) gr->SaveState(opt); static int cgid=1; gr->StartGroup("Bars",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); - bool wire = pen && strchr(pen,'#'); - bool above = pen && strchr(pen,'a'), fall = pen && strchr(pen,'f'); + bool wire = mglchr(pen,'#'); + bool above = mglchr(pen,'a'), fall = mglchr(pen,'f'); if(above) fall = false; mreal c1,c2,c; long n1,n2,n3,n4; @@ -995,10 +999,10 @@ void mgl_barh_yx(HMGL gr, HCDT y, HCDT v, const char *pen, const char *opt) gr->SaveState(opt); static int cgid=1; gr->StartGroup("Barh",cgid++); m = y->GetNy() > v->GetNy() ? y->GetNy() : v->GetNy(); - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); - bool wire = pen && strchr(pen,'#'); - bool above = pen && strchr(pen,'a'), fall = pen && strchr(pen,'f'); + bool wire = mglchr(pen,'#'); + bool above = mglchr(pen,'a'), fall = mglchr(pen,'f'); if(above) fall = false; mreal c1,c2,c; long n1,n2,n3,n4; @@ -1082,7 +1086,7 @@ void mgl_boxplot_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) static int cgid=1; gr->StartGroup("BoxPlot",cgid++); mreal *b = new mreal[5*n], *d = new mreal[m], x1, x2, dd; mreal zVal = gr->AdjustZMin(), vv; - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); register long i,j; for(i=0;iGetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = ex->GetNy() > m ? ex->GetNy() : m; m = ey->GetNy() > m ? ey->GetNy() : m; - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); - bool ma = pen && strchr(pen,'@'); + bool ma = mglchr(pen,'@'); char mk = gr->SetPenPal(pen,&pal); mreal zVal=gr->AdjustZMin(), vx, vy, ve, vf; gr->Reserve(5*n*m); @@ -1386,15 +1390,15 @@ void mgl_chart(HMGL gr, HCDT a, const char *cols, const char *opt) if(a->Minimal()<0) { gr->SetWarn(mglWarnNeg,"Chart"); return; } gr->SaveState(opt); static int cgid=1; gr->StartGroup("Chart",cgid++); - bool wire = cols && strchr(cols,'#'); // draw edges + bool wire = mglchr(cols,'#'); // draw edges register long n=a->GetNx(),i,j=0; if(cols) for(i=0;iAddTexture(cols[i]); nc++; } mreal dy = (gr->Max.y-gr->Min.y)/a->GetNy(), dx, ss, cs, x1, y1, dz=gr->Max.z-gr->Min.z, vv; @@ -1439,7 +1443,7 @@ void mgl_chart_(uintptr_t *gr, uintptr_t *a, const char *col, const char *opt,in void mgl_mark_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, const char *opt) { long j,m,mx,my,mz,mr,n=y->GetNx(),pal; - if(mgl_check_dim1(gr,x,y,z,r,"Mark")) return; + if(mgl_check_dim0(gr,x,y,z,r,"Mark")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Mark",cgid++); @@ -1447,7 +1451,7 @@ void mgl_mark_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, cons m = z->GetNy() > m ? z->GetNy() : m; char mk=gr->SetPenPal(pen,&pal); gr->Reserve(n*m); if(mk==0) return; - bool sh = pen && strchr(pen,'!'); + bool sh = mglchr(pen,'!'); for(j=0;jGetNx(); - if(n<2) { gr->SetWarn(mglWarnLow,"Mark"); return; } gr->SaveState(opt); mglData x(n), z(n); x.Fill(gr->Min.x,gr->Max.x); @@ -1515,10 +1518,10 @@ void mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, con m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; m = r->GetNy() > m ? r->GetNy() : m; - bool sh = pen && strchr(pen,'!'); - bool wire = pen && strchr(pen,'#'); + bool sh = mglchr(pen,'!'); + bool wire = mglchr(pen,'#'); - const int num=41; + const int num=24; gr->SetPenPal(pen,&pal); gr->Reserve(n*m*num); mglPoint p,l,t,u,q,d; @@ -1574,7 +1577,7 @@ void mgl_tube_r(HMGL gr, HCDT y, HCDT r, const char *pen, const char *opt) gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_tube(HMGL gr, HCDT y, mreal rr, const char *pen, const char *opt) +void mgl_tube(HMGL gr, HCDT y, double rr, const char *pen, const char *opt) { register long n=y->GetNx(); if(n<2) { gr->SetWarn(mglWarnLow,"Tube"); return; } @@ -1587,7 +1590,7 @@ void mgl_tube(HMGL gr, HCDT y, mreal rr, const char *pen, const char *opt) gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_tube_xy(HMGL gr, HCDT x, HCDT y, mreal rr, const char *pen, const char *opt) +void mgl_tube_xy(HMGL gr, HCDT x, HCDT y, double rr, const char *pen, const char *opt) { register long n=y->GetNx(); if(n<2) { gr->SetWarn(mglWarnLow,"Tube"); return; } @@ -1599,7 +1602,7 @@ void mgl_tube_xy(HMGL gr, HCDT x, HCDT y, mreal rr, const char *pen, const char gr->LoadState(); } //----------------------------------------------------------------------------- -void mgl_tube_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, mreal rr, const char *pen, const char *opt) +void mgl_tube_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, double rr, const char *pen, const char *opt) { gr->SaveState(opt); mglData r(y->GetNx()); @@ -1656,7 +1659,7 @@ void mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char * gr->SetPenPal(pen,&pal); gr->Reserve(4*n*m); mglPoint p1,p2,q1,q2,l,nn,qn=mglPoint(NAN,NAN); long n1=-1,n2=-1,n3=-1,n4=-1, m1=-1,m2=-1,m3=-1,m4=-1; - bool sh = pen && strchr(pen,'!'), xo = pen && strchr(pen,'x'), zo = pen && strchr(pen,'z'), wire = pen && strchr(pen,'#'); + bool sh = mglchr(pen,'!'), xo = mglchr(pen,'x'), zo = mglchr(pen,'z'), wire = mglchr(pen,'#'); if(!xo && !zo) xo = zo = true; mreal c1,c2; diff --git a/src/prc.cpp b/src/prc.cpp index 9969922..45ba529 100644 --- a/src/prc.cpp +++ b/src/prc.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - * export_3d.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * prc.cpp is part of Math Graphic Library + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -76,7 +76,7 @@ struct prctriangles { return pPoint->second; else { - const uint32_t point_index = points.size(); + const uint32_t point_index = (uint32_t)points.size(); points.insert(std::make_pair(point,point_index)); return point_index; } @@ -91,7 +91,7 @@ struct prctriangles { return pPoint->second; else { - const uint32_t point_index = points.size(); + const uint32_t point_index = (uint32_t)points.size(); points.insert(std::make_pair(point,point_index)); return point_index; } @@ -107,6 +107,28 @@ struct prctriangles { } } + void addTriangle(uint32_t ti, uint32_t pi1, uint32_t pi2, uint32_t pi3) + { + prctriangle triangle; + triangle.pi[0] = pi1; + triangle.pi[1] = pi2; + triangle.pi[2] = pi3; + triangle.ti[0] = ti; + triangle.ti[1] = ti; + triangle.ti[2] = ti; + triangles.push_back(triangle); + } + void addTriangle(uint32_t pi1, uint32_t ti1, uint32_t pi2, uint32_t ti2, uint32_t pi3, uint32_t ti3) + { + prctriangle triangle; + triangle.pi[0] = pi1; + triangle.pi[1] = pi2; + triangle.pi[2] = pi3; + triangle.ti[0] = ti1; + triangle.ti[1] = ti2; + triangle.ti[2] = ti3; + triangles.push_back(triangle); + } uint32_t addColourInfo(const mglPnt& p) { const RGBAColour colour(p.r,p.g,p.b,p.a); @@ -114,15 +136,15 @@ struct prctriangles { if (colours.empty() && texturecoords.empty()) { commoncolour = colour; commonalpha = p.a; - } - if (samecolour) { - if (commoncolour != colour) - samecolour = false; - } - if (samealpha) { - if (commonalpha != p.a) - samealpha = false; - } + } + if (samecolour) { + if (commoncolour != colour) + samecolour = false; + } + if (samealpha) { + if (commonalpha != p.a) + samealpha = false; + } if (vertexcolor) { std::map::iterator pColour = colours.find(colour); @@ -130,13 +152,14 @@ struct prctriangles { return pColour->second; else { - const uint32_t colour_index = colours.size(); + const uint32_t colour_index = (uint32_t)colours.size(); colours.insert(std::make_pair(colour,colour_index)); return colour_index; } } else { - const float u = p.ta; - const float v = 1 - p.c/ntxt; + const mreal gap = 1./512; + const double u = p.ta*(1-2*gap)+gap; + const double v = ((p.c-floor(p.c))*(1-2*gap) + gap + floor(p.c))/ntxt; const PRCVector2d point(u, v); std::map::iterator pPoint = texturecoords.find(point); @@ -144,7 +167,7 @@ struct prctriangles { return pPoint->second; else { - const uint32_t point_index = texturecoords.size(); + const uint32_t point_index = (uint32_t)texturecoords.size(); texturecoords.insert(std::make_pair(point,point_index)); return point_index; } @@ -200,24 +223,24 @@ void my_png_flush(png_structp /*png_ptr*/) { } //----------------------------------------------------------------------------- -void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pdf) +void mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/, int make_pdf) { - if(gr->GetPrmNum()<=0) return; // nothing to do + if(gr->GetPrmNum()==0) return; // nothing to do { - long m1=0,m2=0,m; + long mmin=0,mmax=0,m; for(size_t i=0;iGrp.size();i++) // prepare array of indirect indexing - { m = gr->Grp[i].Id; if(mm2) m2=m; } - long *ng = new long[m2-m1+1]; - for(size_t i=0;iGrp.size();i++) ng[gr->Grp[i].Id-m1] = i; + { m = gr->Grp[i].Id; if(mmmax) mmax=m; } + long *ng = new long[mmax-mmin+1]; + for(size_t i=0;iGrp.size();i++) ng[gr->Grp[i].Id-mmin] = i; for(size_t i=0;iGetPrmNum());i++) // collect data for groups // it is rather expensive (extra 4b per primitive) but need for export to 3D { - m = gr->GetPrm(i).id-m1; - if(m>=0 && mGrp[ng[m]].p.push_back(i); + m = gr->GetPrm(i).id-mmin; + if(m>=0 && mGrp[ng[m]].p.push_back(i); } delete []ng; } - const unsigned len=strlen(fname); + const size_t len=strlen(fname); char * const tname = new char[len+9]; strcpy(tname,fname); if (strncmp(tname+len-4, ".prc", 4)!=0) { @@ -250,13 +273,13 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd const size_t ntxt = gr->GetTxtNum(); // prepare texture file (PNG) - const png_uint_32 width=256, height=256*ntxt; + const png_uint_32 width=256, height=256*png_uint_32(ntxt); png_bytep buf = new png_byte[4*width*height]; png_bytepp pbuf= new png_bytep[height]; for(size_t i=0;iGetTxt(i).GetRGBA(buf+i*256*256*4); + gr->GetTxt(i).GetRGBA(buf+(ntxt-1-i)*256*width*4); png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,0,0,0); png_infop info_ptr = png_create_info_struct(png_ptr); @@ -274,14 +297,28 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd png_destroy_write_struct(&png_ptr, &info_ptr); delete []pbuf; delete []buf; - const PRCmaterial materialMathGL( - RGBAColour(0.1,0.1,0.1,1), // ambient - RGBAColour(1.0,1.0,1.0,1), // diffuse - RGBAColour(0.1,0.1,0.1,1), // emissive - RGBAColour(0.0,0.0,0.0,1), // spectral - 1.0,0.1, // alpha, shininess - buffer.data, KEPRCPicture_PNG, 0, 0, buffer.size, true); - materialMathGLid = file.addMaterial(materialMathGL); + + PRCtexture* t = new PRCtexture(); + t->mapping = PRC_TEXTURE_MAPPING_DIFFUSE; + t->components = PRC_TEXTURE_MAPPING_COMPONENTS_RGBA; + // Modulate for OBJ compatibilty, Replace is a better setting + t->function = KEPRCTextureFunction_Replace; + // Repeat for OBJ compatibilty, ClampToEdge is a better setting + t->wrapping_mode_S = KEPRCTextureWrappingMode_ClampToEdge; + t->wrapping_mode_T = KEPRCTextureWrappingMode_ClampToEdge; + t->data = buffer.data; + t->size = buffer.size; + t->format = KEPRCPicture_PNG; + + PRCmaterial m( + RGBAColour(0.0,0.0,0.0,1), // ambient + RGBAColour(1.0,1.0,1.0,1), // diffuse + RGBAColour(0.0,0.0,0.0,1), // emissive + RGBAColour(0.0,0.0,0.0,1), // spectral + 1.0,0.1); // alpha, shininess + + materialMathGLid = file.addTexturedMaterial(m,1,&t); + free(buffer.data); buffer.data = NULL; } @@ -298,22 +335,26 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd for(size_t i=0;iGrp.size();i++) { - const std::vector& p = gr->Grp[i].p; + mglGroup& grp = gr->Grp[i]; + std::vector& prm = grp.p; prctriangles group(gr); - file.begingroup(gr->Grp[i].Lbl.c_str(),&grpopt); - for(size_t j=0;jGetPrm(p[j]); + const mglPrim &q=gr->GetPrm(prm[j]); const double w = (q.w>1)?(q.w*sqrt(gr->FontFactor()/400.)):1; const mglPnt p = gr->GetPnt(q.n1) - p0; - const float size = q.s*gr->FontFactor(); + const mreal size = q.s*gr->FontFactor(); { - char type = q.n4; float ss=size*0.35; - const RGBAColour c(p.r, p.g, p.b, p.a); switch(q.type) { case 0: + if (gr->GetPnt(q.n1).a > mgl_min_a) { + const char type = q.n4; + float ss=size*0.35; + const RGBAColour c(p.r, p.g, p.b, p.a); + if(!strchr("xsSoO",type)) ss *= 1.1; if(type=='.' || ss==0) { @@ -401,21 +442,8 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd const uint32_t pi3 = group.addPoint(p.x-ss,p.y+ss,p.z); const uint32_t pi4 = group.addPoint(p.x+ss,p.y+ss,p.z); - prctriangle triangle1, triangle2; - triangle1.pi[0] = pi1; - triangle1.pi[1] = pi2; - triangle1.pi[2] = pi3; - triangle1.ti[0] = ti; - triangle1.ti[1] = ti; - triangle1.ti[2] = ti; - group.triangles.push_back(triangle1); - triangle2.pi[0] = pi4; - triangle2.pi[1] = pi3; - triangle2.pi[2] = pi2; - triangle2.ti[0] = ti; - triangle2.ti[1] = ti; - triangle2.ti[2] = ti; - group.triangles.push_back(triangle2); + group.addTriangle(ti, pi1, pi2, pi3); + group.addTriangle(ti, pi4, pi3, pi2); } break; case 's': @@ -440,21 +468,8 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd const uint32_t pi3 = group.addPoint(p.x-ss,p.y,p.z); const uint32_t pi4 = group.addPoint(p.x,p.y+ss,p.z); - prctriangle triangle1, triangle2; - triangle1.pi[0] = pi1; - triangle1.pi[1] = pi2; - triangle1.pi[2] = pi3; - triangle1.ti[0] = ti; - triangle1.ti[1] = ti; - triangle1.ti[2] = ti; - group.triangles.push_back(triangle1); - triangle2.pi[0] = pi4; - triangle2.pi[1] = pi3; - triangle2.pi[2] = pi2; - triangle2.ti[0] = ti; - triangle2.ti[1] = ti; - triangle2.ti[2] = ti; - group.triangles.push_back(triangle2); + group.addTriangle(ti, pi1, pi2, pi3); + group.addTriangle(ti, pi4, pi3, pi2); } break; case 'd': @@ -518,14 +533,7 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd const uint32_t pi2 = group.addPoint(p.x+ss,p.y-ss/2,p.z); const uint32_t pi3 = group.addPoint(p.x,p.y+ss,p.z); - prctriangle triangle; - triangle.pi[0] = pi1; - triangle.pi[1] = pi2; - triangle.pi[2] = pi3; - triangle.ti[0] = ti; - triangle.ti[1] = ti; - triangle.ti[2] = ti; - group.triangles.push_back(triangle); + group.addTriangle(ti, pi1, pi2, pi3); } break; case '^': @@ -548,14 +556,7 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd const uint32_t pi2 = group.addPoint(p.x,p.y-ss,p.z); const uint32_t pi3 = group.addPoint(p.x+ss,p.y+ss/2,p.z); - prctriangle triangle; - triangle.pi[0] = pi1; - triangle.pi[1] = pi2; - triangle.pi[2] = pi3; - triangle.ti[0] = ti; - triangle.ti[1] = ti; - triangle.ti[2] = ti; - group.triangles.push_back(triangle); + group.addTriangle(ti, pi1, pi2, pi3); } break; case 'v': @@ -578,14 +579,7 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd const uint32_t pi2 = group.addPoint(p.x-ss, p.y, p.z); const uint32_t pi3 = group.addPoint(p.x+ss/2,p.y-ss,p.z); - prctriangle triangle; - triangle.pi[0] = pi1; - triangle.pi[1] = pi2; - triangle.pi[2] = pi3; - triangle.ti[0] = ti; - triangle.ti[1] = ti; - triangle.ti[2] = ti; - group.triangles.push_back(triangle); + group.addTriangle(ti, pi1, pi2, pi3); } break; case '<': @@ -608,14 +602,7 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd const uint32_t pi2 = group.addPoint(p.x-ss/2,p.y-ss,p.z); const uint32_t pi3 = group.addPoint(p.x+ss, p.y, p.z); - prctriangle triangle; - triangle.pi[0] = pi1; - triangle.pi[1] = pi2; - triangle.pi[2] = pi3; - triangle.ti[0] = ti; - triangle.ti[1] = ti; - triangle.ti[2] = ti; - group.triangles.push_back(triangle); + group.addTriangle(ti, pi1, pi2, pi3); } break; case '>': @@ -635,18 +622,11 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd const uint32_t ti = group.addColourInfo(p); const uint32_t cpi=group.addPoint(p); - uint32_t pi[21]; - for(size_t j=0;j<=20;j++) - pi[j]=group.addPoint(p.x+ss*cos(j*M_PI/10),p.y+ss*sin(j*M_PI/10),p.z); - for(size_t j=0;j<=20;j++) { - prctriangle triangle; - triangle.pi[0] = pi[j]; - triangle.pi[1] = pi[j+1]; - triangle.pi[2] = cpi; - triangle.ti[0] = ti; - triangle.ti[1] = ti; - triangle.ti[2] = ti; - group.triangles.push_back(triangle); + uint32_t pnti[21]; + for(size_t k=0;k<=20;k++) + pnti[k]=group.addPoint(p.x+ss*cos(k*M_PI/10),p.y+ss*sin(k*M_PI/10),p.z); + for(size_t k=0;k<=20;k++) { + group.addTriangle(ti, pnti[k], pnti[k+1], cpi); } } break; @@ -658,110 +638,199 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd case 'o': { double P[21][3]; - for(size_t j=0;j<=20;j++) { - P[j][0] = p.x+ss*cos(j*M_PI/10); - P[j][1] = p.y+ss*sin(j*M_PI/10); - P[j][2] = p.z; + for(size_t k=0;k<=20;k++) { + P[k][0] = p.x+ss*cos(k*M_PI/10); + P[k][1] = p.y+ss*sin(k*M_PI/10); + P[k][2] = p.z; } file.addLine(21, P, c, w); } break; + } + } + break; + + case 1: + if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a) { + const mglPnt p1 = gr->GetPnt(q.n1) - p0, p2 = gr->GetPnt(q.n2) - p0; + + const uint32_t n = 2; + double P[2][3]; + P[0][0] = p1.x; + P[0][1] = p1.y; + P[0][2] = p1.z; + P[1][0] = p2.x; + P[1][1] = p2.y; + P[1][2] = p2.z; + const RGBAColour colour((p1.r+p2.r)/2, (p1.g+p2.g)/2, (p1.b+p2.b)/2, (p1.a+p2.a)/2); + file.addLine(n, P, colour, w); + } + break; + + case 2: + if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a || gr->GetPnt(q.n3).a > mgl_min_a) { + const mglPnt p1 = gr->GetPnt(q.n1) - p0, p2 = gr->GetPnt(q.n2) - p0, p3 = gr->GetPnt(q.n3) - p0; + + prctriangle triangle; + triangle.pi[0] = group.addPoint(p1); + triangle.pi[1] = group.addPoint(p2); + triangle.pi[2] = group.addPoint(p3); + triangle.ti[0] = group.addColourInfo(p1); + triangle.ti[1] = group.addColourInfo(p2); + triangle.ti[2] = group.addColourInfo(p3); + group.triangles.push_back(triangle); + } + break; + case 3: + if (gr->GetPnt(q.n1).a > mgl_min_a || gr->GetPnt(q.n2).a > mgl_min_a || gr->GetPnt(q.n3).a > mgl_min_a || gr->GetPnt(q.n4).a > mgl_min_a) { + const mglPnt p1 = gr->GetPnt(q.n1) - p0; + const uint32_t pi1 = group.addPoint(p1); + const uint32_t ti1 = group.addColourInfo(p1); + + const mglPnt p2 = gr->GetPnt(q.n2) - p0; + const uint32_t pi2 = group.addPoint(p2); + const uint32_t ti2 = group.addColourInfo(p2); + + const mglPnt p3 = gr->GetPnt(q.n3) - p0; + const uint32_t pi3 = group.addPoint(p3); + const uint32_t ti3 = group.addColourInfo(p3); + + const mglPnt p4 = gr->GetPnt(q.n4) - p0; + const uint32_t pi4 = group.addPoint(p4); + const uint32_t ti4 = group.addColourInfo(p4); + + prctriangle triangle1, triangle2; + triangle1.pi[0] = pi1; + triangle1.pi[1] = pi2; + triangle1.pi[2] = pi3; + triangle1.ti[0] = ti1; + triangle1.ti[1] = ti2; + triangle1.ti[2] = ti3; + group.triangles.push_back(triangle1); + triangle2.pi[0] = pi4; + triangle2.pi[1] = pi3; + triangle2.pi[2] = pi2; + triangle2.ti[0] = ti4; + triangle2.ti[1] = ti3; + triangle2.ti[2] = ti2; + group.triangles.push_back(triangle2); + } + break; + case 4: + if (gr->GetPnt(q.n1).a > mgl_min_a) { + const mglPnt p = gr->GetPnt(q.n1) - p0; + + const mreal f = q.p/2, dx=p.u/2, dy=p.v/2; + const mreal c=q.s*cos(q.w*M_PI/180), s=-q.s*sin(q.w*M_PI/180); + const double b[4] = {c,-s, s,c}; + long ik,il=0; + + const mglGlyph &g = gr->GetGlf(q.n4); + const mreal dd = 0.004; + if(q.n3&8) + { + if(!(q.n3&4)) // glyph_line(p,f,true, d); + { + const uint32_t ti = group.addColourInfo(p); + const uint32_t p_4 = group.addPoint(p.x+b[0]*dx+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z); + const uint32_t p_3 = group.addPoint(p.x+b[0]*dx+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z); + const uint32_t p_2 = group.addPoint(p.x+b[0]*(dx+f)+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z); + const uint32_t p_1 = group.addPoint(p.x+b[0]*(dx+f)+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z); + + group.addTriangle(ti, p_1, p_3, p_2); + group.addTriangle(ti, p_4, p_2, p_3); } - break; - - case 1: - { - const mglPnt p1 = gr->GetPnt(q.n1) - p0, p2 = gr->GetPnt(q.n2) - p0; - - const uint32_t n = 2; - double P[2][3]; - P[0][0] = p1.x; - P[0][1] = p1.y; - P[0][2] = p1.z; - P[1][0] = p2.x; - P[1][1] = p2.y; - P[1][2] = p2.z; - const RGBAColour colour((p1.r+p2.r)/2, (p1.g+p2.g)/2, (p1.b+p2.b)/2, (p1.a+p2.a)/2); - file.addLine(n, P, colour, w); - } - break; - - case 2: + else // glyph_line(p,f,false, d); + { + const RGBAColour c(p.r, p.g, p.b, p.a); + const double p_4[3] = {p.x+b[0]*dx+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z}; + const double p_3[3] = {p.x+b[0]*dx+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z}; + const double p_2[3] = {p.x+b[0]*(dx+f)+b[1]*(dy-dd),p.y+b[2]*dx+b[3]*(dy-dd),p.z}; + const double p_1[3] = {p.x+b[0]*(dx+f)+b[1]*(dy+dd),p.y+b[2]*dx+b[3]*(dy+dd),p.z}; + + file.addSegment(p_1, p_2, c, w); + file.addSegment(p_3, p_4, c, w); + file.addSegment(p_1, p_3, c, w); + file.addSegment(p_2, p_4, c, w); + } + } + else + { + if(!(q.n3&4)) // glyph_fill(p,f,g, d); + { + for(ik=0;ikGetPnt(q.n1) - p0, p2 = gr->GetPnt(q.n2) - p0, p3 = gr->GetPnt(q.n3) - p0; - - prctriangle triangle; - triangle.pi[0] = group.addPoint(p1); - triangle.pi[1] = group.addPoint(p2); - triangle.pi[2] = group.addPoint(p3); - triangle.ti[0] = group.addColourInfo(p1); - triangle.ti[1] = group.addColourInfo(p2); - triangle.ti[2] = group.addColourInfo(p3); - group.triangles.push_back(triangle); + const uint32_t ti = group.addColourInfo(p); + mreal x,y; + x = dx+f*g.trig[6*ik]; y = dy+f*g.trig[6*ik+1]; + const uint32_t p_3 = group.addPoint(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z); + x = dx+f*g.trig[6*ik+2]; y = dy+f*g.trig[6*ik+3]; + const uint32_t p_2 = group.addPoint(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z); + x = dx+f*g.trig[6*ik+4]; y = dy+f*g.trig[6*ik+5]; + const uint32_t p_1 = group.addPoint(p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z); + + group.addTriangle(ti, p_1, p_3, p_2); } - break; - case 3: + } + else // glyph_wire(p,f,g, d); + { + const RGBAColour c(p.r, p.g, p.b, p.a); + for(ik=0;ikGetPnt(q.n1) - p0; - const uint32_t pi1 = group.addPoint(p1); - const uint32_t ti1 = group.addColourInfo(p1); - - const mglPnt p2 = gr->GetPnt(q.n2) - p0; - const uint32_t pi2 = group.addPoint(p2); - const uint32_t ti2 = group.addColourInfo(p2); - - const mglPnt p3 = gr->GetPnt(q.n3) - p0; - const uint32_t pi3 = group.addPoint(p3); - const uint32_t ti3 = group.addColourInfo(p3); - - const mglPnt p4 = gr->GetPnt(q.n4) - p0; - const uint32_t pi4 = group.addPoint(p4); - const uint32_t ti4 = group.addColourInfo(p4); - - prctriangle triangle1, triangle2; - triangle1.pi[0] = pi1; - triangle1.pi[1] = pi2; - triangle1.pi[2] = pi3; - triangle1.ti[0] = ti1; - triangle1.ti[1] = ti2; - triangle1.ti[2] = ti3; - group.triangles.push_back(triangle1); - triangle2.pi[0] = pi4; - triangle2.pi[1] = pi3; - triangle2.pi[2] = pi2; - triangle2.ti[0] = ti4; - triangle2.ti[1] = ti3; - triangle2.ti[2] = ti2; - group.triangles.push_back(triangle2); + mreal x,y; + x = g.line[2*ik]; y = g.line[2*ik+1]; + if(x==0x3fff && y==0x3fff) // line breakthrough + { il = ik+1; continue; } + else if(ik==g.nl-1 || (g.line[2*ik+2]==0x3fff && g.line[2*ik+3]==0x3fff)) + { // enclose the circle. May be in future this block should be commented + x = dx+f*g.line[2*ik]; y = dy+f*g.line[2*ik+1]; + const double p_2[3] = {p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z}; + x = dx+f*g.line[2*il]; y = dy+f*g.line[2*il+1]; + const double p_1[3] = {p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z}; + file.addSegment(p_1, p_2, c, w); + } + else + { // normal line + x = dx+f*g.line[2*ik]; y = dy+f*g.line[2*ik+1]; + const double p_2[3] = {p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z}; + x = dx+f*g.line[2*ik+2]; y = dy+f*g.line[2*ik+3]; + const double p_1[3] = {p.x+b[0]*x+b[1]*y,p.y+b[2]*x+b[3]*y,p.z}; + file.addSegment(p_1, p_2, c, w); + } + } - break; - case 4: break; // TODO: add glyphs export later + } + } + + } + break; + } } } if (!group.triangles.empty()) { - const uint32_t nP = group.points.size(); + const uint32_t nP = (uint32_t)group.points.size(); double (*P)[3] = new double[nP][3]; group.writePoints(P); - const uint32_t nI = group.triangles.size(); + const uint32_t nI = (uint32_t)group.triangles.size(); uint32_t (*PI)[3] = new uint32_t[nI][3]; - for(uint32_t i = 0; iget(MGL_PREFERVC)) { - const uint32_t nC = group.colours.size(); + const uint32_t nC = (uint32_t)group.colours.size(); RGBAColour *C = new RGBAColour[nC]; group.writeColours(C); uint32_t (*CI)[3] = new uint32_t[nI][3]; - for(uint32_t i = 0; iGrp[i].p.clear(); // we don't need indexes anymore + prm.clear(); // we don't need indexes anymore } file.finish(); if (make_pdf) { #if MGL_HAVE_PDF - const HPDF_REAL width = dynamic_cast(gr)->GetWidth(); - const HPDF_REAL height = dynamic_cast(gr)->GetHeight(); - const HPDF_REAL depth = sqrt(width*height); +// const HPDF_REAL width = dynamic_cast(gr)->GetWidth(); +// const HPDF_REAL height = dynamic_cast(gr)->GetHeight(); +// const HPDF_REAL depth = sqrt(width*height); const HPDF_Rect rect = {0, 0, width, height}; @@ -861,24 +930,25 @@ void mgl_write_prc(HMGL gr, const char *fname,const char */*descr*/, int make_pd // Create annotation annot = HPDF_Page_Create3DAnnot (page, rect, u3d ); - // Enable toolbar - HPDF_Dict action = (HPDF_Dict)HPDF_Dict_GetItem (annot, "3DA", HPDF_OCLASS_DICT); - HPDF_Dict_AddBoolean (action, "TB", HPDF_TRUE); + // Enable toolbar + HPDF_Dict action = (HPDF_Dict)HPDF_Dict_GetItem (annot, "3DA", HPDF_OCLASS_DICT); + HPDF_Dict_AddBoolean (action, "TB", HPDF_TRUE); /* save the document to a file */ - const size_t len = strlen(tname); - tname[len-2]='p'; tname[len-2]='d'; tname[len-1]='f'; + const size_t tlen = strlen(tname); + tname[tlen-2]='p'; tname[tlen-2]='d'; tname[tlen-1]='f'; HPDF_SaveToFile (pdf, tname); /* clean up */ HPDF_Free (pdf); #else - const size_t len = strlen(tname); - tname[len-2]='p'; tname[len-2]='d'; tname[len-1]='f'; - tname[len+0]='.'; tname[len+1]='t'; tname[len+2]='x'; tname[len+3]='t'; tname[len+4]='\0'; + const size_t tlen = strlen(tname); + tname[tlen-2]='p'; tname[tlen-2]='d'; tname[tlen-1]='f'; + tname[tlen+0]='.'; tname[tlen+1]='t'; tname[tlen+2]='x'; tname[tlen+3]='t'; tname[tlen+4]='\0'; FILE *fp=fopen(tname,"wt"); fputs("Can not produce PDF file, MathGL compiled without PDF output support\n", fp); fclose(fp); + mglGlobalMess += "PDF support was disabled. Please, enable it and rebuild MathGL.\n"; #endif // MGL_HAVE_PDF } delete []tname; diff --git a/src/prc/PRC.h b/src/prc/PRC.h index 9ce6ea7..78ee1bd 100644 --- a/src/prc/PRC.h +++ b/src/prc/PRC.h @@ -12,6 +12,8 @@ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; #endif // _MSC_VER >= 1600 +#elif defined __BORLANDC__ +#include #else #include #endif // _MSC_VER diff --git a/src/prc/PRCbitStream.cc b/src/prc/PRCbitStream.cc index bb013dc..2781508 100644 --- a/src/prc/PRCbitStream.cc +++ b/src/prc/PRCbitStream.cc @@ -23,6 +23,7 @@ #include #include #include +#include #include "PRCbitStream.h" #include "PRCdouble.h" diff --git a/src/prc/PRCbitStream.h b/src/prc/PRCbitStream.h index 6714258..f240baf 100644 --- a/src/prc/PRCbitStream.h +++ b/src/prc/PRCbitStream.h @@ -33,6 +33,8 @@ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; #endif // _MSC_VER >= 1600 +#elif defined __BORLANDC__ +#include #else #include #endif // _MSC_VER diff --git a/src/prc/oPRCFile.cc b/src/prc/oPRCFile.cc index 2a7dcc8..b090f8a 100644 --- a/src/prc/oPRCFile.cc +++ b/src/prc/oPRCFile.cc @@ -39,7 +39,7 @@ #define SerializeCompressedUniqueId( value ) (value).serializeCompressedUniqueId(out); #define SerializeContentPRCBase write(out); #define SerializeRgbColor( value ) (value).serializeRgbColor(out); -#define SerializePicture( value ) (value).serializePicture(out); +#define SerializePicture( value ) (value)->serializePicture(out); #define SerializeTextureDefinition( value ) (value)->serializeTextureDefinition(out); #define SerializeMarkup( value ) (value)->serializeMarkup(out); #define SerializeAnnotationEntity( value ) (value)->serializeAnnotationEntity(out); @@ -57,16 +57,9 @@ #define SerializeGeometrySummary( value ) (value)->serializeGeometrySummary(out); #define SerializeContextGraphics( value ) (value)->serializeContextGraphics(out); #define SerializeStartHeader serializeStartHeader(out); -#define SerializeUncompressedFiles \ - { \ - const uint32_t number_of_uncompressed_files = uncompressed_files.size(); \ - WriteUncompressedUnsignedInteger (number_of_uncompressed_files) \ - for(PRCUncompressedFileList::const_iterator it = uncompressed_files.begin(); it != uncompressed_files.end(); it++) \ - { \ - WriteUncompressedUnsignedInteger ((*it)->file_size) \ - WriteUncompressedBlock ((*it)->data, (*it)->file_size) \ - } \ - } +#define SerializeUncompressedFile( value ) (value)->serializeUncompressedFile(out); +#define SerializeUncompressedFiles serializeUncompressedFiles(out); + #define SerializeModelFileData serializeModelFileData(modelFile_out); modelFile_out.compress(); #define SerializeUnit( value ) (value).serializeUnit(out); @@ -276,21 +269,6 @@ void makeAppUUID(PRCUniqueId& UUID) UUID.id0 = UUID.id1 = UUID.id2 = UUID.id3 = 0; } -void PRCUncompressedFile::write(ostream &out) const -{ - if(data!=NULL) - { - WriteUncompressedUnsignedInteger (file_size) - out.write((char*)data,file_size); - } -} - -uint32_t PRCUncompressedFile::getSize() const -{ - return sizeof(file_size)+file_size; -} - - void PRCStartHeader::serializeStartHeader(ostream &out) const { WriteUncompressedBlock ("PRC",3) @@ -300,11 +278,26 @@ void PRCStartHeader::serializeStartHeader(ostream &out) const SerializeFileStructureUncompressedUniqueId( application_uuid ); } +void PRCStartHeader::serializeUncompressedFiles(ostream &out) const +{ + const uint32_t number_of_uncompressed_files = uncompressed_files.size(); + WriteUncompressedUnsignedInteger (number_of_uncompressed_files) + for (uint32_t i=0; igetSize(); + return size; +} void PRCFileStructure::write(ostream &out) { @@ -329,8 +322,7 @@ void PRCFileStructure::prepare() uint32_t size = 0; size += getStartHeaderSize(); size += sizeof(uint32_t); - for(PRCUncompressedFileList::const_iterator it = uncompressed_files.begin(); it != uncompressed_files.end(); it++) - size += (*it)->getSize(); + size += getUncompressedFilesSize(); sizes[0]=size; SerializeFileStructureGlobals @@ -394,8 +386,7 @@ uint32_t PRCHeader::getSize() for(uint32_t i = 0; i < number_of_file_structures; ++i) size += fileStructureInformation[i].getSize(); size += 3*sizeof(uint32_t); - for(PRCUncompressedFileList::const_iterator it = uncompressed_files.begin(); it != uncompressed_files.end(); it++) - size += (*it)->getSize(); + size += getUncompressedFilesSize(); return size; } @@ -987,10 +978,11 @@ std::string oPRCFile::calculate_unique_name(const ContentPRCBase *prc_entity,con // WriteUnsignedInteger (unique_identifier) serialization << prc_occurence->getPRCID(); } - ss << (prc_entity->name.empty()?"node":prc_entity->name) << '.'; + ss << (prc_entity->name.empty()?"node":prc_entity->name.c_str()) << '.'; const uint32_t size_serialization = serialization.getSize(); for(size_t j=0; jfile_size = size; - uncompressed_files.back()->data = data; - picture.format = format; - picture.uncompressed_file_index = uncompressed_files.size()-1; - picture.pixel_width = 0; // width and height are ignored for JPG and PNG pictures - but let us keep things clean - picture.pixel_height = 0; - pictures.push_back(picture); - return pictures.size()-1; } - - switch(format) + else { - case KEPRCPicture_BITMAP_RGB_BYTE: - components = 3; break; - case KEPRCPicture_BITMAP_RGBA_BYTE: - components = 4; break; - case KEPRCPicture_BITMAP_GREY_BYTE: - components = 1; break; - case KEPRCPicture_BITMAP_GREYA_BYTE: - components = 2; break; - default: + uint32_t components=0; + switch(format) + { + case KEPRCPicture_BITMAP_RGB_BYTE: + components = 3; break; + case KEPRCPicture_BITMAP_RGBA_BYTE: + components = 4; break; + case KEPRCPicture_BITMAP_GREY_BYTE: + components = 1; break; + case KEPRCPicture_BITMAP_GREYA_BYTE: + components = 2; break; + default: { cerr << "unknown picture format" << endl; return m1; } - } - if(width==0 || height==0) + } + if(width==0 || height==0) { cerr << "width or height parameter not set" << endl; return m1; } - if (size < width*height*components) + if (size < width*height*components) { cerr << "image too small" << endl; return m1; } - - { - uint32_t compressedDataSize = 0; - const int CHUNK= 1024; // is this reasonable? - - z_stream strm; - strm.zalloc = Z_NULL; - strm.zfree = Z_NULL; - strm.opaque = Z_NULL; - if(deflateInit(&strm,Z_DEFAULT_COMPRESSION) != Z_OK) - { cerr << "Compression initialization failed" << endl; return m1; } - unsigned int sizeAvailable = deflateBound(&strm,size); - uint8_t *compressedData = (uint8_t*) malloc(sizeAvailable); - strm.avail_in = size; - strm.next_in = (unsigned char*)p; - strm.next_out = (unsigned char*)compressedData; - strm.avail_out = sizeAvailable; - - int code; - unsigned int chunks = 0; - while((code = deflate(&strm,Z_FINISH)) == Z_OK) - { - ++chunks; - // strm.avail_out should be 0 if we got Z_OK - compressedDataSize = sizeAvailable - strm.avail_out; - compressedData = (uint8_t*) realloc(compressedData,CHUNK*chunks); - strm.next_out = (Bytef*)(compressedData + compressedDataSize); - strm.avail_out += CHUNK; - sizeAvailable += CHUNK; - } - compressedDataSize = sizeAvailable-strm.avail_out; - - if(code != Z_STREAM_END) { + uint32_t compressedDataSize = 0; + const int CHUNK= 1024; // is this reasonable? + + z_stream strm; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + if(deflateInit(&strm,Z_DEFAULT_COMPRESSION) != Z_OK) + { cerr << "Compression initialization failed" << endl; return m1; } + unsigned int sizeAvailable = deflateBound(&strm,size); + uint8_t *compressedData = (uint8_t*) malloc(sizeAvailable); + strm.avail_in = size; + strm.next_in = (unsigned char*)p; + strm.next_out = (unsigned char*)compressedData; + strm.avail_out = sizeAvailable; + + int code; + unsigned int chunks = 0; + while((code = deflate(&strm,Z_FINISH)) == Z_OK) + { + ++chunks; + // strm.avail_out should be 0 if we got Z_OK + compressedDataSize = sizeAvailable - strm.avail_out; + compressedData = (uint8_t*) realloc(compressedData,CHUNK*chunks); + strm.next_out = (Bytef*)(compressedData + compressedDataSize); + strm.avail_out += CHUNK; + sizeAvailable += CHUNK; + } + compressedDataSize = sizeAvailable-strm.avail_out; + + if(code != Z_STREAM_END) + { + deflateEnd(&strm); + free(compressedData); + { cerr << "Compression error" << endl; return m1; } + } + deflateEnd(&strm); + size = compressedDataSize; + data = new uint8_t[compressedDataSize]; + memcpy(data, compressedData, compressedDataSize); free(compressedData); - { cerr << "Compression error" << endl; return m1; } } - - deflateEnd(&strm); - size = compressedDataSize; - data = new uint8_t[compressedDataSize]; - memcpy(data, compressedData, compressedDataSize); - free(compressedData); } - uncompressed_files.push_back(uncompressed_file); - uncompressed_files.back()->file_size = size; - uncompressed_files.back()->data = data; - picture.format = format; - picture.uncompressed_file_index = uncompressed_files.size()-1; - picture.pixel_width = width; - picture.pixel_height = height; - pictures.push_back(picture); - return pictures.size()-1; -} - -uint32_t PRCFileStructure::addTextureDefinition(PRCTextureDefinition*& pTextureDefinition) -{ - texture_definitions.push_back(pTextureDefinition); - pTextureDefinition = NULL; - return texture_definitions.size()-1; -} - -uint32_t PRCFileStructure::addRgbColor(const PRCRgbColor &color) -{ - colors.push_back(color); - return 3*(colors.size()-1); -} - -uint32_t PRCFileStructure::addRgbColorUnique(const PRCRgbColor &color) -{ - for(uint32_t i = 0; i < colors.size(); ++i) + + uint32_t uncompressed_file_index = m1; { - if(colors[i] == color) - return 3*i; + PRCUncompressedFile* uncompressed_file = new PRCUncompressedFile(size, data); + uncompressed_file_index = addUncompressedFileUnique(uncompressed_file); + delete[] data; } - colors.push_back(color); - return 3*(colors.size()-1); -} - -uint32_t oPRCFile::addColor(const PRCRgbColor &color) -{ - PRCcolorMap::const_iterator pColor = colorMap.find(color); - if(pColor!=colorMap.end()) - return pColor->second; -// color_index = addRgbColorUnique(color); - const uint32_t color_index = fileStructures[0]->addRgbColor(color); - colorMap.insert(make_pair(color,color_index)); - return color_index; + uint32_t picture_index = m1; + { + PRCPicture* picture = new PRCPicture(name); + picture->format = format; + picture->uncompressed_file_index = uncompressed_file_index; + picture->pixel_width = width; + picture->pixel_height = height; + picture_index = addPictureUnique(picture); + } + return picture_index; } uint32_t oPRCFile::addColour(const RGBAColour &colour) @@ -1206,7 +1163,7 @@ uint32_t oPRCFile::addColour(const RGBAColour &colour) PRCcolourMap::const_iterator pColour = colourMap.find(colour); if(pColour!=colourMap.end()) return pColour->second; - const uint32_t color_index = addColor(PRCRgbColor(colour.R, colour.G, colour.B)); + const uint32_t color_index = addRgbColorUnique(colour.R, colour.G, colour.B); PRCStyle *style = new PRCStyle(); style->line_width = 1.0; style->is_vpicture = false; @@ -1216,18 +1173,18 @@ uint32_t oPRCFile::addColour(const RGBAColour &colour) style->is_transparency_defined = (colour.A < 1.0); style->transparency = (uint8_t)(colour.A * 256); style->additional = 0; - const uint32_t style_index = fileStructures[0]->addStyle(style); + const uint32_t style_index = addStyle(style); colourMap.insert(make_pair(colour,style_index)); return style_index; } uint32_t oPRCFile::addColourWidth(const RGBAColour &colour, double width) { - RGBAColourWidth colourwidth(colour.R, colour.G, colour.B, colour.A, width); + const RGBAColourWidth colourwidth(colour.R, colour.G, colour.B, colour.A, width); PRCcolourwidthMap::const_iterator pColour = colourwidthMap.find(colourwidth); if(pColour!=colourwidthMap.end()) return pColour->second; - const uint32_t color_index = addColor(PRCRgbColor(colour.R, colour.G, colour.B)); + const uint32_t color_index = addRgbColorUnique(colour.R, colour.G, colour.B); PRCStyle *style = new PRCStyle(); style->line_width = width; style->is_vpicture = false; @@ -1237,7 +1194,7 @@ uint32_t oPRCFile::addColourWidth(const RGBAColour &colour, double width) style->is_transparency_defined = (colour.A < 1.0); style->transparency = (uint8_t)(colour.A * 256); style->additional = 0; - const uint32_t style_index = fileStructures[0]->addStyle(style); + const uint32_t style_index = addStyle(style); colourwidthMap.insert(make_pair(colourwidth,style_index)); return style_index; } @@ -1311,103 +1268,103 @@ uint32_t oPRCFile::addTransform(const double origin[3], const double x_axis[3], uint32_t oPRCFile::addMaterial(const PRCmaterial& m) { + PRCmaterialMap::const_iterator pMaterial = materialMap.find(m); + if(pMaterial!=materialMap.end()) + return pMaterial->second; + uint32_t material_index = m1; - const PRCmaterialgeneric materialgeneric(m); - PRCmaterialgenericMap::const_iterator pMaterialgeneric = materialgenericMap.find(materialgeneric); - if(pMaterialgeneric!=materialgenericMap.end()) - material_index = pMaterialgeneric->second; - else { - PRCMaterialGeneric *materialGeneric = new PRCMaterialGeneric(); - const PRCRgbColor ambient(m.ambient.R, m.ambient.G, m.ambient.B); - materialGeneric->ambient = addColor(ambient); - const PRCRgbColor diffuse(m.diffuse.R, m.diffuse.G, m.diffuse.B); - materialGeneric->diffuse = addColor(diffuse); - const PRCRgbColor emissive(m.emissive.R, m.emissive.G, m.emissive.B); - materialGeneric->emissive = addColor(emissive); - const PRCRgbColor specular(m.specular.R, m.specular.G, m.specular.B); - materialGeneric->specular = addColor(specular); + PRCMaterialGeneric *materialGeneric = new PRCMaterialGeneric; + materialGeneric->ambient = addRgbColorUnique(m.ambient.R, m.ambient.G, m.ambient.B); + materialGeneric->diffuse = addRgbColorUnique(m.diffuse.R, m.diffuse.G, m.diffuse.B); + materialGeneric->emissive = addRgbColorUnique(m.emissive.R, m.emissive.G, m.emissive.B); + materialGeneric->specular = addRgbColorUnique(m.specular.R, m.specular.G, m.specular.B); materialGeneric->shininess = m.shininess; - materialGeneric->ambient_alpha = m.ambient.A; - materialGeneric->diffuse_alpha = m.diffuse.A; + materialGeneric->ambient_alpha = m.ambient.A; + materialGeneric->diffuse_alpha = m.diffuse.A; materialGeneric->emissive_alpha = m.emissive.A; materialGeneric->specular_alpha = m.specular.A; - material_index = addMaterialGeneric(materialGeneric); - materialgenericMap.insert(make_pair(materialgeneric,material_index)); + material_index = addMaterialGenericUnique(materialGeneric); } - uint32_t color_material_index = m1; - if(m.picture_data!=NULL) + + uint32_t style_index = m1; { - uint32_t picture_index = m1; - PRCpicture picture(m); - PRCpictureMap::const_iterator pPicture = pictureMap.find(picture); - if(pPicture!=pictureMap.end()) - picture_index = pPicture->second; - else - { - picture_index = addPicture(picture); - uint8_t* data = new uint8_t[picture.size]; - memcpy(data,picture.data,picture.size); - picture.data = data; - pictureMap.insert(make_pair(picture,picture_index)); - } + PRCStyle *style = new PRCStyle; + style->line_width = m.width; + style->is_vpicture = false; + style->line_pattern_vpicture_index = 0; + style->is_material = true; + style->is_transparency_defined = (m.alpha < 1.0); + style->transparency = (uint8_t)(m.alpha * 256); + style->additional = 0; + style->color_material_index = material_index; + style_index = addStyleUnique(style); + } + materialMap.insert(make_pair(m,style_index)); + return style_index; +} + +uint32_t oPRCFile::addTexturedMaterial(const PRCmaterial& m, uint32_t n, const PRCtexture* const tt[]) +{ + uint32_t material_generic_index = m1; + { + PRCMaterialGeneric *materialGeneric = new PRCMaterialGeneric; + materialGeneric->ambient = addRgbColorUnique(m.ambient.R, m.ambient.G, m.ambient.B); + materialGeneric->diffuse = addRgbColorUnique(m.diffuse.R, m.diffuse.G, m.diffuse.B); + materialGeneric->emissive = addRgbColorUnique(m.emissive.R, m.emissive.G, m.emissive.B); + materialGeneric->specular = addRgbColorUnique(m.specular.R, m.specular.G, m.specular.B); + materialGeneric->shininess = m.shininess; + materialGeneric->ambient_alpha = m.ambient.A; + materialGeneric->diffuse_alpha = m.diffuse.A; + materialGeneric->emissive_alpha = m.emissive.A; + materialGeneric->specular_alpha = m.specular.A; + material_generic_index = addMaterialGenericUnique(materialGeneric); + } + + uint32_t color_material_index = material_generic_index; + uint32_t texture_application_index = m1; + for (uint32_t i=n; i>0; i--) { + const PRCtexture* t = tt[i-1]; + if (t == NULL) { + continue; + } + const uint32_t picture_index = addPicture(t->format, t->size, t->data, t->height, t->width); + uint32_t texture_definition_index = m1; - PRCtexturedefinition texturedefinition(picture_index, m); - PRCtexturedefinitionMap::const_iterator pTexturedefinition = texturedefinitionMap.find(texturedefinition); - if(pTexturedefinition!=texturedefinitionMap.end()) - texture_definition_index = pTexturedefinition->second; - else { - PRCTextureDefinition *TextureDefinition = new PRCTextureDefinition; - TextureDefinition->picture_index = picture_index; - TextureDefinition->texture_function = m.picture_replace ? KEPRCTextureFunction_Replace : KEPRCTextureFunction_Modulate; - TextureDefinition->texture_wrapping_mode_S = m.picture_repeat ? KEPRCTextureWrappingMode_Repeat : KEPRCTextureWrappingMode_ClampToEdge; - TextureDefinition->texture_wrapping_mode_T = m.picture_repeat ? KEPRCTextureWrappingMode_Repeat : KEPRCTextureWrappingMode_ClampToEdge; - TextureDefinition->texture_mapping_attribute_components = m.picture_format==KEPRCPicture_BITMAP_RGB_BYTE ? PRC_TEXTURE_MAPPING_COMPONENTS_RGB : PRC_TEXTURE_MAPPING_COMPONENTS_RGBA; - texture_definition_index = addTextureDefinition(TextureDefinition); - texturedefinitionMap.insert(make_pair(texturedefinition,texture_definition_index)); + PRCTextureDefinition *textureDefinition = new PRCTextureDefinition; + textureDefinition->picture_index = picture_index; + textureDefinition->texture_mapping_attribute = t->mapping; + textureDefinition->texture_mapping_attribute_components = t->components; + textureDefinition->texture_function = t->function; + textureDefinition->texture_wrapping_mode_S = t->wrapping_mode_S; + textureDefinition->texture_wrapping_mode_T = t->wrapping_mode_T; + texture_definition_index = addTextureDefinitionUnique(textureDefinition); } - - uint32_t texture_application_index = m1; - const PRCtextureapplication textureapplication(material_index, texture_definition_index); - PRCtextureapplicationMap::const_iterator pTextureapplication = textureapplicationMap.find(textureapplication); - if(pTextureapplication!=textureapplicationMap.end()) - texture_application_index = pTextureapplication->second; - else { - PRCTextureApplication *TextureApplication = new PRCTextureApplication; - TextureApplication->material_generic_index = material_index; - TextureApplication->texture_definition_index = texture_definition_index; - texture_application_index = addTextureApplication(TextureApplication); - textureapplicationMap.insert(make_pair(textureapplication,texture_application_index)); + PRCTextureApplication *textureApplication = new PRCTextureApplication; + textureApplication->material_generic_index=material_generic_index; + textureApplication->texture_definition_index=texture_definition_index; + textureApplication->next_texture_index = texture_application_index; + texture_application_index = addTextureApplicationUnique(textureApplication); } - color_material_index = texture_application_index; } - else - color_material_index = material_index; uint32_t style_index = m1; - PRCstyle style(0,m.alpha,true,color_material_index); - PRCstyleMap::const_iterator pStyle = styleMap.find(style); - if(pStyle!=styleMap.end()) - style_index = pStyle->second; - else { - PRCStyle *Style = new PRCStyle(); - Style->line_width = 0.0; - Style->is_vpicture = false; - Style->line_pattern_vpicture_index = 0; - Style->is_material = true; - Style->is_transparency_defined = (m.alpha < 1.0); - Style->transparency = (uint8_t)(m.alpha * 256); - Style->additional = 0; - Style->color_material_index = color_material_index; - style_index = addStyle(Style); - styleMap.insert(make_pair(style,style_index)); + PRCStyle *style = new PRCStyle; + style->line_width = 0.0; + style->is_vpicture = false; + style->line_pattern_vpicture_index = 0; + style->is_material = true; + style->is_transparency_defined = (m.alpha < 1.0); + style->transparency = (uint8_t)(m.alpha * 256); + style->additional = 0; + style->color_material_index = color_material_index; + style_index = addStyleUnique(style); } -// materialMap.insert(make_pair(material,style_index)); return style_index; } @@ -1421,7 +1378,7 @@ bool isid(const double* t) } -void oPRCFile::begingroup(const char *name, PRCoptions *options, +void oPRCFile::begingroup(const char *name, const PRCoptions *options, const double* t) { const PRCgroup &parent_group = groups.top(); @@ -1491,6 +1448,13 @@ void oPRCFile::addPoint(const double P[3], const RGBAColour &c, double w) group.points[addColourWidth(c,w)].push_back(PRCVector3d(P[0],P[1],P[2])); } +void oPRCFile::addPoint(double x, double y, double z, const RGBAColour &c, double w) +{ + PRCgroup &group = findGroup(); + group.points[addColourWidth(c,w)].push_back(PRCVector3d(x,y,z)); +} + + void oPRCFile::addPoints(uint32_t n, const double P[][3], const RGBAColour &c, double w) { if(n==0 || P==NULL) @@ -1504,6 +1468,19 @@ void oPRCFile::addPoints(uint32_t n, const double P[][3], const RGBAColour &c, d pointset->point.push_back(PRCVector3d(P[i][0],P[i][1],P[i][2])); } +void oPRCFile::addPoints(uint32_t n, const double P[][3], uint32_t style_index) +{ + if(n==0 || P==NULL) + return; + PRCgroup &group = findGroup(); + PRCPointSet *pointset = new PRCPointSet(); + group.pointsets.push_back(pointset); + pointset->index_of_line_style = style_index; + pointset->point.reserve(n); + for(uint32_t i=0; ipoint.push_back(PRCVector3d(P[i][0],P[i][1],P[i][2])); +} + void oPRCFile::useMesh(uint32_t tess_index, uint32_t style_index, const double origin[3], const double x_axis[3], const double y_axis[3], double scale) { PRCgroup &group = findGroup(); @@ -1586,23 +1563,23 @@ uint32_t oPRCFile::createTriangleMesh(uint32_t nP, const double P[][3], uint32_t if(has_normals) { tess->normal_coordinate.reserve(3*nN); - for(uint32_t i=0; inormal_coordinate.push_back(N[i][0]); - tess->normal_coordinate.push_back(N[i][1]); - tess->normal_coordinate.push_back(N[i][2]); - } + for(uint32_t i=0; inormal_coordinate.push_back(N[i][0]); + tess->normal_coordinate.push_back(N[i][1]); + tess->normal_coordinate.push_back(N[i][2]); + } } else tess->crease_angle = ca; if(textured) { tess->texture_coordinate.reserve(2*nT); - for(uint32_t i=0; itexture_coordinate.push_back(T[i][0]); - tess->texture_coordinate.push_back(T[i][1]); - } + for(uint32_t i=0; itexture_coordinate.push_back(T[i][0]); + tess->texture_coordinate.push_back(T[i][1]); + } } tess->triangulated_index.reserve(3*nI+(has_normals?3:0)*nI+(textured?3:0)*nI); for(uint32_t i=0; inormal_coordinate.reserve(3*nN); - for(uint32_t i=0; inormal_coordinate.push_back(N[i][0]); - tess->normal_coordinate.push_back(N[i][1]); - tess->normal_coordinate.push_back(N[i][2]); - } + for(uint32_t i=0; inormal_coordinate.push_back(N[i][0]); + tess->normal_coordinate.push_back(N[i][1]); + tess->normal_coordinate.push_back(N[i][2]); + } } else tess->crease_angle = ca; if(textured) { tess->texture_coordinate.reserve(2*nT); - for(uint32_t i=0; itexture_coordinate.push_back(T[i][0]); - tess->texture_coordinate.push_back(T[i][1]); - } + for(uint32_t i=0; itexture_coordinate.push_back(T[i][0]); + tess->texture_coordinate.push_back(T[i][1]); + } } tess->triangulated_index.reserve(2*(3*nI+(has_normals?3:0)*nI+(textured?3:0)*nI)); for(uint32_t i=0; icoordinates.reserve(3*nP); + for(uint32_t i=0; icoordinates.push_back(P[i][0]); + tess->coordinates.push_back(P[i][1]); + tess->coordinates.push_back(P[i][2]); + } + tess->wire_indexes.reserve(3*nI); + for(uint32_t i=0; iwire_indexes.push_back(2); + tess->wire_indexes.push_back(3*PI[i][0]); + tess->wire_indexes.push_back(3*PI[i][1]); + } + if(vertex_color) + { + tess->is_segment_color = segment_color; + tess->is_rgba=false; + for(uint32_t i=0; iis_rgba=true; + break; + } + tess->rgba_vertices.reserve((tess->is_rgba?4:3)*(segment_color?1:2)*nI); + for(uint32_t i=0; irgba_vertices.push_back(byte(0.5*C[CI[i][0]].R+0.5*C[CI[i][1]].R)); + tess->rgba_vertices.push_back(byte(0.5*C[CI[i][0]].G+0.5*C[CI[i][1]].G)); + tess->rgba_vertices.push_back(byte(0.5*C[CI[i][0]].B+0.5*C[CI[i][1]].B)); + if(tess->is_rgba) + tess->rgba_vertices.push_back(byte(0.5*C[CI[i][0]].A+0.5*C[CI[i][1]].A)); + } else { + tess->rgba_vertices.push_back(byte(C[CI[i][0]].R)); + tess->rgba_vertices.push_back(byte(C[CI[i][0]].G)); + tess->rgba_vertices.push_back(byte(C[CI[i][0]].B)); + if(tess->is_rgba) + tess->rgba_vertices.push_back(byte(C[CI[i][0]].A)); + tess->rgba_vertices.push_back(byte(C[CI[i][1]].R)); + tess->rgba_vertices.push_back(byte(C[CI[i][1]].G)); + tess->rgba_vertices.push_back(byte(C[CI[i][1]].B)); + if(tess->is_rgba) + tess->rgba_vertices.push_back(byte(C[CI[i][1]].A)); + } + } + } + const uint32_t tess_index = add3DWireTess(tess); + return tess_index; +} + void oPRCFile::addLine(uint32_t n, const double P[][3], const RGBAColour &c, double w) { PRCgroup &group = findGroup(); @@ -1944,6 +1981,30 @@ void oPRCFile::addLine(uint32_t n, const double P[][3], const RGBAColour &c, dou } } +void oPRCFile::addSegment(const double P1[3], const double P2[3], const RGBAColour &c, double w) +{ + PRCgroup &group = findGroup(); + if(group.options.tess) + { + group.lines[w].push_back(PRCtessline()); + PRCtessline& line = group.lines[w].back(); + line.color.red = c.R; + line.color.green = c.G; + line.color.blue = c.B; + line.point.push_back(PRCVector3d(P1[0],P1[1],P1[2])); + line.point.push_back(PRCVector3d(P2[0],P2[1],P2[2])); + } + else + { + ADDWIRE(PRCPolyLine) + curve->point.resize(2); + curve->point[0].Set(P1[0],P1[1],P1[2]); + curve->point[1].Set(P2[0],P2[1],P2[2]); + curve->interval.min = 0; + curve->interval.max = curve->point.size()-1; + } +} + void oPRCFile::addBezierCurve(uint32_t n, const double cP[][3], const RGBAColour &c) { @@ -2254,27 +2315,67 @@ void oPRCFile::addTorus(double major_radius, double minor_radius, double angle1, #undef ADDWIRE #undef SETTRANSF -uint32_t PRCFileStructure::addMaterialGeneric(PRCMaterialGeneric*& pMaterialGeneric) +uint32_t PRCFileStructure::addRgbColor(double r, double g, double b) { - materials.push_back(pMaterialGeneric); - pMaterialGeneric = NULL; - return materials.size()-1; + const PRCRgbColor color(r, g, b); + colors.push_back(color); + return 3*(colors.size()-1); } -uint32_t PRCFileStructure::addTextureApplication(PRCTextureApplication*& pTextureApplication) +uint32_t PRCFileStructure::addRgbColorUnique(double r, double g, double b) { - materials.push_back(pTextureApplication); - pTextureApplication = NULL; - return materials.size()-1; + const PRCRgbColor color(r, g, b); + uint32_t color_index = m1; + PRCRgbColorMap::const_iterator iRgbColor = colorMap.find(color); + if(iRgbColor!=colorMap.end()) + { + color_index = iRgbColor->second; + } + else + { + color_index = 3*colors.size(); + colors.push_back(color); + colorMap.insert(make_pair(color,color_index)); + } + return color_index; } -uint32_t PRCFileStructure::addStyle(PRCStyle*& pStyle) -{ - styles.push_back(pStyle); - pStyle = NULL; - return styles.size()-1; +#define ADD_ADDUNIQ( prctype, prcmap, prclist) \ +uint32_t PRCFileStructure::add##prctype(PRC##prctype *& p##prctype) \ +{ \ + prclist.push_back(p##prctype); \ + p##prctype = NULL; \ + return prclist.size()-1; \ +} \ + \ +uint32_t PRCFileStructure::add##prctype##Unique(PRC##prctype*& p##prctype) \ +{ \ + uint32_t prc_index = m1; \ + PRC##prctype##Map::const_iterator i##prctype = prcmap.find(p##prctype); \ + if(i##prctype!=prcmap.end()) \ + { \ + delete p##prctype; \ + prc_index = i##prctype->second; \ + } \ + else \ + { \ + prc_index = prclist.size(); \ + prclist.push_back(p##prctype); \ + prcmap.insert(make_pair(p##prctype,prc_index)); \ + } \ + p##prctype = NULL; \ + return prc_index; \ } +ADD_ADDUNIQ(UncompressedFile, uncompressedfileMap, uncompressed_files ) +ADD_ADDUNIQ(Picture, pictureMap, pictures ) +ADD_ADDUNIQ(TextureDefinition, texturedefinitionMap, texture_definitions ) +ADD_ADDUNIQ(MaterialGeneric, materialgenericMap, materials ) +ADD_ADDUNIQ(TextureApplication, textureapplicationMap, materials ) +ADD_ADDUNIQ(Style, styleMap, styles ) + +#undef ADD_ADDUNIQ + uint32_t PRCFileStructure::addPartDefinition(PRCPartDefinition*& pPartDefinition) { part_definitions.push_back(pPartDefinition); diff --git a/src/prc/oPRCFile.h b/src/prc/oPRCFile.h index ca3d58e..33f97db 100644 --- a/src/prc/oPRCFile.h +++ b/src/prc/oPRCFile.h @@ -42,6 +42,11 @@ class oPRCFile; class PRCFileStructure; +#define EQFLD(fld) fld==c.fld +#define COMPFLD(fld) \ +if(fld != c.fld) \ +return (fld < c.fld); + struct RGBAColour { RGBAColour(double r=0.0, double g=0.0, double b=0.0, double a=1.0) : @@ -52,29 +57,26 @@ struct RGBAColour { R = r; G = g; B = b; A = a; } - bool operator==(const RGBAColour& c) const + bool operator==(const RGBAColour &c) const { - return (R==c.R && G==c.G && B==c.B && A==c.A); + return (EQFLD(R) && EQFLD(G) && EQFLD(B) && EQFLD(A)); } - bool operator!=(const RGBAColour& c) const + bool operator!=(const RGBAColour &c) const { - return !(R==c.R && G==c.G && B==c.B && A==c.A); + return !(EQFLD(R) && EQFLD(G) && EQFLD(B) && EQFLD(A)); } - bool operator<(const RGBAColour& c) const + bool operator<(const RGBAColour &c) const { - if(R!=c.R) - return (R PRCcolourMap; @@ -84,38 +86,137 @@ struct RGBAColourWidth R(r), G(g), B(b), A(a), W(w) {} double R,G,B,A,W; - bool operator==(const RGBAColourWidth& c) const + bool operator==(const RGBAColourWidth &c) const { - return (R==c.R && G==c.G && B==c.B && A==c.A && W==c.W); + return (EQFLD(R) && EQFLD(G) && EQFLD(B) && EQFLD(A) && EQFLD(W)); } - bool operator!=(const RGBAColourWidth& c) const + bool operator!=(const RGBAColourWidth &c) const { - return !(R==c.R && G==c.G && B==c.B && A==c.A && W==c.W); + return !(EQFLD(R) && EQFLD(G) && EQFLD(B) && EQFLD(A) && EQFLD(W)); } - bool operator<(const RGBAColourWidth& c) const + bool operator<(const RGBAColourWidth &c) const { - if(R!=c.R) - return (R PRCcolourwidthMap; -typedef std::map PRCcolorMap; +struct PRCmaterial +{ + PRCmaterial() : alpha(1.0),shininess(1.0),width(1.0) {} + PRCmaterial(const RGBAColour &a, const RGBAColour &d, const RGBAColour &e, + const RGBAColour &s, double p, double h, double w=1.0) : + ambient(a), diffuse(d), emissive(e), specular(s), alpha(p), shininess(h), width(w) {} + + RGBAColour ambient,diffuse,emissive,specular; + double alpha,shininess,width; + + bool operator==(const PRCmaterial &c) const + { + return (EQFLD(ambient) && + EQFLD(diffuse) && + EQFLD(emissive) && + EQFLD(specular) && + EQFLD(alpha) && + EQFLD(shininess) && + EQFLD(width)); + } + bool operator<(const PRCmaterial &c) const + { + COMPFLD(ambient) + COMPFLD(diffuse) + COMPFLD(emissive) + COMPFLD(specular) + COMPFLD(alpha) + COMPFLD(shininess) + COMPFLD(width) + return false; + } +}; +typedef std::map PRCmaterialMap; + +#undef EQFLD +#undef COMPFLD + +struct PRCtexture +{ + PRCtexture() : + data(NULL), format(KEPRCPicture_BITMAP_RGBA_BYTE), width(0), height(0), size(0), + mapping(0), components(PRC_TEXTURE_MAPPING_COMPONENTS_RGBA), + function(KEPRCTextureFunction_Modulate), + wrapping_mode_S(KEPRCTextureWrappingMode_Repeat), wrapping_mode_T(KEPRCTextureWrappingMode_Repeat) {} + + const uint8_t* data; + EPRCPictureDataFormat format; + /* + KEPRCPicture_PNG + KEPRCPicture_JPG + KEPRCPicture_BITMAP_RGB_BYTE + KEPRCPicture_BITMAP_RGBA_BYTE + KEPRCPicture_BITMAP_GREY_BYTE + KEPRCPicture_BITMAP_GREYA_BYTE + */ + uint32_t width; // may be omitted for PNG and JPEG + uint32_t height; // too + uint32_t size; + + uint32_t mapping; + /* + PRC_TEXTURE_MAPPING_DIFFUSE + PRC_TEXTURE_MAPPING_BUMP + PRC_TEXTURE_MAPPING_OPACITY + PRC_TEXTURE_MAPPING_SPHERICAL_REFLECTION + */ + + uint8_t components; + /* + PRC_TEXTURE_MAPPING_COMPONENTS_RED + PRC_TEXTURE_MAPPING_COMPONENTS_GREEN + PRC_TEXTURE_MAPPING_COMPONENTS_BLUE + PRC_TEXTURE_MAPPING_COMPONENTS_RGB + PRC_TEXTURE_MAPPING_COMPONENTS_ALPHA + PRC_TEXTURE_MAPPING_COMPONENTS_RGBA + */ + + EPRCTextureFunction function; + /* + enum EPRCTextureFunction { // Defines how to paint a texture on the surface being rendered. + KEPRCTextureFunction_Unknown, // Let the application choose. + KEPRCTextureFunction_Modulate, // Combine lighting with texturing. This is the default value. + KEPRCTextureFunction_Replace, // Replace the object color with texture color data. + KEPRCTextureFunction_Blend, // Reserved for future use. + KEPRCTextureFunction_Decal // Reserved for future use. + }; + */ + + EPRCTextureWrappingMode wrapping_mode_S; + EPRCTextureWrappingMode wrapping_mode_T; + /* + enum EPRCTextureWrappingMode { // Defines repeating and clamping texture modes. + KEPRCTextureWrappingMode_Unknown, // Let the application choose. + KEPRCTextureWrappingMode_Repeat, // Display the repeated texture on the surface. + KEPRCTextureWrappingMode_ClampToBorder, // Clamp the texture to the border. Display the surface color along the texture limits. + KEPRCTextureWrappingMode_Clamp, // Reserved for future use. + KEPRCTextureWrappingMode_ClampToEdge, // Reserved for future use. + KEPRCTextureWrappingMode_MirroredRepeat // Reserved for future use. + }; + */ + +}; +/* struct PRCmaterial { PRCmaterial() : alpha(1.0),shininess(1.0), picture_data(NULL), picture_format(KEPRCPicture_BITMAP_RGB_BYTE), picture_width(0), picture_height(0), picture_size(0), picture_replace(false), picture_repeat(false) {} - PRCmaterial(const RGBAColour& a, const RGBAColour& d, const RGBAColour& e, - const RGBAColour& s, double p, double h, + PRCmaterial(const RGBAColour &a, const RGBAColour &d, const RGBAColour &e, + const RGBAColour &s, double p, double h, const uint8_t* pic=NULL, EPRCPictureDataFormat picf=KEPRCPicture_BITMAP_RGB_BYTE, uint32_t picw=0, uint32_t pich=0, uint32_t pics=0, bool picreplace=false, bool picrepeat=false) : ambient(a), diffuse(d), emissive(e), specular(s), alpha(p), shininess(h), @@ -143,7 +244,7 @@ struct PRCmaterial bool picture_replace; // replace material color with texture color? if false - just modify bool picture_repeat; // repeat texture? if false - clamp to edge - bool operator==(const PRCmaterial& m) const + bool operator==(const PRCmaterial &m) const { return (ambient==m.ambient && diffuse==m.diffuse && emissive==m.emissive && specular==m.specular && alpha==m.alpha && shininess==m.shininess @@ -152,7 +253,7 @@ struct PRCmaterial && picture_width==m.picture_width && picture_height==m.picture_height && picture_size==m.picture_size && (picture_data==m.picture_data || memcmp(picture_data,m.picture_data,picture_size)==0) ); } - bool operator<(const PRCmaterial& m) const + bool operator<(const PRCmaterial &m) const { if(ambient!=m.ambient) return (ambient PRCmaterialMap; - -struct PRCpicture -{ - PRCpicture() : - data(NULL), format(KEPRCPicture_BITMAP_RGB_BYTE), - width(0), height(0), size(0) {} - PRCpicture(const uint8_t* pic, EPRCPictureDataFormat picf, - uint32_t picw, uint32_t pich, uint32_t pics=0) : - data(pic), format(picf), - width(picw), height(pich), size(pics) - { - if(size==0) - { - if (format==KEPRCPicture_BITMAP_RGB_BYTE) - size = width*height*3; - if (format==KEPRCPicture_BITMAP_RGBA_BYTE) - size = width*height*4; - if (format==KEPRCPicture_BITMAP_GREY_BYTE) - size = width*height*1; - if (format==KEPRCPicture_BITMAP_GREYA_BYTE) - size = width*height*2; - } - } - PRCpicture(const PRCmaterial& m) : - data(m.picture_data), format(m.picture_format), - width(m.picture_width), height(m.picture_height), size(m.picture_size) {} - - const uint8_t* data; - EPRCPictureDataFormat format; - uint32_t width; - uint32_t height; - uint32_t size; - bool operator==(const PRCpicture& p) const - { - return ( format==p.format - && width==p.width && height==p.height && size==p.size - && (data==p.data || memcmp(data,p.data,size)==0) ); - } - bool operator<(const PRCpicture& p) const - { - if(format!=p.format) - return (format PRCpictureMap; - -struct PRCmaterialgeneric -{ - PRCmaterialgeneric() : alpha(1.0),shininess(1.0) {} - PRCmaterialgeneric(const RGBAColour& a, const RGBAColour& d, const RGBAColour& e, - const RGBAColour& s, double p, double h) : - ambient(a), diffuse(d), emissive(e), specular(s), alpha(p), shininess(h) {} - PRCmaterialgeneric(const PRCmaterial& m) : - ambient(m.ambient), diffuse(m.diffuse), emissive(m.emissive), specular(m.specular), alpha(m.alpha), shininess(m.shininess) {} - RGBAColour ambient,diffuse,emissive,specular; - double alpha,shininess; - - bool operator==(const PRCmaterialgeneric& m) const - { - return (ambient==m.ambient && diffuse==m.diffuse && emissive==m.emissive - && specular==m.specular && alpha==m.alpha && shininess==m.shininess); - } - bool operator<(const PRCmaterialgeneric& m) const - { - if(ambient!=m.ambient) - return (ambient PRCmaterialgenericMap; - -struct PRCtexturedefinition -{ - PRCtexturedefinition() : - picture_index(m1), picture_replace(false), picture_repeat(false) {} - PRCtexturedefinition(uint32_t picindex, bool picreplace=false, bool picrepeat=false) : - picture_index(picindex), picture_replace(picreplace), picture_repeat(picrepeat) {} - PRCtexturedefinition(uint32_t picindex, const PRCmaterial& m) : - picture_index(picindex), picture_replace(m.picture_replace), picture_repeat(m.picture_repeat) {} - uint32_t picture_index; - bool picture_replace; // replace material color with texture color? if false - just modify - bool picture_repeat; // repeat texture? if false - clamp to edge - - bool operator==(const PRCtexturedefinition& t) const - { - return (picture_index==t.picture_index - && picture_replace==t.picture_replace && picture_repeat==t.picture_repeat); - } - bool operator<(const PRCtexturedefinition& t) const - { - if(picture_index!=t.picture_index) - return (picture_index PRCtexturedefinitionMap; - -struct PRCtextureapplication -{ - PRCtextureapplication() : - material_generic_index(m1), texture_definition_index(m1) {} - PRCtextureapplication(uint32_t matindex, uint32_t texindex) : - material_generic_index(matindex), texture_definition_index(texindex) {} - uint32_t material_generic_index; - uint32_t texture_definition_index; - - bool operator==(const PRCtextureapplication& t) const - { - return (material_generic_index==t.material_generic_index - && texture_definition_index==t.texture_definition_index); - } - bool operator<(const PRCtextureapplication& t) const - { - if(material_generic_index!=t.material_generic_index) - return (material_generic_index PRCtextureapplicationMap; - -struct PRCstyle -{ - PRCstyle() : - line_width(0), alpha(1), is_material(false), color_material_index(m1) {} - PRCstyle(double linewidth, double alph, bool ismat, uint32_t colindex=m1) : - line_width(linewidth), alpha(alph), is_material(ismat), color_material_index(colindex) {} - double line_width; - double alpha; - bool is_material; - uint32_t color_material_index; - - bool operator==(const PRCstyle& s) const - { - return (line_width==s.line_width && alpha==s.alpha && is_material==s.is_material - && color_material_index==s.color_material_index); - } - bool operator<(const PRCstyle& s) const - { - if(line_width!=s.line_width) - return (line_width PRCstyleMap; +*/ struct PRCtessrectangle // rectangle { @@ -471,21 +397,6 @@ class PRCgroup void makeFileUUID(PRCUniqueId&); void makeAppUUID(PRCUniqueId&); -class PRCUncompressedFile -{ - public: - PRCUncompressedFile() : file_size(0), data(NULL) {} - PRCUncompressedFile(uint32_t fs, uint8_t* d) : file_size(fs), data(d) {} - ~PRCUncompressedFile() { if(data != NULL) delete[] data; } - uint32_t file_size; - uint8_t* data; - - void write(std::ostream&) const; - - uint32_t getSize() const; -}; -typedef std::deque PRCUncompressedFileList; - class PRCStartHeader { public: @@ -497,8 +408,11 @@ class PRCStartHeader PRCStartHeader() : minimal_version_for_read(PRCVersion), authoring_version(PRCVersion) {} void serializeStartHeader(std::ostream&) const; + void serializeUncompressedFiles(std::ostream&) const; + PRCUncompressedFileList uncompressed_files; uint32_t getStartHeaderSize() const; + uint32_t getUncompressedFilesSize() const; }; class PRCFileStructure : public PRCStartHeader @@ -508,12 +422,19 @@ class PRCFileStructure : public PRCStartHeader double tessellation_chord_height_ratio; double tessellation_angle_degree; std::string default_font_family_name; - std::vector colors; - std::vector pictures; - PRCUncompressedFileList uncompressed_files; + PRCRgbColorList colors; + PRCRgbColorMap colorMap; + PRCPictureList pictures; + PRCPictureMap pictureMap; + PRCUncompressedFileMap uncompressedfileMap; PRCTextureDefinitionList texture_definitions; + PRCTextureDefinitionMap texturedefinitionMap; PRCMaterialList materials; + PRCMaterialGenericMap materialgenericMap; + PRCTextureApplicationMap textureapplicationMap; PRCStyleList styles; + PRCStyleMap styleMap; + PRCCoordinateSystemList reference_coordinate_systems; std::vector font_keys_of_font; PRCPartDefinitionList part_definitions; @@ -525,19 +446,20 @@ class PRCFileStructure : public PRCStartHeader PRCTessList tessellations; uint32_t sizes[6]; - uint8_t* globals_data; + uint8_t *globals_data; PRCbitStream globals_out; // order matters: PRCbitStream must be initialized last - uint8_t* tree_data; + uint8_t *tree_data; PRCbitStream tree_out; - uint8_t* tessellations_data; + uint8_t *tessellations_data; PRCbitStream tessellations_out; - uint8_t* geometry_data; + uint8_t *geometry_data; PRCbitStream geometry_out; - uint8_t* extraGeometry_data; + uint8_t *extraGeometry_data; PRCbitStream extraGeometry_out; ~PRCFileStructure () { for(PRCUncompressedFileList::iterator it=uncompressed_files.begin(); it!=uncompressed_files.end(); ++it) delete *it; + for(PRCPictureList::iterator it=pictures.begin(); it!=pictures.end(); ++it) delete *it; for(PRCTextureDefinitionList::iterator it=texture_definitions.begin(); it!=texture_definitions.end(); ++it) delete *it; for(PRCMaterialList::iterator it=materials.begin(); it!=materials.end(); ++it) delete *it; for(PRCStyleList::iterator it=styles.begin(); it!=styles.end(); ++it) delete *it; @@ -573,13 +495,22 @@ class PRCFileStructure : public PRCStartHeader void serializeFileStructureTessellation(PRCbitStream&); void serializeFileStructureGeometry(PRCbitStream&); void serializeFileStructureExtraGeometry(PRCbitStream&); - uint32_t addPicture(EPRCPictureDataFormat format, uint32_t size, const uint8_t* picture, uint32_t width=0, uint32_t height=0, std::string name=""); - uint32_t addTextureDefinition(PRCTextureDefinition*& pTextureDefinition); - uint32_t addRgbColor(const PRCRgbColor& color); - uint32_t addRgbColorUnique(const PRCRgbColor& color); - uint32_t addMaterialGeneric(PRCMaterialGeneric*& pMaterialGeneric); - uint32_t addTextureApplication(PRCTextureApplication*& pTextureApplication); - uint32_t addStyle(PRCStyle*& pStyle); + uint32_t addPicture(EPRCPictureDataFormat format, uint32_t size, const uint8_t *picture, uint32_t width=0, uint32_t height=0, std::string name=""); +#define ADD_ADDUNIQ( prctype ) \ +uint32_t add##prctype( PRC##prctype*& p##prctype ); \ +uint32_t add##prctype##Unique( PRC##prctype*& p##prctype); + + ADD_ADDUNIQ( UncompressedFile ) + ADD_ADDUNIQ( Picture ) + ADD_ADDUNIQ( TextureDefinition ) + ADD_ADDUNIQ( TextureApplication ) + ADD_ADDUNIQ( MaterialGeneric ) + ADD_ADDUNIQ( Style ) + +#undef ADD_ADDUNIQ + + uint32_t addRgbColor(double r, double g, double b); + uint32_t addRgbColorUnique(double r, double g, double b); uint32_t addPartDefinition(PRCPartDefinition*& pPartDefinition); uint32_t addProductOccurrence(PRCProductOccurrence*& pProductOccurrence); uint32_t addTopoContext(PRCTopoContext*& pTopoContext); @@ -601,7 +532,7 @@ class PRCFileStructureInformation PRCUniqueId UUID; uint32_t reserved; // 0 uint32_t number_of_offsets; - uint32_t* offsets; + uint32_t *offsets; void write(std::ostream&); @@ -612,10 +543,9 @@ class PRCHeader : public PRCStartHeader { public : uint32_t number_of_file_structures; - PRCFileStructureInformation* fileStructureInformation; + PRCFileStructureInformation *fileStructureInformation; uint32_t model_file_offset; uint32_t file_size; // not documented - PRCUncompressedFileList uncompressed_files; void write(std::ostream&); uint32_t getSize(); @@ -626,7 +556,7 @@ typedef std::map PRCtransformMap; class oPRCFile { public: - oPRCFile(std::ostream& os, double u=1, uint32_t n=1) : + oPRCFile(std::ostream &os, double u=1, uint32_t n=1) : number_of_file_structures(n), fileStructures(new PRCFileStructure*[n]), unit(u), @@ -653,7 +583,7 @@ class oPRCFile group.parent_part_definition = NULL; } - oPRCFile(const std::string& name, double u=1, uint32_t n=1) : + oPRCFile(const std::string &name, double u=1, uint32_t n=1) : number_of_file_structures(n), fileStructures(new PRCFileStructure*[n]), unit(u), @@ -680,7 +610,7 @@ class oPRCFile group.parent_product_occurrence = NULL; group.part_definition = new PRCPartDefinition; group.parent_part_definition = NULL; - } + } ~oPRCFile() { @@ -690,10 +620,9 @@ class oPRCFile if(fout != NULL) delete fout; free(modelFile_data); - for(PRCpictureMap::iterator it=pictureMap.begin(); it!=pictureMap.end(); ++it) delete it->first.data; } - void begingroup(const char* name, PRCoptions* options=NULL, + void begingroup(const char *name, const PRCoptions *options=NULL, const double* t=NULL); void endgroup(); @@ -705,40 +634,40 @@ class oPRCFile uint32_t getSize(); const uint32_t number_of_file_structures; - PRCFileStructure** fileStructures; + PRCFileStructure **fileStructures; PRCHeader header; PRCUnit unit; - uint8_t* modelFile_data; + uint8_t *modelFile_data; PRCbitStream modelFile_out; // order matters: PRCbitStream must be initialized last - PRCcolorMap colorMap; + PRCmaterialMap materialMap; PRCcolourMap colourMap; PRCcolourwidthMap colourwidthMap; - PRCmaterialgenericMap materialgenericMap; - PRCtexturedefinitionMap texturedefinitionMap; - PRCtextureapplicationMap textureapplicationMap; - PRCstyleMap styleMap; - PRCpictureMap pictureMap; PRCgroup rootGroup; PRCtransformMap transformMap; std::stack groups; PRCgroup& findGroup(); void doGroup(PRCgroup& group); - uint32_t addColor(const PRCRgbColor& color); - uint32_t addColour(const RGBAColour& colour); - uint32_t addColourWidth(const RGBAColour& colour, double width); + uint32_t addColour(const RGBAColour &colour); + uint32_t addColourWidth(const RGBAColour &colour, double width); uint32_t addLineMaterial(const RGBAColour& c, double width) { return addColourWidth(c,width); } - uint32_t addMaterial(const PRCmaterial& material); + uint32_t addMaterial(const PRCmaterial &material); + uint32_t addTexturedMaterial(const PRCmaterial &material, uint32_t n=0, const PRCtexture* const* tt=NULL); uint32_t addTransform(PRCGeneralTransformation3d*& transform); uint32_t addTransform(const double* t); uint32_t addTransform(const double origin[3], const double x_axis[3], const double y_axis[3], double scale); - void addPoint(const double P[3], const RGBAColour& c, double w=1.0); - void addPoints(uint32_t n, const double P[][3], const RGBAColour& c, double w=1.0); + void addPoint(const double P[3], const RGBAColour &c, double w=1.0); + void addPoint(double x, double y, double z, const RGBAColour &c, double w); + void addPoints(uint32_t n, const double P[][3], const RGBAColour &c, double w=1.0); + void addPoints(uint32_t n, const double P[][3], uint32_t style_index); void addLines(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[], const RGBAColour& c, double w, bool segment_color, uint32_t nC, const RGBAColour C[], uint32_t nCI, const uint32_t CI[]); uint32_t createLines(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[], bool segment_color, uint32_t nC, const RGBAColour C[], uint32_t nCI, const uint32_t CI[]); + uint32_t createSegments(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][2], + bool segment_color, uint32_t nC, const RGBAColour C[], const uint32_t CI[][2]); + void addTriangles(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][3], const PRCmaterial& m, uint32_t nN, const double N[][3], const uint32_t NI[][3], uint32_t nT, const double T[][2], const uint32_t TI[][3], @@ -817,15 +746,17 @@ class oPRCFile // void addTriangle(const double P[][3], const double T[][2], uint32_t style_index); - void addLine(uint32_t n, const double P[][3], const RGBAColour& c, double w=1.0); - void addBezierCurve(uint32_t n, const double cP[][3], const RGBAColour& c); - void addCurve(uint32_t d, uint32_t n, const double cP[][3], const double* k, const RGBAColour& c, const double w[]); + void addLine(uint32_t n, const double P[][3], const RGBAColour &c, double w=1.0); + void addSegment(const double P1[3], const double P2[3], const RGBAColour &c, double w=1.0); + + void addBezierCurve(uint32_t n, const double cP[][3], const RGBAColour &c); + void addCurve(uint32_t d, uint32_t n, const double cP[][3], const double *k, const RGBAColour &c, const double w[]); void addQuad(const double P[][3], const RGBAColour C[]); - void addRectangle(const double P[][3], const PRCmaterial& m); - void addPatch(const double cP[][3], const PRCmaterial& m); + void addRectangle(const double P[][3], const PRCmaterial &m); + void addPatch(const double cP[][3], const PRCmaterial &m); void addSurface(uint32_t dU, uint32_t dV, uint32_t nU, uint32_t nV, - const double cP[][3], const double* kU, const double* kV, const PRCmaterial& m, + const double cP[][3], const double *kU, const double *kV, const PRCmaterial &m, const double w[]); void addTube(uint32_t n, const double cP[][3], const double oP[][3], bool straight, const PRCmaterial& m, PRCTRANSFORM); void addHemisphere(double radius, const PRCmaterial& m, PRCTRANSFORM); @@ -839,38 +770,30 @@ class oPRCFile #undef PRCGENTRANSFORM - uint32_t addPicture(EPRCPictureDataFormat format, uint32_t size, const uint8_t* picture, uint32_t width=0, uint32_t height=0, + uint32_t addPicture(EPRCPictureDataFormat format, uint32_t size, const uint8_t *picture, uint32_t width=0, uint32_t height=0, std::string name="", uint32_t fileStructure=0) { return fileStructures[fileStructure]->addPicture(format, size, picture, width, height, name); } - uint32_t addPicture(const PRCpicture& pic, - std::string name="", uint32_t fileStructure=0) - { return fileStructures[fileStructure]->addPicture(pic.format, pic.size, pic.data, pic.width, pic.height, name); } - uint32_t addTextureDefinition(PRCTextureDefinition*& pTextureDefinition, uint32_t fileStructure=0) - { - return fileStructures[fileStructure]->addTextureDefinition(pTextureDefinition); - } - uint32_t addTextureApplication(PRCTextureApplication*& pTextureApplication, uint32_t fileStructure=0) - { - return fileStructures[fileStructure]->addTextureApplication(pTextureApplication); - } - uint32_t addRgbColor(const PRCRgbColor& color, - uint32_t fileStructure=0) - { - return fileStructures[fileStructure]->addRgbColor(color); - } - uint32_t addRgbColorUnique(const PRCRgbColor& color, + +#define ADD_ADDUNIQ( prctype ) \ + uint32_t add##prctype(PRC##prctype*& p##prctype, uint32_t fileStructure=0) \ + { return fileStructures[fileStructure]->add##prctype( p##prctype ); } \ + uint32_t add##prctype##Unique(PRC##prctype*& p##prctype, uint32_t fileStructure=0) \ + { return fileStructures[fileStructure]->add##prctype##Unique(p##prctype); } + + ADD_ADDUNIQ( TextureDefinition ) + ADD_ADDUNIQ( TextureApplication ) + ADD_ADDUNIQ( MaterialGeneric ) + ADD_ADDUNIQ( Style ) +#undef ADD_ADDUNIQ + uint32_t addRgbColor(double r, double g, double b, uint32_t fileStructure=0) { - return fileStructures[fileStructure]->addRgbColorUnique(color); + return fileStructures[fileStructure]->addRgbColor(r, g, b); } - uint32_t addMaterialGeneric(PRCMaterialGeneric*& pMaterialGeneric, + uint32_t addRgbColorUnique(double r, double g, double b, uint32_t fileStructure=0) { - return fileStructures[fileStructure]->addMaterialGeneric(pMaterialGeneric); - } - uint32_t addStyle(PRCStyle*& pStyle, uint32_t fileStructure=0) - { - return fileStructures[fileStructure]->addStyle(pStyle); + return fileStructures[fileStructure]->addRgbColorUnique(r, g, b); } uint32_t addPartDefinition(PRCPartDefinition*& pPartDefinition, uint32_t fileStructure=0) { @@ -920,8 +843,8 @@ class oPRCFile } private: void serializeModelFileData(PRCbitStream&); - std::ofstream* fout; - std::ostream& output; + std::ofstream *fout; + std::ostream &output; }; #endif // __O_PRC_FILE_H diff --git a/src/prc/writePRC.cc b/src/prc/writePRC.cc index 8265d0b..098b4b7 100644 --- a/src/prc/writePRC.cc +++ b/src/prc/writePRC.cc @@ -33,6 +33,8 @@ #include #endif +#include + using namespace std; #ifndef __GNUC_PREREQ @@ -166,6 +168,68 @@ bool PRCVector2d::Normalize() return true; } +void PRCVector2d::serializeVector2d(PRCbitStream &pbs) +{ + WriteDouble (x) + WriteDouble (y) +} + +uint32_t makeCADID() +{ + static uint32_t ID = 1; + return ID++; +} + +uint32_t makePRCID() +{ + static uint32_t ID = 1; + return ID++; +} + +bool type_eligible_for_reference(uint32_t type) +{ + if( + type == PRC_TYPE_MISC_EntityReference || + type == PRC_TYPE_MISC_MarkupLinkedItem || + type == PRC_TYPE_RI_BrepModel || + type == PRC_TYPE_RI_Curve || + type == PRC_TYPE_RI_Direction || + type == PRC_TYPE_RI_Plane || + type == PRC_TYPE_RI_PointSet || + type == PRC_TYPE_RI_PolyBrepModel || + type == PRC_TYPE_RI_PolyWire || + type == PRC_TYPE_RI_Set || + type == PRC_TYPE_RI_CoordinateSystem || + type == PRC_TYPE_ASM_ProductOccurence || + type == PRC_TYPE_ASM_PartDefinition || + type == PRC_TYPE_ASM_Filter || + type == PRC_TYPE_MKP_View || + type == PRC_TYPE_MKP_Markup || + type == PRC_TYPE_MKP_Leader || + type == PRC_TYPE_MKP_AnnotationItem || + type == PRC_TYPE_MKP_AnnotationSet || + type == PRC_TYPE_MKP_AnnotationReference || + type == PRC_TYPE_GRAPH_Style || + type == PRC_TYPE_GRAPH_Material || + type == PRC_TYPE_GRAPH_TextureApplication || + type == PRC_TYPE_GRAPH_TextureDefinition || + type == PRC_TYPE_GRAPH_LinePattern || + type == PRC_TYPE_GRAPH_DottingPattern || + type == PRC_TYPE_GRAPH_HatchingPattern || + type == PRC_TYPE_GRAPH_SolidPattern || + type == PRC_TYPE_GRAPH_VPicturePattern || + type == PRC_TYPE_GRAPH_AmbientLight || + type == PRC_TYPE_GRAPH_PointLight || + type == PRC_TYPE_GRAPH_DirectionalLight || + type == PRC_TYPE_GRAPH_SpotLight || + type == PRC_TYPE_GRAPH_SceneDisplayParameters || + type == PRC_TYPE_GRAPH_Camera + ) + return true; + else + return false; +} + void UserData::write(PRCbitStream &pbs) { pbs << size; @@ -267,6 +331,18 @@ void PRCReferenceUniqueIdentifier::serializeReferenceUniqueIdentifier(PRCbitStre WriteUnsignedInteger (unique_identifier) } +void PRCUncompressedFile::serializeUncompressedFile(ostream &out) const +{ + WriteUncompressedUnsignedInteger (file_contents.size()) + std::ostream_iterator out_it (out); + copy ( file_contents.begin(), file_contents.end(), out_it ); +} + +uint32_t PRCUncompressedFile::getSize() const +{ + return sizeof(uint32_t)+file_contents.size(); +} + void PRCRgbColor::serializeRgbColor(PRCbitStream &pbs) { WriteDouble (red) @@ -1003,68 +1079,6 @@ void PRCMarkupTess::serializeMarkupTess(PRCbitStream &pbs) WriteCharacter (behaviour) } -void PRCVector2d::serializeVector2d(PRCbitStream &pbs) -{ - WriteDouble (x) - WriteDouble (y) -} - -uint32_t makeCADID() -{ - static uint32_t ID = 1; - return ID++; -} - -uint32_t makePRCID() -{ - static uint32_t ID = 1; - return ID++; -} - -bool type_eligible_for_reference(uint32_t type) -{ - if( - type == PRC_TYPE_MISC_EntityReference || - type == PRC_TYPE_MISC_MarkupLinkedItem || - type == PRC_TYPE_RI_BrepModel || - type == PRC_TYPE_RI_Curve || - type == PRC_TYPE_RI_Direction || - type == PRC_TYPE_RI_Plane || - type == PRC_TYPE_RI_PointSet || - type == PRC_TYPE_RI_PolyBrepModel || - type == PRC_TYPE_RI_PolyWire || - type == PRC_TYPE_RI_Set || - type == PRC_TYPE_RI_CoordinateSystem || - type == PRC_TYPE_ASM_ProductOccurence || - type == PRC_TYPE_ASM_PartDefinition || - type == PRC_TYPE_ASM_Filter || - type == PRC_TYPE_MKP_View || - type == PRC_TYPE_MKP_Markup || - type == PRC_TYPE_MKP_Leader || - type == PRC_TYPE_MKP_AnnotationItem || - type == PRC_TYPE_MKP_AnnotationSet || - type == PRC_TYPE_MKP_AnnotationReference || - type == PRC_TYPE_GRAPH_Style || - type == PRC_TYPE_GRAPH_Material || - type == PRC_TYPE_GRAPH_TextureApplication || - type == PRC_TYPE_GRAPH_TextureDefinition || - type == PRC_TYPE_GRAPH_LinePattern || - type == PRC_TYPE_GRAPH_DottingPattern || - type == PRC_TYPE_GRAPH_HatchingPattern || - type == PRC_TYPE_GRAPH_SolidPattern || - type == PRC_TYPE_GRAPH_VPicturePattern || - type == PRC_TYPE_GRAPH_AmbientLight || - type == PRC_TYPE_GRAPH_PointLight || - type == PRC_TYPE_GRAPH_DirectionalLight || - type == PRC_TYPE_GRAPH_SpotLight || - type == PRC_TYPE_GRAPH_SceneDisplayParameters || - type == PRC_TYPE_GRAPH_Camera - ) - return true; - else - return false; -} - void writeUnit(PRCbitStream &out,bool fromCAD,double unit) { out << fromCAD << unit; diff --git a/src/prc/writePRC.h b/src/prc/writePRC.h index a1c794c..92a8215 100644 --- a/src/prc/writePRC.h +++ b/src/prc/writePRC.h @@ -29,6 +29,7 @@ #endif #include #include +#include #include "PRCbitStream.h" #include "PRC.h" #include @@ -287,43 +288,6 @@ void resetGraphics(); void resetGraphicsAndName(); -struct PRCRgbColor -{ - PRCRgbColor(double r=0.0, double g=0.0, double b=0.0) : - red(r), green(g), blue(b) {} - double red,green,blue; - void serializeRgbColor(PRCbitStream&); - - bool operator==(const PRCRgbColor &c) const - { - return (red==c.red && green==c.green && blue==c.blue); - } - bool operator!=(const PRCRgbColor &c) const - { - return !(red==c.red && green==c.green && blue==c.blue); - } - bool operator<(const PRCRgbColor &c) const - { - if(red!=c.red) - return (red \ +{ bool operator()(const PRCtype* Left, const PRCtype* Right) const { return (*Left < *Right); } }; \ +typedef std::map PRCtype##Map; +#define PRCLIST(PRCtype) \ +typedef std::deque PRCtype##List; + + +struct PRCRgbColor +{ + PRCRgbColor(double r=0.0, double g=0.0, double b=0.0) : + red(r), green(g), blue(b) {} + double red,green,blue; + void serializeRgbColor(PRCbitStream&); + + bool operator==(const PRCRgbColor &c) const + { + return (EQFLD(red) && + EQFLD(green) && + EQFLD(blue) + ); + } + bool operator!=(const PRCRgbColor &c) const + { + return !(EQFLD(red) && + EQFLD(green) && + EQFLD(blue) + ); + } + bool operator<(const PRCRgbColor &c) const + { + COMPFLD(red) + COMPFLD(green) + COMPFLD(blue) + return false; + } +}; +typedef std::map PRCRgbColorMap; +typedef std::deque PRCRgbColorList; + +class PRCUncompressedFile +{ +public: + PRCUncompressedFile() {} + PRCUncompressedFile(uint32_t fs, uint8_t *d) { + file_contents.assign( d, d + fs ); + } + + std::vector file_contents; + + void serializeUncompressedFile(std::ostream&) const; + + uint32_t getSize() const; + + bool operator==(const PRCUncompressedFile& c) const + { + return file_contents==c.file_contents; + } + bool operator<(const PRCUncompressedFile& c) const + { + return file_contents PRCTextureDefinitionList; +PRCLIST(PRCTextureDefinition) +PRCMAP(PRCTextureDefinition) class PRCMaterial { @@ -423,7 +519,7 @@ public: virtual ~PRCMaterial() {} virtual void serializeMaterial(PRCbitStream&) = 0; }; -typedef std::deque PRCMaterialList; +PRCLIST(PRCMaterial) class PRCMaterialGeneric : public ContentPRCBase, public PRCMaterial { @@ -436,7 +532,6 @@ public: {} void serializeMaterialGeneric(PRCbitStream&); void serializeMaterial(PRCbitStream &pbs) { serializeMaterialGeneric(pbs); } - uint32_t picture_index; uint32_t ambient; uint32_t diffuse; uint32_t emissive; @@ -447,12 +542,36 @@ public: double emissive_alpha; double specular_alpha; - bool operator==(const PRCMaterialGeneric &m) const + bool operator==(const PRCMaterialGeneric& c) const { - return (ambient==m.ambient && diffuse==m.diffuse && emissive==m.emissive && specular==m.specular && shininess==m.shininess && - ambient_alpha==m.ambient_alpha && diffuse_alpha==m.diffuse_alpha && emissive_alpha==m.emissive_alpha && specular_alpha==m.specular_alpha); + return (EQFLD(ambient) && + EQFLD(diffuse) && + EQFLD(emissive) && + EQFLD(specular) && + EQFLD(shininess) && + EQFLD(ambient_alpha) && + EQFLD(diffuse_alpha) && + EQFLD(emissive_alpha) && + EQFLD(specular_alpha) && + EQFLD(name) + ); + } + bool operator<(const PRCMaterialGeneric& c) const + { + COMPFLD(ambient) + COMPFLD(diffuse) + COMPFLD(emissive) + COMPFLD(specular) + COMPFLD(shininess) + COMPFLD(ambient_alpha) + COMPFLD(diffuse_alpha) + COMPFLD(emissive_alpha) + COMPFLD(specular_alpha) + COMPFLD(name) + return false; } }; +PRCMAP(PRCMaterialGeneric) class PRCTextureApplication : public ContentPRCBase, public PRCMaterial { @@ -468,7 +587,27 @@ public: uint32_t texture_definition_index; uint32_t next_texture_index; uint32_t UV_coordinates_index; + + bool operator==(const PRCTextureApplication& c) const + { + return (EQFLD(material_generic_index) && + EQFLD(texture_definition_index) && + EQFLD(next_texture_index) && + EQFLD(UV_coordinates_index) && + EQFLD(name) + ); + } + bool operator<(const PRCTextureApplication& c) const + { + COMPFLD(material_generic_index) + COMPFLD(texture_definition_index) + COMPFLD(next_texture_index) + COMPFLD(UV_coordinates_index) + COMPFLD(name) + return false; + } }; +PRCMAP(PRCTextureApplication) class PRCLinePattern : public ContentPRCBase { @@ -499,8 +638,41 @@ public: bool is_transparency_defined; uint8_t transparency; uint8_t additional; + bool operator==(const PRCStyle& c) const + { + return (EQFLD(line_width) && + EQFLD(is_vpicture) && + EQFLD(line_pattern_vpicture_index) && + EQFLD(is_material) && + EQFLD(color_material_index) && + EQFLD(is_transparency_defined) && + EQFLD(transparency) && + EQFLD(additional) && + EQFLD(name) + ); + } + bool operator<(const PRCStyle& c) const + { + COMPFLD(line_width) + COMPFLD(is_vpicture) + COMPFLD(line_pattern_vpicture_index) + COMPFLD(is_material) + COMPFLD(color_material_index) + COMPFLD(is_transparency_defined) + COMPFLD(transparency) + COMPFLD(additional) + COMPFLD(name) + return false; + } + }; -typedef std::deque PRCStyleList; +PRCLIST(PRCStyle) +PRCMAP(PRCStyle) + +#undef EQFLD +#undef COMPFLD +#undef PRCMAP + class PRCTessFace { @@ -774,6 +946,14 @@ public: else setidentity(); } + void set(const float t[]) + { + if(t!=NULL) + for (size_t i=0;i<16;i++) + m_coef[i]=t[i]; + else + setidentity(); + } void setidentity() { m_coef[0]=1; m_coef[4]=0; m_coef[ 8]=0; m_coef[12]=0; @@ -919,7 +1099,7 @@ class PRCBoundingBox { public: PRCBoundingBox() : min(0.0,0.0,0.0), max(0.0,0.0,0.0) {} - PRCBoundingBox(const PRCVector3d &m1, const PRCVector3d& m2) : min(m1),max(m2) {} + PRCBoundingBox(const PRCVector3d &m, const PRCVector3d& M) : min(m),max(M) {} void serializeBoundingBox(PRCbitStream &pbs); PRCVector3d min; PRCVector3d max; diff --git a/src/prim.cpp b/src/prim.cpp index 79cf006..813bb02 100644 --- a/src/prim.cpp +++ b/src/prim.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * prim.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -25,29 +25,37 @@ // Mark & Curve series // //----------------------------------------------------------------------------- -void mgl_mark(HMGL gr, mreal x,mreal y,mreal z,const char *mark) +void mgl_mark(HMGL gr, double x, double y, double z,const char *mark) { char mk = gr->SetPenPal(mark); if(!mk) mk = '.'; - gr->mark_plot(gr->AddPnt(mglPoint(x,y,z),gr->CDef,mglPoint(NAN),-1,3),mk); + if(mgl_isnan(z)) z=2*gr->Max.z-gr->Min.z; + static int cgid=1; gr->StartGroup("MarkS",cgid++); + long k = gr->AddPnt(mglPoint(x,y,z),gr->CDef,mglPoint(NAN),-1,3); + gr->mark_plot(k,mk); gr->AddActive(k); + gr->EndGroup(); } //----------------------------------------------------------------------------- void mgl_mark_(uintptr_t *gr, mreal *x, mreal *y, mreal *z, const char *pen,int l) { char *s=new char[l+1]; memcpy(s,pen,l); s[l]=0; mgl_mark(_GR_, *x,*y,*z,s); delete []s; } //----------------------------------------------------------------------------- -void mgl_ball(HMGL gr, mreal x,mreal y,mreal z) +void mgl_ball(HMGL gr, double x, double y, double z) { - gr->mark_plot(gr->AddPnt(mglPoint(x,y,z),gr->AddTexture('r'),mglPoint(NAN),-1,3),'.'); + static int cgid=1; gr->StartGroup("Ball",cgid++); + if(mgl_isnan(z)) z=2*gr->Max.z-gr->Min.z; + long k = gr->AddPnt(mglPoint(x,y,z),gr->AddTexture('r'),mglPoint(NAN),-1,3); + gr->mark_plot(k,'.'); gr->AddActive(k); + gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_ball_(uintptr_t *gr, mreal *x,mreal *y,mreal *z) +void mgl_ball_(uintptr_t *gr, mreal *x, mreal *y, mreal *z) { mgl_ball(_GR_, *x,*y,*z); } //----------------------------------------------------------------------------- -void mgl_line(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, const char *pen,int n) +void mgl_line(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, const char *pen,int n) { static int cgid=1; gr->StartGroup("Line",cgid++); - if(mgl_isnan(z1) || mgl_isnan(z2)) z1=z2=gr->Min.z; + if(mgl_isnan(z1) || mgl_isnan(z2)) z1=z2=2*gr->Max.z-gr->Min.z; mglPoint p1(x1,y1,z1), p2(x2,y2,z2), p=p1,nn=mglPoint(NAN); gr->SetPenPal(pen); n = (n<2) ? 2 : n; @@ -55,7 +63,7 @@ void mgl_line(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z register long i,k1,k2; register mreal s; gr->Reserve(n); - k1 = gr->AddPnt(p,gr->CDef,nn,-1,3); + k1 = gr->AddPnt(p,gr->CDef,nn,-1,3); gr->AddActive(k1); for(i=1;iStop) return; @@ -65,16 +73,17 @@ void mgl_line(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z if(i==1) gr->arrow_plot(k2,k1,gr->Arrow1); if(i==n-1) gr->arrow_plot(k1,k2,gr->Arrow2); } - gr->EndGroup(); + gr->AddActive(k1,1); gr->EndGroup(); } //----------------------------------------------------------------------------- void mgl_line_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, const char *pen,int *n,int l) { char *s=new char[l+1]; memcpy(s,pen,l); s[l]=0; mgl_line(_GR_, *x1,*y1,*z1, *x2,*y2,*z2,s,*n); delete []s; } //----------------------------------------------------------------------------- -void mgl_curve(HMGL gr, mreal x1, mreal y1, mreal z1, mreal dx1, mreal dy1, mreal dz1, mreal x2, mreal y2, mreal z2, mreal dx2, mreal dy2, mreal dz2, const char *pen,int n) +void mgl_curve(HMGL gr, double x1, double y1, double z1, double dx1, double dy1, double dz1, double x2, double y2, double z2, double dx2, double dy2, double dz2, const char *pen,int n) { static int cgid=1; gr->StartGroup("Curve",cgid++); + if(mgl_isnan(z1) || mgl_isnan(z2)) z1=z2=2*gr->Max.z-gr->Min.z; mglPoint p1(x1,y1,z1), p2(x2,y2,z2), d1(dx1,dy1,dz1), d2(dx2,dy2,dz2), a,b,p=p1,nn=mglPoint(NAN); a = 3*(p2-p1)-d2-2*d1; b = d1+d2-2*(p2-p1); n = (n<2) ? 2 : n; @@ -83,8 +92,8 @@ void mgl_curve(HMGL gr, mreal x1, mreal y1, mreal z1, mreal dx1, mreal dy1, mrea register long i,k1,k2; register mreal s; gr->Reserve(n); - k1=gr->AddPnt(p,gr->CDef,nn,-1,3); - for(i=0;iAddPnt(p,gr->CDef,nn,-1,3); gr->AddActive(k1); + for(i=1;iStop) return; s = i/(n-1.); p = p1+s*(d1+s*(a+s*b)); k2 = k1; @@ -93,14 +102,16 @@ void mgl_curve(HMGL gr, mreal x1, mreal y1, mreal z1, mreal dx1, mreal dy1, mrea if(i==1) gr->arrow_plot(k2,k1,gr->Arrow1); if(i==n-1) gr->arrow_plot(k1,k2,gr->Arrow2); } - gr->EndGroup(); + gr->AddActive(gr->AddPnt(p1+d1,gr->CDef,nn,-1,3),1); + gr->AddActive(gr->AddPnt(p2-d2,gr->CDef,nn,-1,3),3); + gr->AddActive(k1,2); gr->EndGroup(); } //----------------------------------------------------------------------------- void mgl_curve_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *dx1, mreal *dy1, mreal *dz1, mreal *x2, mreal *y2, mreal *z2, mreal *dx2, mreal *dy2, mreal *dz2, const char *pen,int *n, int l) { char *s=new char[l+1]; memcpy(s,pen,l); s[l]=0; mgl_curve(_GR_, *x1,*y1,*z1, *dx1,*dy1,*dz1, *x2,*y2,*z2, *dx2,*dy2,*dz2, s, *n); delete []s;} //----------------------------------------------------------------------------- -void mgl_error_box(HMGL gr, mreal x, mreal y, mreal z, mreal ex, mreal ey, mreal ez, const char *pen) +void mgl_error_box(HMGL gr, double x, double y, double z, double ex, double ey, double ez, const char *pen) { static int cgid=1; gr->StartGroup("ErBox",cgid++); char mk=gr->SetPenPal(pen); @@ -117,6 +128,8 @@ void mgl_error_box(HMGL gr, mreal x, mreal y, mreal z, mreal ex, mreal ey, mreal q = p; q.z -= ez; k2 = gr->AddPnt(q,gr->CDef,nn,0,3); gr->line_plot(k1,k2); gr->arrow_plot(k1,k2,'I'); gr->arrow_plot(k2,k1,'I'); if(mk) gr->mark_plot(gr->AddPnt(p,gr->CDef,nn,0,3),mk); + gr->AddActive(gr->AddPnt(p,gr->CDef,nn,-1,3),0); + gr->AddActive(gr->AddPnt(p+mglPoint(ex,ey),gr->CDef,nn,-1,3),1); gr->EndGroup(); } //----------------------------------------------------------------------------- @@ -128,12 +141,13 @@ void mgl_error_box_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, m // Face series // //----------------------------------------------------------------------------- -void mgl_face(HMGL gr, mreal x0, mreal y0, mreal z0, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal x3, mreal y3, mreal z3, const char *stl) +void mgl_face(HMGL gr, double x0, double y0, double z0, double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, const char *stl) { static int cgid=1; gr->StartGroup("Face",cgid++); long pal; gr->SetPenPal(stl,&pal); - mreal c1,c2,c3,c4,zz=(gr->Min.z+gr->Max.z)/2; +// mreal c1,c2,c3,c4,zz=(gr->Min.z+gr->Max.z)/2; + mreal c1,c2,c3,c4,zz=2*gr->Max.z-gr->Min.z; c1=c2=c3=c4=gr->CDef; if(mgl_isnan(z0)) z0 = zz; if(mgl_isnan(z1)) z1 = zz; if(mgl_isnan(z2)) z2 = zz; if(mgl_isnan(z3)) z3 = zz; @@ -146,10 +160,12 @@ void mgl_face(HMGL gr, mreal x0, mreal y0, mreal z0, mreal x1, mreal y1, mreal z gr->Reserve(4); long k1,k2,k3,k4; double a = gr->get(MGL_ENABLE_ALPHA)?-1:1; - k1 = gr->AddPnt(p1,c1,q1,a,11); k2 = gr->AddPnt(p2,c2,q2,a,11); - k3 = gr->AddPnt(p3,c3,q3,a,11); k4 = gr->AddPnt(p4,c4,q4,a,11); + k1 = gr->AddPnt(p1,c1,q1,a,11); gr->AddActive(k1,0); + k2 = gr->AddPnt(p2,c2,q2,a,11); gr->AddActive(k2,1); + k3 = gr->AddPnt(p3,c3,q3,a,11); gr->AddActive(k3,2); + k4 = gr->AddPnt(p4,c4,q4,a,11); gr->AddActive(k4,3); gr->quad_plot(k1,k2,k3,k4); - if(strchr(stl,'#')) + if(mglchr(stl,'#')) { gr->Reserve(4); pal = gr->AddTexture('k'); @@ -161,13 +177,13 @@ void mgl_face(HMGL gr, mreal x0, mreal y0, mreal z0, mreal x1, mreal y1, mreal z gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_facex(HMGL gr, mreal x0, mreal y0, mreal z0, mreal wy, mreal wz, const char *stl, mreal d1, mreal d2) +void mgl_facex(HMGL gr, double x0, double y0, double z0, double wy, double wz, const char *stl, double d1, double d2) { mgl_face(gr, x0,y0,z0, x0,y0+wy,z0, x0,y0,z0+wz, x0,y0+wy+d1,z0+wz+d2, stl); } //----------------------------------------------------------------------------- -void mgl_facey(HMGL gr, mreal x0, mreal y0, mreal z0, mreal wx, mreal wz, const char *stl, mreal d1, mreal d2) +void mgl_facey(HMGL gr, double x0, double y0, double z0, double wx, double wz, const char *stl, double d1, double d2) { mgl_face(gr, x0,y0,z0, x0+wx,y0,z0, x0,y0,z0+wz, x0+wx+d1,y0,z0+wz+d2, stl); } //----------------------------------------------------------------------------- -void mgl_facez(HMGL gr, mreal x0, mreal y0, mreal z0, mreal wx, mreal wy, const char *stl, mreal d1, mreal d2) +void mgl_facez(HMGL gr, double x0, double y0, double z0, double wx, double wy, const char *stl, double d1, double d2) { mgl_face(gr, x0,y0,z0, x0,y0+wy,z0, x0+wx,y0,z0, x0+wx+d1,y0+wy+d2,z0, stl); } //----------------------------------------------------------------------------- void mgl_facex_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *wy, mreal *wz, const char *stl, mreal *dx, mreal *dy, int l) @@ -191,7 +207,7 @@ void mgl_face_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *x1, mreal // Cone // //----------------------------------------------------------------------------- -void mgl_cone(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal r1, mreal r2, const char *stl) +void mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r1, double r2, const char *stl) { if(r2<0) r2=r1; if(r1==0 && r2==0) return; @@ -202,8 +218,8 @@ void mgl_cone(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z long ss=gr->AddTexture(stl); mreal c1=gr->GetC(ss,p1.z), c2=gr->GetC(ss,p2.z); long *kk=new long[164],k1=-1,k2=-1; - bool edge = stl && strchr(stl,'@'); - bool wire = stl && strchr(stl,'#'); + bool edge = mglchr(stl,'@'); + bool wire = mglchr(stl,'#'); gr->Reserve(edge?166:82); if(edge && !wire) { @@ -263,8 +279,8 @@ void mgl_cones_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char static int cgid=1; gr->StartGroup("Cones",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = nz > m ? nz : m; - bool above= pen && strchr(pen,'a'); - bool wire = pen && strchr(pen,'#'); + bool above= mglchr(pen,'a'); + bool wire = mglchr(pen,'#'); mreal *dd=new mreal[2*n], x1,z0,zz,d, vx,vy,vz,v0,v1; gr->SetPenPal(pen,&pal); @@ -338,7 +354,7 @@ void mgl_cones_(uintptr_t *gr, uintptr_t *y, const char *pen, const char *opt,in // Ellipse & Rhomb // //----------------------------------------------------------------------------- -void mgl_ellipse(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal r, const char *stl) +void mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl) { const int n = 41; long pal=0,n0,n1=-1,n2,m1=-1,m2; @@ -346,34 +362,37 @@ void mgl_ellipse(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mrea gr->SetPenPal(stl,&pal); mreal c=gr->NextColor(pal), d; mreal k=(gr->GetNumPal(pal)>1)?gr->NextColor(pal):gr->AddTexture('k'); - bool fill = !(stl && strchr(stl,'#')), box = (stl && strchr(stl,'@')) || !fill; + bool fill = !mglchr(stl,'#'), box = mglchr(stl,'@') || !fill; if(!fill) k=c; gr->Reserve(2*n+1); + if(mgl_isnan(z1) || mgl_isnan(z2)) z1=z2=2*gr->Max.z-gr->Min.z; mglPoint p1(x1,y1,z1), p2(x2,y2,z2), v=p2-p1; d = v.norm(); if(d==0) v = mglPoint(1); else v /= d; mglPoint u=mglPoint(0,0,1)^v, q=u^v, p, s=(p1+p2)/2.; u *= r; v *= sqrt(d*d/4+r*r); // central point first - n0 = gr->AddPnt(p1,c,q,-1,11); + n0 = gr->AddPnt(p1,c,q,-1,11); gr->AddActive(n0); + gr->AddActive(gr->AddPnt(p2,c,q,-1,11),1); for(long i=0;iStop) return; mreal t = i*2*M_PI/(n-1.); p = s+v*cos(t)+u*sin(t); n2 = n1; n1 = gr->AddPnt(p,c,q,-1,11); + if(i==n/4) gr->AddActive(n1,2); m2 = m1; m1 = gr->CopyNtoC(n1,k); if(i>0) { if(fill) gr->trig_plot(n0,n1,n2); - if(box) gr->line_plot(m1,m2); + if(box) gr->line_plot(m1,m2); } } gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_rhomb(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal r, const char *stl) +void mgl_rhomb(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl) { long pal=0, n1,n2,n3,n4; static int cgid=1; gr->StartGroup("Rhomb",cgid++); @@ -381,15 +400,17 @@ void mgl_rhomb(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal mreal c=gr->NextColor(pal); mreal k=(gr->GetNumPal(pal)>1)?gr->NextColor(pal):gr->AddTexture('k'); mreal b=(gr->GetNumPal(pal)>2)?gr->NextColor(pal):c; - bool fill = !(stl && strchr(stl,'#')), box = (stl && strchr(stl,'@')) || !fill; + bool fill = !mglchr(stl,'#'), box = mglchr(stl,'@') || !fill; if(!fill) k=c; gr->Reserve(8); + if(mgl_isnan(z1) || mgl_isnan(z2)) z1=z2=2*gr->Max.z-gr->Min.z; mglPoint p1(x1,y1,z1), p2(x2,y2,z2), u=mglPoint(0,0,1)^(p1-p2), q=u^(p1-p2), p, s,qq; u = (r/u.norm())*u; s = (p1+p2)/2.; p = p1; q = qq; n1 = gr->AddPnt(p,c,qq,-1,11); p = s+u;q = qq; n2 = gr->AddPnt(p,b==c?c:k,qq,-1,11); p = p2; q = qq; n3 = gr->AddPnt(p,b,qq,-1,11); p = s-u;q = qq; n4 = gr->AddPnt(p,b==c?c:k,qq,-1,11); + gr->AddActive(n1,0); gr->AddActive(n2,2); gr->AddActive(n3,1); if(fill) gr->quad_plot(n1,n2,n4,n3); n1 = gr->CopyNtoC(n1,k); n2 = gr->CopyNtoC(n2,k); n3 = gr->CopyNtoC(n3,k); n4 = gr->CopyNtoC(n4,k); @@ -411,44 +432,52 @@ void mgl_rhomb_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal // Sphere & Drop // //----------------------------------------------------------------------------- -void mgl_sphere(HMGL gr, mreal x, mreal y, mreal z, mreal r, const char *stl) +void mgl_sphere(HMGL gr, double x, double y, double z, double r, const char *stl) { mgl_drop(gr,x,y,z,1,0,0,2*r,stl,0,1); } //----------------------------------------------------------------------------- void mgl_sphere_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal *r, const char *stl,int l) { char *s=new char[l+1]; memcpy(s,stl,l); s[l]=0; mgl_sphere(_GR_, *x,*y,*z,*r,s); delete []s; } //----------------------------------------------------------------------------- -void mgl_drop(HMGL gr, mglPoint p, mglPoint q, mreal r, mreal c, mreal sh, mreal a) +void mgl_drop(HMGL gr, mglPoint p, mglPoint q, double r, double c, double sh, double a) { mglPoint p1,p2,pp,qq; if(q.norm()==0) { q = mglPoint(1,0,0); sh=0; } q.Normalize(); p1 = !q; p2 = q^p1; r /= 2; static int cgid=1; gr->StartGroup("Drop",cgid++); - const int n = 41; + const int n = 24, m = n/2; register long i,j; - gr->Reserve(n*n); - long *nn=new long[2*n]; - + gr->Reserve(n*m); + long *nn=new long[2*n],n1,n2; mreal u,v,x,y,z,rr,dr, co,si; - for(i=0;iAddPnt(p + q*z,c,q,-1,3); + z = r*(1+sh)*(sh-1); n2 = gr->AddPnt(p + q*z,c,q,-1,3); + + for(i=0;iStop) { delete []nn; return; } - u = i*M_PI/(n-1.); v = 2*M_PI*j/(n-1.)-1; - si = sin(u); co = cos(u); - rr = r*a*si*(1.+sh*co)/(1+sh); - dr = r*a/(1+sh)*(co*(1.+sh*co) - sh*si*si); - x = rr*cos(v); y = rr*sin(v); - z = r*(1+sh)*(co+sh); - pp = p + p1*x + p2*y + q*z; - qq = (p1*sin(v)-p2*cos(v))^(p1*(dr*cos(v)) + p2*(dr*sin(v)) - q*(r*(1+sh)*si)); - nn[j+n]=nn[j]; nn[j]=gr->AddPnt(pp,c,qq,-1,3); + if(i>0 && iAddPnt(pp,c,qq,-1,3); + } + else if(i==0) nn[j] = n1; + else if(i==m-1) { nn[j+n]=nn[j]; nn[j]=n2; } if(i*j>0) gr->quad_plot(nn[j-1], nn[j], nn[j+n-1], nn[j+n]); } delete []nn; gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_drop(HMGL gr, mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2, mreal r, const char *stl, mreal sh, mreal a) +void mgl_drop(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl, double sh, double a) { mreal c=gr->AddTexture((stl && stl[0]) ? stl[0]:'r'); mgl_drop(gr,mglPoint(x1,y1,z1), mglPoint(x2,y2,z2), r, c, sh, a); @@ -472,7 +501,7 @@ void mgl_dew_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, cons mreal xm,ym,dx,dy,dd; long ss = gr->AddTexture(sch); - bool inv = sch && strchr(sch,'A'); + bool inv = mglchr(sch,'i'); mreal zVal = gr->Min.z; long tx=1,ty=1; if(gr->MeshNum>1) { tx=(n-1)/(gr->MeshNum-1); ty=(m-1)/(gr->MeshNum-1); } @@ -483,7 +512,7 @@ void mgl_dew_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, cons ym = sqrt(ax->v(i,j,k)*ax->v(i,j,k)+ay->v(i,j,k)*ay->v(i,j,k)); xm = xm>ym ? xm : ym; } - xm = 1./MGL_EPSILON/(xm==0 ? 1:xm); + xm = 1./MGL_FEPSILON/(xm==0 ? 1:xm); mglPoint q; for(k=0;kGetNz();k++) @@ -530,12 +559,12 @@ void mgl_dew_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, c // Puts series // //----------------------------------------------------------------------------- -void mgl_puts(HMGL gr, mreal x, mreal y, mreal z,const char *text, const char *font, mreal size) +void mgl_puts(HMGL gr, double x, double y, double z,const char *text, const char *font, double size) { mgl_puts_dir(gr, x, y, z, NAN, NAN, 0, text, font, size); } -void mgl_putsw(HMGL gr, mreal x, mreal y, mreal z,const wchar_t *text, const char *font, mreal size) +void mgl_putsw(HMGL gr, double x, double y, double z,const wchar_t *text, const char *font, double size) { mgl_putsw_dir(gr, x, y, z, NAN, NAN, 0, text, font, size); } //----------------------------------------------------------------------------- -void mgl_puts_dir(HMGL gr, mreal x, mreal y, mreal z, mreal dx, mreal dy, mreal dz, const char *text, const char *font, mreal size) +void mgl_puts_dir(HMGL gr, double x, double y, double z, double dx, double dy, double dz, const char *text, const char *font, double size) { long len = strlen(text); wchar_t *buf = new wchar_t[len+1]; @@ -544,9 +573,10 @@ void mgl_puts_dir(HMGL gr, mreal x, mreal y, mreal z, mreal dx, mreal dy, mreal delete []buf; } //----------------------------------------------------------------------------- -void mgl_putsw_dir(HMGL gr, mreal x, mreal y, mreal z, mreal dx, mreal dy, mreal dz, const wchar_t *text, const char *font, mreal size) +void mgl_putsw_dir(HMGL gr, double x, double y, double z, double dx, double dy, double dz, const wchar_t *text, const char *font, double size) { - bool a=font && strchr(font,'a'), A=font && strchr(font,'A'); + bool a=mglchr(font,'a'), A=mglchr(font,'A'); + static int cgid=1; gr->StartGroup("Puts",cgid++); mglCanvas *g = dynamic_cast(gr); if(g && (a||A)) { @@ -556,10 +586,14 @@ void mgl_putsw_dir(HMGL gr, mreal x, mreal y, mreal z, mreal dx, mreal dy, mreal x = (2*x-1)*s; y = (2*y-1)*s; dx= (2*dx-1)*s; dy= (2*dy-1)*s; } + if(mgl_isnan(z)) z=2*gr->Max.z-gr->Min.z; mglPoint p(x,y,z), d(dx-x,dy-y,dz-z); long k = gr->AddPnt(p,-1,d,-1,7); + gr->AddActive(k,0); + gr->AddActive(gr->AddPnt(mglPoint(dx,dy,dz),-1,d,-1,7),1); if(g && (a||A)) { g->Pop(); gr->clr(MGL_DISABLE_SCALE); } gr->text_plot(k,text,font,size); + gr->EndGroup(); } //----------------------------------------------------------------------------- void mgl_puts_(uintptr_t *gr, mreal *x, mreal *y, mreal *z,const char *text, const char *font, mreal *size, int l, int n) @@ -581,7 +615,7 @@ void mgl_puts_dir_(uintptr_t *gr, mreal *x, mreal *y, mreal *z, mreal *dx, mreal void mgl_textmarkw_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const wchar_t *text, const char *fnt, const char *opt) { long j,m,mx,my,mz,mr,n=y->GetNx(); - if(mgl_check_dim1(gr,x,y,z,r,"TextMark")) return; + if(mgl_check_dim0(gr,x,y,z,r,"TextMark")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("TextMark",cgid++); @@ -618,7 +652,6 @@ void mgl_textmarkw_xyr(HMGL gr, HCDT x, HCDT y, HCDT r, const wchar_t *text, con void mgl_textmarkw_yr(HMGL gr, HCDT y, HCDT r, const wchar_t *text, const char *fnt, const char *opt) { register long n=y->GetNx(); - if(n<2) { gr->SetWarn(mglWarnLow,"TextMark"); return; } gr->SaveState(opt); mglData x(n); x.Fill(gr->Min.x,gr->Max.x); mglData z(n); z.Fill(gr->Min.z,gr->Min.z); @@ -629,7 +662,6 @@ void mgl_textmarkw_yr(HMGL gr, HCDT y, HCDT r, const wchar_t *text, const char * void mgl_textmarkw(HMGL gr, HCDT y, const wchar_t *text, const char *fnt, const char *opt) { register long n=y->GetNx(); - if(n<2) { gr->SetWarn(mglWarnLow,"TextMark"); return; } gr->SaveState(opt); mglData r(n); r.Fill(1,1); mglData x(n); x.Fill(gr->Min.x,gr->Max.x); @@ -689,7 +721,7 @@ void mgl_labelw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const wchar_t *text, const long j,m,mx,my,mz,n=y->GetNx(); if(mgl_check_dim1(gr,x,y,z,0,"Label")) return; - mreal size=gr->SaveState(opt); if(mgl_isnan(size)) size=-0.7; + gr->SaveState(opt); static int cgid=1; gr->StartGroup("Label",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; @@ -719,7 +751,7 @@ void mgl_labelw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const wchar_t *text, const else if(text[k+1]=='z') mglprintf(buf+l,nn-l,L"%.2g",zz); l=wcslen(buf); k++; } - gr->text_plot(kk, buf, fnt, size, 0.05); + gr->text_plot(kk, buf, fnt, -0.7, 0.05); } } delete []buf; gr->EndGroup(); @@ -776,3 +808,27 @@ void mgl_label_y_(uintptr_t *gr, uintptr_t *y, const char *text, const char *fnt char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; mgl_labelw_y(_GR_, _DA_(y),s,f, o); delete []o; delete []s; delete []f; } //----------------------------------------------------------------------------- +// +// Table series +// +//----------------------------------------------------------------------------- +void mgl_tablew(HMGL gr, double x, double y, HCDT val, const wchar_t *text, const char *fnt, const char *opt) +{ + mglCanvas *g = dynamic_cast(gr); + if(g) g->Table(x,y,val,text,fnt,opt); +} +void mgl_table(HMGL gr, double x, double y, HCDT val, const char *text, const char *fnt, const char *opt) +{ + if(!text) mgl_tablew(gr,x,y,val,L"",fnt,opt); + else + { long s = strlen(text)+1; wchar_t *wcs = new wchar_t[s]; mbstowcs(wcs,text,s); + mgl_tablew(gr, x, y, val, wcs, fnt, opt); delete []wcs; } +} +//----------------------------------------------------------------------------- +void mgl_table_(uintptr_t *gr, mreal *x, mreal *y, uintptr_t *val, const char *text, const char *fnt, const char *opt,int l,int n,int lo) +{ wchar_t *s=new wchar_t[l+1]; mbstowcs(s,text,l); s[l]=0; + char *f=new char[n+1]; memcpy(f,fnt,n); f[n]=0; + char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; + mgl_tablew(_GR_, *x, *y, _DA_(val),s,f, o); + delete []o; delete []s; delete []f; } +//----------------------------------------------------------------------------- diff --git a/src/s_hull/s_hull_pro.cpp b/src/s_hull/s_hull_pro.cpp index dbe32f3..17a5c39 100644 --- a/src/s_hull/s_hull_pro.cpp +++ b/src/s_hull/s_hull_pro.cpp @@ -25,6 +25,7 @@ using namespace std; */ +// Global replace int->long by A.Balakin 7 August 2012 -- 64bit version can handle huge data arrays void circle_cent2(float r1,float c1, float r2,float c2, float r3,float c3, @@ -73,10 +74,10 @@ void circle_cent2(float r1,float c1, float r2,float c2, float r3,float c3, */ -int read_Shx(std::vector &pts, char * fname) +long read_Shx(std::vector &pts, char * fname) { char s0[513]; - int nump =0; + long nump =0; float p1,p2; Shx pt; @@ -91,10 +92,10 @@ int read_Shx(std::vector &pts, char * fname) { getline (myfile,line); - //int numc = line.length(); + //long numc = line.length(); // check string for the string "points" - int n = (int) line.find( points_str); + long n = (long) line.find( points_str); if( n > 0) { while ( myfile.good() ) @@ -104,7 +105,7 @@ int read_Shx(std::vector &pts, char * fname) { copy( line.begin(), line.end(), s0); s0[line.length()] = 0; - int v = sscanf( s0, "%g %g", &p1,&p2); + long v = sscanf( s0, "%g %g", &p1,&p2); if( v>0 ) { pt.id = nump; @@ -122,7 +123,7 @@ int read_Shx(std::vector &pts, char * fname) { copy( line.begin(), line.end(), s0); s0[line.length()] = 0; - int v = sscanf( s0, "%g %g", &p1,&p2); + long v = sscanf( s0, "%g %g", &p1,&p2); if( v>0 ) { pt.id = nump; @@ -140,7 +141,7 @@ int read_Shx(std::vector &pts, char * fname) { copy( line.begin(), line.end(), s0); s0[line.length()] = 0; - int v = sscanf( s0, "%g %g", &p1,&p2); + long v = sscanf( s0, "%g %g", &p1,&p2); if( v>0 ) { pt.id = nump; @@ -155,7 +156,7 @@ int read_Shx(std::vector &pts, char * fname) myfile.close(); } - nump = (int) pts.size(); + nump = (long) pts.size(); return(nump); }; @@ -170,10 +171,10 @@ void write_Shx(std::vector &pts, char * fname) { std::ofstream out(fname, ios::out); - int nr = (int) pts.size(); + long nr = (long) pts.size(); out << nr << " 2 points" << endl; - for (int r = 0; r < nr; r++) + for (long r = 0; r < nr; r++) { out << pts[r].r << ' ' << pts[r].c << endl; } @@ -192,10 +193,10 @@ void write_Triads(std::vector &ts, char * fname) { std::ofstream out(fname, ios::out); - int nr = (int) ts.size(); + long nr = (long) ts.size(); out << nr << " 6 point-ids (1,2,3) adjacent triangle-ids ( limbs ab ac bc )" << endl; - for (int r = 0; r < nr; r++) + for (long r = 0; r < nr; r++) { out << ts[r].a+1 << ' ' << ts[r].b+1 <<' ' << ts[r].c+1 <<' ' << ts[r].ab+1 <<' ' << ts[r].ac+1 <<' ' << ts[r].bc+1 << endl; //" " << ts[r].ro << endl; @@ -214,10 +215,10 @@ void write_Triads(std::vector &ts, char * fname) */ -int s_hull_pro( std::vector &pts, std::vector &triads) +long s_hull_pro( std::vector &pts, std::vector &triads) { - int nump = (int) pts.size(); + long nump = (long) pts.size(); if( nump < 3 ) { @@ -229,7 +230,7 @@ int s_hull_pro( std::vector &pts, std::vector &triads) float r = pts[0].r; float c = pts[0].c; - for( int k=0; k &pts, std::vector &triads) float r2 = pts[1].r; float c2 = pts[1].c; - int mid = -1; + long mid = -1; float romin2 = 100000000.0, ro2, R=0,C=0; // added by A.Balakin 6 July 2012 -- uninitialised variable - int k=2; + long k=2; while (k &pts, std::vector &triads) pts.erase(pts.begin() ); pts.erase(pts.begin() ); - for( int k=0; k &pts, std::vector &triads) pts.insert(pts.begin(), pt1); pts.insert(pts.begin(), pt0); - // int slump [nump]; -// int * slump = new int [nump]; - std::vector slump; + // long slump [nump]; +// long * slump = new long [nump]; + std::vector slump; slump.resize(nump); - for( int k=0; k &pts, std::vector &triads) } else { - int mx = pts[k].id+1; - while( (int) slump.size() <= mx) + long mx = pts[k].id+1; + while( (long) slump.size() <= mx) { slump.push_back(0); } @@ -387,9 +388,9 @@ int s_hull_pro( std::vector &pts, std::vector &triads) float dr, dc, rx,cx; Shx ptx; - int numt=0; // added by A.Balakin 6 July 2012 -- uninitialised variable + long numt=0; // added by A.Balakin 6 July 2012 -- uninitialised variable - for( int k=3; k &pts, std::vector &triads) ptx.c = cx; ptx.id = pts[k].id; - int numh = (int) hull.size()/*, numh_old = numh*/; // commented by A.Balakin 6 July 2012 -- unused variable + long numh = (long) hull.size()/*, numh_old = numh*/; // commented by A.Balakin 6 July 2012 -- unused variable dr = rx- hull[0].r; dc = cx- hull[0].c; // outwards pointing from hull[0] to pt. - std::vector pidx, tridx; - int hidx; // new hull point location within hull..... + std::vector pidx, tridx; + long hidx; // new hull point location within hull..... float df = -dc* hull[0].tr + dr*hull[0].tc; // visibility test vector. if( df < 0 ) // starting with a visible hull facet !!! { -// int e1 = 1, e2 = numh; // commented by A.Balakin 6 July 2012 -- unused variable +// long e1 = 1, e2 = numh; // commented by A.Balakin 6 July 2012 -- unused variable hidx = 0; // check to see if segment numh is also visible @@ -420,7 +421,7 @@ int s_hull_pro( std::vector &pts, std::vector &triads) tridx.push_back(hull[numh-1].trid); - for( int h=0; h &pts, std::vector &triads) } // look backwards through the hull structure. - for( int h=numh-2; h>0; h--) + for( long h=numh-2; h>0; h--) { // if segment h is visible delete h + 1 dr = rx- hull[h].r; @@ -463,7 +464,7 @@ int s_hull_pro( std::vector &pts, std::vector &triads) else { - h = (int) hull.size()-1; + h = (long) hull.size()-1; hull[h].tr = -hull[h].r + ptx.r; // points at start of chain. hull[h].tc = -hull[h].c + ptx.c; break; @@ -480,7 +481,7 @@ int s_hull_pro( std::vector &pts, std::vector &triads) tridx.push_back(hull[0].trid); pidx.push_back(hull[0].id); - for( int h=1; h &pts, std::vector &triads) } else { - int e1 = -1, e2 = numh; - for( int h=1; h &pts, std::vector &triads) // triangle pidx starts at e1 and ends at e2 (inclusive). if( e2 < numh ) { - for( int e=e1; e<=e2; e++) + for( long e=e1; e<=e2; e++) { pidx.push_back(hull[e].id); tridx.push_back(hull[e].trid); @@ -546,7 +547,7 @@ int s_hull_pro( std::vector &pts, std::vector &triads) } else { - for( int e=e1; e &pts, std::vector &triads) } - int a = ptx.id, T0; + long a = ptx.id, T0; Triad trx( a, 0,0); r1 = pts[slump[a]].r; c1 = pts[slump[a]].c; - int npx = (int) pidx.size()-1; - numt = (int) triads.size(); + long npx = (long) pidx.size()-1; + numt = (long) triads.size(); T0 = numt; if( npx == 1) @@ -622,7 +623,7 @@ int s_hull_pro( std::vector &pts, std::vector &triads) hull[hidx-1].trid = numt; else { - numh = (int) hull.size(); + numh = (long) hull.size(); hull[numh-1].trid = numt; } triads.push_back( trx ); @@ -632,7 +633,7 @@ int s_hull_pro( std::vector &pts, std::vector &triads) else { trx.ab = -1; - for(int p=0; p &pts, std::vector &triads) hull[hidx-1].trid = T0; else { - numh = (int) hull.size(); + numh = (long) hull.size(); hull[numh-1].trid = T0; } @@ -682,9 +683,9 @@ int s_hull_pro( std::vector &pts, std::vector &triads) // write_Triads(triads, "tris0.mat"); - std::set ids, ids2; + std::set ids, ids2; - int tf = T_flip_pro( pts, triads, slump, numt, 0, ids); + long tf = T_flip_pro( pts, triads, slump, numt, 0, ids); if( tf < 0 ) { // Commented by A.Balakin 2 July 2012 -- library shouldn't print anything @@ -694,12 +695,12 @@ int s_hull_pro( std::vector &pts, std::vector &triads) // write_Triads(triads, "tris1.mat"); - int nits = (int) ids.size(), nit=1; + long nits = (long) ids.size(), nit=1; while( nits > 0 && nit < 50) { tf = T_flip_pro_idx( pts, triads, slump, ids); - nits = (int) ids.size(); + nits = (long) ids.size(); nit ++; if( tf < 0 ) { @@ -755,14 +756,15 @@ void circle_cent4(float r1,float c1, float r2,float c2, float r3,float c3, erase duplicate points, do not change point ids. */ +// Change return type to size_t to be 64 bit compatible -- by A.Balakin 7 August 2012 -int de_duplicate( std::vector &pts, std::vector &outx ) +size_t de_duplicate( std::vector &pts, std::vector &outx ) { - int nump = (int) pts.size(); + size_t nump = pts.size(); std::vector dpx; Dupex d; - for( int k=0; k &pts, std::vector &outx ) sort(dpx.begin(), dpx.end()); - for( int k=0; k &pts, std::vector &outx ) sort(outx.begin(), outx.end()); - int nx = (int) outx.size(); - for( int k=nx-1; k>=0; k--) + size_t nx = outx.size(); + for( size_t k=nx; k>0; k--) { - pts.erase(pts.begin()+outx[k]); + pts.erase(pts.begin()+outx[k-1]); } return(nx); @@ -809,22 +811,22 @@ int de_duplicate( std::vector &pts, std::vector &outx ) */ -int T_flip_pro( std::vector &pts, std::vector &triads, std::vector &slump, int numt, int start, std::set &ids) +long T_flip_pro( std::vector &pts, std::vector &triads, std::vector &slump, long numt, long start, std::set &ids) { float r3,c3; - int pa,pb,pc, pd, D, L1, L2, L3, L4, T2; + long pa,pb,pc, pd, D, L1, L2, L3, L4, T2; Triad tx, tx2; - for( int t=start; t= 0 ) { @@ -894,7 +896,7 @@ int T_flip_pro( std::vector &pts, std::vector &triads, std::vector &pts, std::vector &triads, std::vector &pts, std::vector &triads, std::vector &pts, std::vector &triads, std::vector &pts, std::vector &triads, std::vector &slump, std::set &ids) +long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vector &slump, std::set &ids) { float r3,c3; - int pa,pb,pc, pd, D, L1, L2, L3, L4, T2; + long pa,pb,pc, pd, D, L1, L2, L3, L4, T2; Triad tx, tx2; - std::set ids2; + std::set ids2; ids2.clear(); - std::set :: const_iterator x=ids.begin(); + std::set :: const_iterator x=ids.begin(); while(x != ids.end() ) { - int t = *x; + long t = *x; x++; Triad &tri = triads[t]; // test all 3 neighbours of tri - int flipped = 0; + long flipped = 0; @@ -1352,7 +1354,7 @@ int T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vect r3 = pts[pd].r; c3 = pts[pd].c; - int XX = Cline_Renka_test( pts[pa].r, pts[pa].c, pts[pb].r, pts[pb].c, + long XX = Cline_Renka_test( pts[pa].r, pts[pa].c, pts[pb].r, pts[pb].c, pts[pc].r, pts[pc].c,r3, c3); if( XX < 0 ) @@ -1479,7 +1481,7 @@ int T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vect r3 = pts[pd].r; c3 = pts[pd].c; - int XX = Cline_Renka_test( pts[pc].r, pts[pc].c, pts[pb].r, pts[pb].c, + long XX = Cline_Renka_test( pts[pc].r, pts[pc].c, pts[pb].r, pts[pb].c, pts[pa].r, pts[pa].c,r3, c3); if( XX < 0 ) @@ -1605,7 +1607,7 @@ int T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vect r3 = pts[pd].r; c3 = pts[pd].c; - int XX = Cline_Renka_test( pts[pb].r, pts[pb].c, pts[pc].r, pts[pc].c, + long XX = Cline_Renka_test( pts[pb].r, pts[pb].c, pts[pc].r, pts[pc].c, pts[pa].r, pts[pa].c,r3, c3); if( XX < 0 ) diff --git a/src/s_hull/s_hull_pro.h b/src/s_hull/s_hull_pro.h index 68fee00..7d4979a 100644 --- a/src/s_hull/s_hull_pro.h +++ b/src/s_hull/s_hull_pro.h @@ -24,16 +24,18 @@ email david@s-hull.org */ +// Global replace int->long by A.Balakin 7 August 2012 -- 64bit version can handle huge data arrays + struct Triad { - int a,b, c; - int ab, bc, ac; // adjacent edges index to neighbouring triangle. + long a,b, c; + long ab, bc, ac; // adjacent edges index to neighbouring triangle. float ro, R,C; - //std::set idx; - Triad() {a=b=c=ab=bc=ac=0; ro=R=C=0;}; // added by A.Balakin 6 July 2012 -- uninitialised variable - Triad(int x, int y) : a(x), b(y),c(0), ab(-1), bc(-1), ac(-1), ro(-1), R(0), C(0) {}; - Triad(int x, int y, int z) : a(x), b(y), c(z), ab(-1), bc(-1), ac(-1), ro(-1), R(0), C(0) {}; - Triad(const Triad &p) : a(p.a), b(p.b), c(p.c), ab(p.ab), bc(p.bc), ac(p.ac), ro(p.ro), R(p.R), C(p.C) {}; + //std::set idx; + Triad() {a=b=c=ab=bc=ac=0; ro=R=C=0;} // added by A.Balakin 6 July 2012 -- uninitialised variable + Triad(long x, long y) : a(x), b(y),c(0), ab(-1), bc(-1), ac(-1), ro(-1), R(0), C(0) {} + Triad(long x, long y, long z) : a(x), b(y), c(z), ab(-1), bc(-1), ac(-1), ro(-1), R(0), C(0) {} + Triad(const Triad &p) : a(p.a), b(p.b), c(p.c), ab(p.ab), bc(p.bc), ac(p.ac), ro(p.ro), R(p.R), C(p.C) {} Triad &operator=(const Triad &p) { @@ -50,7 +52,7 @@ struct Triad C = p.C; return *this; - }; + } }; @@ -62,15 +64,15 @@ struct Triad struct Shx { - int id, trid; + long id, trid; float r,c, tr,tc ; float ro; - Shx() {r=c=tr=tc=ro=0; id=trid=0;}; // added by A.Balakin 6 July 2012 -- uninitialised variable - Shx(float a, float b) : r(a), c(b), tr(0.0), tc(0.0), ro(0.0), id(-1) - { trid=0; }; // added by A.Balakin 6 July 2012 -- uninitialised variable - Shx(float a, float b, float x) : r(a), c(b), ro(x), tr(0), tc(0), id(-1) - { trid=0; }; // added by A.Balakin 6 July 2012 -- uninitialised variable - Shx(const Shx &p) : id(p.id), trid(p.trid), r(p.r), c(p.c), tr(p.tr), tc(p.tc), ro(p.ro) {}; + Shx() {r=c=tr=tc=ro=0; id=trid=0;} // added by A.Balakin 6 July 2012 -- uninitialised variable + Shx(float a, float b) : id(-1), r(a), c(b), tr(0.0), tc(0.0), ro(0.0) + { trid=0; } // added by A.Balakin 6 July 2012 -- uninitialised variable + Shx(float a, float b, float x) : id(-1), r(a), c(b), tr(0), tc(0), ro(x) + { trid=0; } // added by A.Balakin 6 July 2012 -- uninitialised variable + Shx(const Shx &p) : id(p.id), trid(p.trid), r(p.r), c(p.c), tr(p.tr), tc(p.tc), ro(p.ro) {} Shx &operator=(const Shx &p) { @@ -82,7 +84,7 @@ struct Shx tc = p.tc; ro = p.ro; return *this; - }; + } }; @@ -93,18 +95,18 @@ inline bool operator<(const Shx &a, const Shx &b) if( a.ro == b.ro) return a.r < b.r; return a.ro < b.ro; -}; +} struct Dupex { - int id; + long id; float r,c; - Dupex() {}; - Dupex(float a, float b) : id(-1), r(a), c(b) {}; - Dupex(float a, float b, int x) : r(a), c(b), id(x) {}; - Dupex(const Dupex &p) : id(p.id), r(p.r), c(p.c) {}; + Dupex() {} + Dupex(float a, float b) : id(-1), r(a), c(b) {} + Dupex(float a, float b, long x) : id(x), r(a), c(b) {} + Dupex(const Dupex &p) : id(p.id), r(p.r), c(p.c) {} Dupex &operator=(const Dupex &p) { @@ -112,7 +114,7 @@ struct Dupex r = p.r; c = p.c; return *this; - }; + } }; @@ -123,7 +125,7 @@ inline bool operator<(const Dupex &a, const Dupex &b) if( a.r == b.r) return a.c < b.c; return a.r < b.r; -}; +} @@ -132,18 +134,18 @@ inline bool operator<(const Dupex &a, const Dupex &b) // from s_hull.C -int s_hull_pro( std::vector &pts, std::vector &triads); +long s_hull_pro( std::vector &pts, std::vector &triads); void circle_cent2(float r1,float c1, float r2,float c2, float r3,float c3,float &r,float &c, float &ro2); void circle_cent4(float r1,float c1, float r2,float c2, float r3,float c3,float &r,float &c, float &ro2); void write_Shx(std::vector &pts, char * fname); void write_Triads(std::vector &ts, char * fname); -int Cline_Renka_test(float &Ax, float &Ay, float &Bx, float &By, float &Cx, float &Cy, float &Dx, float &Dy); -int T_flip_pro( std::vector &pts, std::vector &triads, std::vector &slump, int numt, int start, std::set &ids); -int T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vector &slump, std::set &ids); +long Cline_Renka_test(float &Ax, float &Ay, float &Bx, float &By, float &Cx, float &Cy, float &Dx, float &Dy); +long T_flip_pro( std::vector &pts, std::vector &triads, std::vector &slump, long numt, long start, std::set &ids); +long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vector &slump, std::set &ids); -int read_Shx(std::vector &pts, char * fname); +long read_Shx(std::vector &pts, char * fname); -int de_duplicate( std::vector &pts, std::vector &outx ); +size_t de_duplicate( std::vector &pts, std::vector &outx ); #endif diff --git a/src/surf.cpp b/src/surf.cpp index 37ce385..2311ae4 100644 --- a/src/surf.cpp +++ b/src/surf.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * surf.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -25,18 +25,39 @@ void mgl_mesh_plot(mglBase *gr, long *pos, long n, long m, int how) { int d = gr->MeshNum>0 ? gr->MeshNum+1 : n*m, dx = n>d?n/d:1, dy = m>d?m/d:1; - register long i,j; - if(how&1) for(j=0;jline_plot(pos[n*j+i],pos[n*j+i+1]); - if(how&2) for(j=0;jline_plot(pos[n*j+i],pos[n*j+i+n]); + register long i,j,s; + // NOTE: number of lines in each direction can be reduced too + if(how&1) for(j=0;j=0 && pos[n*j+i+1]>=0) s++; + d = gr->FaceNum>0 ? gr->FaceNum+1 : n; s = s>d?s/d:1; + for(i=0;iline_plot(pos[n*j+i],pos[n*j+i+s]); + + } + if(how&2) for(i=0;i=0 && pos[n*j+i+n]>=0) s++; + d = gr->FaceNum>0 ? gr->FaceNum+1 : n; s = s>d?s/d:1; + for(j=0;jline_plot(pos[n*j+i],pos[n*j+i+s*n]); + } } //----------------------------------------------------------------------------- void mgl_surf_plot(mglBase *gr, long *pos, long n, long m) { - register long i,j; + register long i,j,s=0; for(j=0;jquad_plot(pos[n*j+i],pos[n*j+i+1],pos[n*j+i+n],pos[n*j+i+n+1]); + if(pos[n*j+i]>=0 && pos[n*j+i+1]>=0 && pos[n*j+i+n]>=0 && pos[n*j+i+n+1]>=0) + s++; + long dx=1,dy=1; + if(gr->FaceNum && s>gr->FaceNum*gr->FaceNum) + { + int d = gr->FaceNum+1,ns=n*s/((n-1)*(m-1)),ms=m*s/((n-1)*(m-1)); + dx = ns>d?ns/d:1; dy = ms>d?ms/d:1; + } + for(j=0;jquad_plot(pos[n*j+i],pos[n*j+i+dx],pos[n*j+i+n*dy],pos[n*j+i+n*dy+dx]); } //----------------------------------------------------------------------------- // @@ -44,7 +65,7 @@ void mgl_surf_plot(mglBase *gr, long *pos, long n, long m) // //----------------------------------------------------------------------------- void mgl_fsurf(HMGL gr, const char *eqZ, const char *sch, const char *opt) -{ // TODO: Add strong function variation analisys ??? +{ // TODO: Add strong function variation analysis ??? if(eqZ==0 || eqZ[0]==0) return; // nothing to plot mreal r = gr->SaveState(opt); long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5); @@ -180,7 +201,7 @@ void mgl_fall_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *o p = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, z->v(i,j,k)); c = gr->GetC(ss,p.z); pos[i+n*j] = gr->AddPnt(p,c); } - mgl_mesh_plot(gr,pos,n,m, (sch && strchr(sch,'x')) ? 2:1); + mgl_mesh_plot(gr,pos,n,m, (mglchr(sch,'x')) ? 2:1); } delete []pos; gr->EndGroup(); } @@ -269,7 +290,7 @@ void mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *o static int cgid=1; gr->StartGroup("Surf",cgid++); long ss = gr->AddTexture(sch); long *pos = new long[n*m]; - bool wire = (sch && strchr(sch,'#')); + bool wire = (mglchr(sch,'#')); gr->Reserve(n*m*z->GetNz()*(wire?2:1)); mglPoint p,q,s,xx,yy; @@ -286,7 +307,8 @@ void mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *o c = gr->GetC(ss,p.z); pos[i+n*j] = gr->AddPnt(p,c,q^s); } - mgl_surf_plot(gr,pos,n,m); + if(sch && mglchr(sch,'.')) for(i=0;imark_plot(pos[i],'.'); + else mgl_surf_plot(gr,pos,n,m); if(wire) { gr->SetPenPal("k-"); @@ -331,7 +353,7 @@ void mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *o long ss = gr->AddTexture(sch); long *pos = new long[2*(n>m?n:m)]; gr->Reserve(2*n*m*z->GetNz()); - bool how = !(sch && strchr(sch,'x')); + bool how = !mglchr(sch,'x'); mglPoint p1,p2,q,s,xx,yy; mreal c; @@ -424,8 +446,9 @@ void mgl_dens_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *o if(mgl_isnan(zz)) p.x = NAN; pos[i+n*j] = gr->AddPnt(p,c,s); } - mgl_surf_plot(gr,pos,n,m); - if(sch && strchr(sch,'#')) + if(sch && mglchr(sch,'.')) for(i=0;imark_plot(pos[i],'.'); + else mgl_surf_plot(gr,pos,n,m); + if(mglchr(sch,'#')) { gr->Reserve(n*m); gr->SetPenPal("k-"); for(i=0;iGetC(ss,c->v(i,j,k)); pos[i+n*j] = gr->AddPnt(p,col,q^s); } - mgl_surf_plot(gr,pos,n,m); - if(sch && strchr(sch,'#')) + if(sch && mglchr(sch,'.')) for(i=0;imark_plot(pos[i],'.'); + else mgl_surf_plot(gr,pos,n,m); + if(mglchr(sch,'#')) { gr->Reserve(n*m); gr->SetPenPal("k-"); for(i=0;iCopyNtoC(pos[i],gr->CDef); @@ -564,8 +588,9 @@ void mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, cons s = mglPoint(xx.z, yy.z, z->dvy(i,j,k)); pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,vv),q^s,gr->GetA(c->v(i,j,k))); } - mgl_surf_plot(gr,pos,n,m); - if(sch && strchr(sch,'#')) + if(sch && mglchr(sch,'.')) for(i=0;imark_plot(pos[i],'.'); + else mgl_surf_plot(gr,pos,n,m); + if(mglchr(sch,'#')) { gr->Reserve(n*m); gr->SetPenPal("k-"); for(i=0;iCopyNtoC(pos[i],gr->CDef); @@ -609,8 +634,8 @@ void mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *o static int cgid=1; gr->StartGroup("Boxs",cgid++); long ss = gr->AddTexture(sch); - bool wire = sch && strchr(sch,'#'); - bool full = sch && strchr(sch,'@'); + bool wire = mglchr(sch,'#'); + bool full = mglchr(sch,'@'); gr->Reserve(8*n*m*z->GetNz()); mglPoint p1,p2,p3,p4,q,s,t(wire||full?NAN:0,0,1),xx,yy; @@ -871,11 +896,11 @@ void mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, cons xx = (x->v(i) - gr->Min.x)/(gr->Max.x - gr->Min.x); yy = (y->v(j) - gr->Min.y)/(gr->Max.y - gr->Min.y); } - if(xx<0) xx=0; if(xx>=1) xx=1/MGL_EPSILON; - if(yy<0) yy=0; if(yy>=1) yy=1/MGL_EPSILON; + if(xx<0) xx=0; if(xx>=1) xx=1/MGL_FEPSILON; + if(yy<0) yy=0; if(yy>=1) yy=1/MGL_FEPSILON; pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,xx,false),t,yy); } - if(sch && strchr(sch,'.')) for(i=0;imark_plot(pos[i],'.',-1); + if(sch && mglchr(sch,'.')) for(i=0;imark_plot(pos[i],'.'); else mgl_surf_plot(gr,pos,n,m); delete []pos; gr->EndGroup(); } diff --git a/src/tex_table.cpp b/src/tex_table.cpp index 03c6560..9a1953c 100644 --- a/src/tex_table.cpp +++ b/src/tex_table.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_tex_table.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/vect.cpp b/src/vect.cpp index a9e6010..b7d375b 100644 --- a/src/vect.cpp +++ b/src/vect.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * vect.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -102,16 +102,16 @@ void mgl_traj_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uint //----------------------------------------------------------------------------- void mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt) { - long i,j,n=ax->GetNx(),m=ax->GetNy(),k; + long i,j,n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(),k; if(mgl_check_dim2(gr,x,y,ax,ay,"Vect")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Vect",cgid++); - bool dot = sch && strchr(sch,'.'); - bool fix = sch && strchr(sch,'f'); - bool end = sch && strchr(sch,'>'); - bool beg = sch && strchr(sch,'<'); - bool grd = sch && strchr(sch,'='); + bool dot = sch && mglchr(sch,'.'); + bool fix = mglchr(sch,'f'); + bool end = mglchr(sch,'>'); + bool beg = mglchr(sch,'<'); + bool grd = mglchr(sch,'='); long ss = gr->AddTexture(sch); gr->Reserve(4*n*m); @@ -120,37 +120,43 @@ void mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, con long tx=1,ty=1; if(gr->MeshNum>1) { tx=(n-1)/(gr->MeshNum-1); ty=(m-1)/(gr->MeshNum-1); } if(tx<1) tx=1; if(ty<1) ty=1; - mreal xm=0,ym,dx,dy; - mreal dd,dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5; - mreal vx,vy; - for(k=0;kGetNz();k++) for(j=0;jMax.c)+fabs(gr->Min.c))*1e-5; + // use whole array for determining maximal vectors length + mglPoint p1,p2, v, d; + mreal c1,c2,xx; + + for(k=0;kv(i,j,k); vy = ay->v(i,j,k); - ym = vx*vx+vy*vy; xm = xm>ym ? xm : ym; + d = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x); + v = mglPoint(ax->v(i,j,k),ay->v(i,j,k)); + c1 = v.norm(); xm = xm2*ca) cm = 2*ca; // disable too narrow grid steps + xm = xm?1./xm:0; cm = cm?1./cm:0; - for(k=0;kGetNz();k++) + + long n1,n2; + for(k=0;kGetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1); for(i=0;iStop) return; - xx = GetX(x,i,j,k).x; yy = GetY(y,i,j,k).x; - dx = iv(i,j,k); vy = ay->v(i,j,k); - dx *= tx; dy *= ty; dd = hypot(vx,vy); - dx *= fix ? (dd>dm ? vx/dd : 0) : vx*xm; - dy *= fix ? (dd>dm ? vy/dd : 0) : vy*xm; - - if(end) { p1 = mglPoint(xx-dx,yy-dy,zVal); p2 = mglPoint(xx,yy,zVal); } - else if(beg) { p1 = mglPoint(xx,yy,zVal); p2 = mglPoint(xx+dx,yy+dy,zVal); } - else { p1=mglPoint(xx-dx/2,yy-dy/2,zVal); p2=mglPoint(xx+dx/2,yy+dy/2,zVal); } + d = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal); + v = mglPoint(ax->v(i,j,k),ay->v(i,j,k)); + dd = v.norm(); v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm); + + if(end) { p1 = d-v; p2 = d; } + else if(beg) { p1 = d; p2 = d+v; } + else { p1=d-v/2.; p2=d+v/2.; } if(grd) { c1=gr->GetC(ss,dd*xm-0.5,false); c2=gr->GetC(ss,dd*xm,false);} else c1 = c2 = gr->GetC(ss,dd*xm,false); n1=gr->AddPnt(p1,c1); n2=gr->AddPnt(p2,c2); @@ -192,52 +198,58 @@ void mgl_vect_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, void mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt) { register long i,j,n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(),k; - if(mgl_check_vec3(gr,x,y,z,ax,ay,az,"Vect3")) return; + if(mgl_check_vec3(gr,x,y,z,ax,ay,az,"Vect_3d")) return; gr->SaveState(opt); - static int cgid=1; gr->StartGroup("Vect3",cgid++); - bool dot = sch && strchr(sch,'.'); - bool fix = sch && strchr(sch,'f'); - bool end = sch && strchr(sch,'>'); - bool beg = sch && strchr(sch,'<'); - bool grd = sch && strchr(sch,'='); + static int cgid=1; gr->StartGroup("Vect_3d",cgid++); + bool dot = mglchr(sch,'.'); + bool fix = mglchr(sch,'f'); + bool end = mglchr(sch,'>'); + bool beg = mglchr(sch,'<'); + bool grd = mglchr(sch,'='); - mreal xm=0,ym,dx,dy,dz,dd,dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5; long ss = gr->AddTexture(sch); gr->Reserve(2*n*m*l); long tx=1,ty=1,tz=1; if(gr->MeshNum>1) { tx=(n-1)/(gr->MeshNum-1); ty=(m-1)/(gr->MeshNum-1); tz=(l-1)/(gr->MeshNum-1);} if(tx<1) tx=1; if(ty<1) ty=1; if(tz<1) tz=1; - mglPoint p; - for(k=0;kMax.c)+fabs(gr->Min.c))*1e-5; + // use whole array for determining maximal vectors length + mglPoint p1,p2,p3, v, d; + mreal c1,c2,c3,xx; + + for(k=0;kv(i,j,k),ay->v(i,j,k),az->v(i,j,k)); - ym = p.x*p.x+p.y*p.y+p.z*p.z; xm = xm>ym ? xm : ym; + d = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x); + v = mglPoint(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k)); + c1 = v.norm(); xm = xm2*ca) cm = 2*ca; // disable too narrow grid steps + xm = xm?1./xm:0; cm = cm?1./cm:0; long n1,n2; - mglPoint p1,p2; - mreal c1,c2, xx,yy,zz; - for(k=0;kStop) return; - xx = GetX(x,i,j,k).x; yy = GetY(y,i,j,k).x; zz = GetZ(z,i,j,k).x; - dx = iv(i,j,k),ay->v(i,j,k),az->v(i,j,k)); dd = p.norm(); - dx *= fix ? (dd>dm ? p.x/dd : 0) : p.x*xm; - dy *= fix ? (dd>dm ? p.y/dd : 0) : p.y*xm; - dz *= fix ? (dd>dm ? p.z/dd : 0) : p.z*xm; - - if(end) { p1 = mglPoint(xx-dx,yy-dy,zz-dz); p2 = mglPoint(xx,yy,zz); } - else if(beg) { p1 = mglPoint(xx,yy,zz); p2 = mglPoint(xx+dx,yy+dy,zz+dz); } - else { p1=mglPoint(xx-dx/2,yy-dy/2,zz-dz/2); p2=mglPoint(xx+dx/2,yy+dy/2,zz+dz/2); } + d=mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x); + v = mglPoint(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k)); + dd = v.norm(); v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm); + + if(end) { p1 = d-v; p2 = d; } + else if(beg) { p1 = d; p2 = d+v; } + else { p1=d-v/2.; p2=d+v/2.; } if(grd) { c1=gr->GetC(ss,dd*xm-0.5,false); c2=gr->GetC(ss,dd*xm,false); } else c1 = c2 = gr->GetC(ss,dd*xm,false); n1=gr->AddPnt(p1,c1); n2=gr->AddPnt(p2,c2); @@ -273,10 +285,298 @@ void mgl_vect_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, co mgl_vect_3d(_GR_, _DA_(ax), _DA_(ay), _DA_(az), s, o); delete []o; delete []s; } //----------------------------------------------------------------------------- // +// Vect3 series +// +//----------------------------------------------------------------------------- +struct _mgl_vec_slice { mglData x,y,z,ax,ay,az; }; +//----------------------------------------------------------------------------- +void mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, char dir, mreal d, bool both) +{ + register long i,j,i0,n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(), nx=1,ny=1,p; + + if(dir=='x') { nx = m; ny = l; if(d<0) d = n/2.; } + if(dir=='y') { nx = n; ny = l; if(d<0) d = m/2.; } + if(dir=='z') { nx = n; ny = m; if(d<0) d = l/2.; } + s.x.Create(nx,ny); s.y.Create(nx,ny); s.z.Create(nx,ny); + s.ax.Create(nx,ny); s.ay.Create(nx,ny); s.az.Create(nx,ny); + p = long(d); d -= p; + if(dir=='x' && p>=n-1) { d+=p-n+2; p=n-2; } + if(dir=='y' && p>=m-1) { d+=p-m+2.; p=m-2; } + if(dir=='z' && p>=l-1) { d+=p-l+2; p=l-2; } + mreal v; + + if(both) + { + if(dir=='x') for(j=0;jv(p,i,j)*(1-d) + x->v(p+1,i,j)*d; + s.y.a[i0] = y->v(p,i,j)*(1-d) + y->v(p+1,i,j)*d; + s.z.a[i0] = z->v(p,i,j)*(1-d) + z->v(p+1,i,j)*d; + s.ax.a[i0] = ax->v(p,i,j)*(1-d) + ax->v(p+1,i,j)*d; + s.ay.a[i0] = ay->v(p,i,j)*(1-d) + ay->v(p+1,i,j)*d; + s.az.a[i0] = az->v(p,i,j)*(1-d) + az->v(p+1,i,j)*d; + } + if(dir=='y') for(j=0;jv(i,p,j)*(1-d) + x->v(i,p+1,j)*d; + s.y.a[i0] = y->v(i,p,j)*(1-d) + y->v(i,p+1,j)*d; + s.z.a[i0] = z->v(i,p,j)*(1-d) + z->v(i,p+1,j)*d; + s.ax.a[i0] = ax->v(i,p,j)*(1-d) + ax->v(i,p+1,j)*d; + s.ay.a[i0] = ay->v(i,p,j)*(1-d) + ay->v(i,p+1,j)*d; + s.az.a[i0] = az->v(i,p,j)*(1-d) + az->v(i,p+1,j)*d; + } + if(dir=='z') for(j=0;jv(i,j,p)*(1-d) + x->v(i,j,p+1)*d; + s.y.a[i0] = y->v(i,j,p)*(1-d) + y->v(i,j,p+1)*d; + s.z.a[i0] = z->v(i,j,p)*(1-d) + z->v(i,j,p+1)*d; + s.ax.a[i0] = ax->v(i,j,p)*(1-d) + ax->v(i,j,p+1)*d; + s.ay.a[i0] = ay->v(i,j,p)*(1-d) + ay->v(i,j,p+1)*d; + s.az.a[i0] = az->v(i,j,p)*(1-d) + az->v(i,j,p+1)*d; + } + } + else // x, y, z -- vectors + { + if(dir=='x') + { + v = x->v(p)*(1-d)+x->v(p+1)*d; + for(j=0;jv(i); s.z.a[i0] = z->v(j); + s.ax.a[i0] = ax->v(p,i,j)*(1-d) + ax->v(p+1,i,j)*d; + s.ay.a[i0] = ay->v(p,i,j)*(1-d) + ay->v(p+1,i,j)*d; + s.az.a[i0] = az->v(p,i,j)*(1-d) + az->v(p+1,i,j)*d; + } + } + if(dir=='y') + { + v = y->v(p)*(1-d)+y->v(p+1)*d; + for(j=0;jv(i); s.z.a[i0] = z->v(j); + s.ax.a[i0] = ax->v(i,p,j)*(1-d) + ax->v(i,p+1,j)*d; + s.ay.a[i0] = ay->v(i,p,j)*(1-d) + ay->v(i,p+1,j)*d; + s.az.a[i0] = az->v(i,p,j)*(1-d) + az->v(i,p+1,j)*d; + } + } + if(dir=='z') + { + v = z->v(p)*(1-d)+z->v(p+1)*d; + for(j=0;jv(i); s.y.a[i0] = y->v(j); + s.ax.a[i0] = ax->v(i,j,p)*(1-d) + ax->v(i,j,p+1)*d; + s.ay.a[i0] = ay->v(i,j,p)*(1-d) + ay->v(i,j,p+1)*d; + s.az.a[i0] = az->v(i,j,p)*(1-d) + az->v(i,j,p+1)*d; + } + } + } +} +//----------------------------------------------------------------------------- +void mgl_get_slice_md(_mgl_vec_slice &s, const mglData *x, const mglData *y, const mglData *z, const mglData *ax, const mglData *ay, const mglData *az, char dir, mreal d, bool both) +{ + register long i,j,i0,i1,n=ax->nx,m=ax->ny,l=ax->nz, nx=1,ny=1,p; + + if(dir=='x') { nx = m; ny = l; if(d<0) d = n/2.; } + if(dir=='y') { nx = n; ny = l; if(d<0) d = m/2.; } + if(dir=='z') { nx = n; ny = m; if(d<0) d = l/2.; } + s.x.Create(nx,ny); s.y.Create(nx,ny); s.z.Create(nx,ny); + s.ax.Create(nx,ny); s.ay.Create(nx,ny); s.az.Create(nx,ny); + p = long(d); d -= p; + if(dir=='x' && p>=n-1) { d+=p-n+2; p=n-2; } + if(dir=='y' && p>=m-1) { d+=p-m+2.; p=m-2; } + if(dir=='z' && p>=l-1) { d+=p-l+2; p=l-2; } + mreal v; + + if(both) + { + if(dir=='x') for(j=0;ja[i1]*(1-d) + x->a[i1+1]*d; + s.y.a[i0] = y->a[i1]*(1-d) + y->a[i1+1]*d; + s.z.a[i0] = z->a[i1]*(1-d) + z->a[i1+1]*d; + s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+1]*d; + s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+1]*d; + s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+1]*d; + } + if(dir=='y') for(j=0;ja[i1]*(1-d) + x->a[i1+n]*d; + s.y.a[i0] = y->a[i1]*(1-d) + y->a[i1+n]*d; + s.z.a[i0] = z->a[i1]*(1-d) + z->a[i1+n]*d; + s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+n]*d; + s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+n]*d; + s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+n]*d; + } + if(dir=='z') for(j=0;ja[i1]*(1-d) + x->a[i1+n*m]*d; + s.y.a[i0] = y->a[i1]*(1-d) + y->a[i1+n*m]*d; + s.z.a[i0] = z->a[i1]*(1-d) + z->a[i1+n*m]*d; + s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+n*m]*d; + s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+n*m]*d; + s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+n*m]*d; + } + } + else // x, y, z -- vectors + { + if(dir=='x') + { + v = x->a[p]*(1-d)+x->a[p+1]*d; + for(j=0;ja[i]; s.z.a[i0] = z->a[j]; + s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+1]*d; + s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+1]*d; + s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+1]*d; + } + } + if(dir=='y') + { + v = y->a[p]*(1-d)+y->a[p+1]*d; + for(j=0;ja[i]; s.z.a[i0] = z->a[j]; + s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+n]*d; + s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+n]*d; + s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+n]*d; + } + } + if(dir=='z') + { + v = z->a[p]*(1-d)+z->a[p+1]*d; + for(j=0;ja[i]; s.y.a[i0] = y->a[j]; + s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+n*m]*d; + s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+n*m]*d; + s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+n*m]*d; + } + } + } +} +//----------------------------------------------------------------------------- +void mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt) +{ + bool both = mgl_isboth(x,y,z,ax); + if(mgl_check_vec3(gr,x,y,z,ax,ay,az,"Vect3")) return; + + gr->SaveState(opt); + static int cgid=1; gr->StartGroup("Vect3",cgid++); + char dir='y'; + if(mglchr(sch,'x')) dir='x'; + if(mglchr(sch,'z')) dir='z'; + + bool dot = mglchr(sch,'.'); + bool fix = mglchr(sch,'f'); + bool end = mglchr(sch,'>'); + bool beg = mglchr(sch,'<'); + bool grd = mglchr(sch,'='); + long ss = gr->AddTexture(sch); + + _mgl_vec_slice s; + const mglData *mx = dynamic_cast(x); + const mglData *my = dynamic_cast(y); + const mglData *mz = dynamic_cast(z); + const mglData *max = dynamic_cast(ax); + const mglData *may = dynamic_cast(ay); + const mglData *maz = dynamic_cast(az); + if(mx&&my&&mz&&max&&may&&maz) + mgl_get_slice_md(s,mx,my,mz,max,may,maz,dir,sVal,both); + else + mgl_get_slice(s,x,y,z,ax,ay,az,dir,sVal,both); + + long i,j,n=s.ax.nx,m=s.ax.ny; + long tx=1,ty=1; + if(gr->MeshNum>1) { tx=(n-1)/(gr->MeshNum-1); ty=(m-1)/(gr->MeshNum-1); } + if(tx<1) tx=1; if(ty<1) ty=1; + mreal xm=0,cm=0,ca=0; + mreal dd,dm=(fabs(gr->Max.c)+fabs(gr->Min.c))*1e-5; + // use whole array for determining maximal vectors length + mglPoint p1,p2, v, d=(gr->Max-gr->Min)/mglPoint(1./ax->GetNx(),1./ax->GetNy(),1./ax->GetNz()); + mreal c1,c2, xx,yy,zz; + + register long i0, tn=ty*n; + for(i=0;i2*ca) cm = 2*ca; // disable too narrow grid steps + xm = xm?1./xm:0; cm = cm?1./cm:0; + + long n1,n2; + for(i=0;iStop) return; + i0 = i+n*j; + d = mglPoint(s.x.a[i0], s.y.a[i0], s.z.a[i0]); + v = mglPoint(s.ax.a[i0], s.ay.a[i0], s.az.a[i0]); + dd = v.norm(); v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm); + + if(end) { p1 = d-v; p2 = d; } + else if(beg) { p1 = d; p2 = d+v; } + else { p1=d-v/2.; p2=d+v/2.; } + if(grd) { c1=gr->GetC(ss,dd*xm-0.5,false); c2=gr->GetC(ss,dd*xm,false);} + else c1 = c2 = gr->GetC(ss,dd*xm,false); + n1=gr->AddPnt(p1,c1); n2=gr->AddPnt(p2,c2); + // allow vectors outside bounding box + if(n1<0 && n2>=0) n1=gr->AddPnt(p1,c1,mglPoint(NAN),-1,2); + if(n2<0 && n1>=0) n2=gr->AddPnt(p2,c2,mglPoint(NAN),-1,2); + if(dot) { gr->line_plot(n1,n2); gr->mark_plot(n1,'.'); } + else gr->vect_plot(n1,n2); + } + gr->EndGroup(); +} +//----------------------------------------------------------------------------- +void mgl_vect3(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt) +{ + gr->SaveState(opt); + mglData x(ax->GetNx()), y(ax->GetNy()),z(ax->GetNz()); + x.Fill(gr->Min.x,gr->Max.x); + y.Fill(gr->Min.y,gr->Max.y); + z.Fill(gr->Min.z,gr->Max.z); + mgl_vect3_xyz(gr,&x,&y,&z,ax,ay,az,sch,sVal,0); + gr->LoadState(); +} +//----------------------------------------------------------------------------- +void mgl_vect3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int l,int lo) +{ char *s=new char[l+1]; memcpy(s,sch,l); s[l]=0; + char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; + mgl_vect3_xyz(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(ax), _DA_(ay), _DA_(az), s, *sVal, o); + delete []o; delete []s; } +//----------------------------------------------------------------------------- +void mgl_vect3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int l,int lo) +{ char *s=new char[l+1]; memcpy(s,sch,l); s[l]=0; + char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; + mgl_vect3(_GR_, _DA_(ax), _DA_(ay), _DA_(az), s, *sVal, o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +// // Flow 2d series // //----------------------------------------------------------------------------- -void flow(mglBase *gr, mreal zVal, mreal u, mreal v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, long ss, bool vv) +void flow(mglBase *gr, double zVal, double u, double v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, long ss, bool vv) { long n=10*(ax.nx+ax.ny); bool both = x.nx==ax.nx && y.nx==ax.nx && x.ny==ax.ny && y.ny==ax.ny; @@ -344,10 +644,10 @@ void mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, con static int cgid=1; gr->StartGroup("Flow",cgid++); long ss = gr->AddTexture(sch); - bool vv = sch && strchr(sch,'v'); + bool vv = mglchr(sch,'v'); // allocate memory mreal zVal = gr->Min.z; - bool cnt=!(sch && strchr(sch,'#')); + bool cnt=!mglchr(sch,'#'); mglData xx(x), yy(y), bx(ax), by(ay); for(long k=0;kGetNz();k++) @@ -401,7 +701,7 @@ void mgl_flow_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; mgl_flow_2d(_GR_, _DA_(ax), _DA_(ay), s, o); delete []o; delete []s; } //----------------------------------------------------------------------------- -void mgl_flowp_xy(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt) +void mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt) { mglPoint p(x0,y0,z0); mreal u,v; @@ -413,7 +713,7 @@ void mgl_flowp_xy(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT x, HCDT y, HCDT ax static int cgid=1; gr->StartGroup("FlowP",cgid++); long ss = gr->AddTexture(sch); - bool vv = sch && strchr(sch,'v'); + bool vv = mglchr(sch,'v'); // find coordinates u, v register long i,j; register mreal d, dm=1e7; @@ -448,7 +748,7 @@ void mgl_flowp_xy(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT x, HCDT y, HCDT ax gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_flowp_2d(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT ax, HCDT ay, const char *sch, const char *opt) +void mgl_flowp_2d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, const char *sch, const char *opt) { gr->SaveState(opt); mglData x(ax->GetNx()), y(ax->GetNy()); @@ -472,7 +772,7 @@ void mgl_flowp_2d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *ax // Flow 3d series // //----------------------------------------------------------------------------- -void flow(mglBase *gr, mreal u, mreal v, mreal w, const mglData &x, const mglData &y, const mglData &z, const mglData &ax, const mglData &ay, const mglData &az,long ss,bool vv, bool xo, bool zo) +void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mglData &y, const mglData &z, const mglData &ax, const mglData &ay, const mglData &az,long ss,bool vv, bool xo, bool zo) { static long n=10*(ax.nx+ax.ny); long nn = ax.nx*ax.ny*ax.nz; @@ -563,9 +863,9 @@ void mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, co mreal r = gr->SaveState(opt); long num = mgl_isnan(r)?3:long(r+0.5); static int cgid=1; gr->StartGroup("Flow3",cgid++); - bool cnt=!(sch && strchr(sch,'#')); + bool cnt=!mglchr(sch,'#'); long ss = gr->AddTexture(sch); - bool vv = sch && strchr(sch,'v'), xo = sch && strchr(sch,'x'), zo = sch && strchr(sch,'z'); + bool vv = mglchr(sch,'v'), xo = mglchr(sch,'x'), zo = mglchr(sch,'z'); mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az); for(i=0;iSaveState(opt); static int cgid=1; gr->StartGroup("FlowP3",cgid++); long ss = gr->AddTexture(sch); - bool vv = sch && strchr(sch,'v'), xo = sch && strchr(sch,'x'), zo = sch && strchr(sch,'z'); + bool vv = mglchr(sch,'v'), xo = mglchr(sch,'x'), zo = mglchr(sch,'z'); // find coordinates u, v, w register long i,j,k; @@ -680,7 +980,7 @@ void mgl_flowp_xyz(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT x, HCDT y, HCDT z gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_flowp_3d(HMGL gr, mreal x0, mreal y0, mreal z0, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt) +void mgl_flowp_3d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt) { gr->SaveState(opt); mglData x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); @@ -770,7 +1070,7 @@ void mgl_grad_(uintptr_t *gr, uintptr_t *ph, const char *sch, const char *opt, i // Pipe 2d series // //----------------------------------------------------------------------------- -void flowr(mglBase *gr, mreal zVal, mreal u, mreal v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, mreal r0,long sc) +void flowr(mglBase *gr, double zVal, double u, double v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, double r0,long sc) { long n=10*(ax.nx+ax.ny); bool both = x.nx==ax.nx && y.nx==ax.nx && x.ny==ax.ny && y.ny==ax.ny; @@ -814,7 +1114,7 @@ void flowr(mglBase *gr, mreal zVal, mreal u, mreal v, const mglData &x, const mg } while(!end); if(k>1) { - const int num=41; + const int num=24; long i,j,*id=new long[2*num]; mglPoint p,l=pp[1]-pp[0],t,q,d; t = !l; t.Normalize(); q = t^l; q.Normalize(); @@ -849,7 +1149,7 @@ void flowr(mglBase *gr, mreal zVal, mreal u, mreal v, const mglData &x, const mg delete []pp; delete []cc; } //----------------------------------------------------------------------------- -void mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, mreal r0, const char *opt) +void mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt) { mreal u,v; if(mgl_check_dim2(gr,x,y,ax,ay,"Pipe")) return; @@ -861,8 +1161,8 @@ void mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, mre long ss = gr->AddTexture(sch); // allocate memory mreal zVal = gr->Min.z; - bool cnt=!(sch && strchr(sch,'#')); - if(sch && strchr(sch,'i')) r0 = -fabs(r0); + bool cnt=!mglchr(sch,'#'); + if(mglchr(sch,'i')) r0 = -fabs(r0); mglData xx(x), yy(y), bx(ax), by(ay); for(long k=0;kGetNz();k++) @@ -897,7 +1197,7 @@ void mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, mre gr->EndGroup(); } //----------------------------------------------------------------------------- -void mgl_pipe_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, mreal r0, const char *opt) +void mgl_pipe_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt) { gr->SaveState(opt); mglData x(ax->GetNx()), y(ax->GetNy()); @@ -920,7 +1220,7 @@ void mgl_pipe_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, // Pipe 3d series // //----------------------------------------------------------------------------- -void flowr(mglBase *gr, mreal u, mreal v, mreal w, const mglData &x, const mglData &y, const mglData &z, const mglData &ax, const mglData &ay, const mglData &az, mreal r0,long sc) +void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mglData &y, const mglData &z, const mglData &ax, const mglData &ay, const mglData &az, double r0,long sc) { static long n=10*(ax.nx+ax.ny); long nn = ax.nx*ax.ny*ax.nz; @@ -972,7 +1272,7 @@ void flowr(mglBase *gr, mreal u, mreal v, mreal w, const mglData &x, const mglDa } while(!end); if(k>1) { - const int num=41; + const int num=24; long i,j,*id=new long[2*num]; mglPoint p,l=pp[1]-pp[0],t,q,d; t = !l; t.Normalize(); q = t^l; q.Normalize(); @@ -1007,7 +1307,7 @@ void flowr(mglBase *gr, mreal u, mreal v, mreal w, const mglData &x, const mglDa delete []pp; delete []cc; } //----------------------------------------------------------------------------- -void mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, mreal r0, const char *opt) +void mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt) { mreal u,v,w; long i,j; @@ -1016,10 +1316,10 @@ void mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, co mreal r = gr->SaveState(opt); long num = mgl_isnan(r)?3:long(r+0.5); static int cgid=1; gr->StartGroup("Pipe3",cgid++); - if(sch && strchr(sch,'i')) r0 = -fabs(r0); + if(mglchr(sch,'i')) r0 = -fabs(r0); long ss = gr->AddTexture(sch); - bool cnt=!(sch && strchr(sch,'#')); + bool cnt=!mglchr(sch,'#'); mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az); for(i=0;iEndGroup(); } //----------------------------------------------------------------------------- -void mgl_pipe_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, mreal r0, const char *opt) +void mgl_pipe_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt) { gr->SaveState(opt); mglData x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); diff --git a/src/volume.cpp b/src/volume.cpp index 7c40043..6f99e2c 100644 --- a/src/volume.cpp +++ b/src/volume.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * surf.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -44,8 +44,8 @@ void mgl_cloud_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, con if(tx<1) tx=1; if(ty<1) ty=1; if(tz<1) tz=1; mreal alpha = gr->AlphaDef; - bool inv = sch && strchr(sch,'!'); - bool dot = sch && strchr(sch,'.'); + bool inv = mglchr(sch,'i'); + bool dot = mglchr(sch,'.'); alpha /= pow(n/tx*m/ty*l/tz,1./3)/20; mreal aa,bb; if(alpha>1) alpha = 1; @@ -53,7 +53,7 @@ void mgl_cloud_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, con // x, y, z -- have the same size as a n /= tx; m /= ty; l /= tz; - long *pos=new long[n*m*l]; // TODO check if nReserve(n*m*l); mglPoint p,q=mglPoint(NAN); for(k=0;kv(i*tx,j*ty,k*tz),y->v(i*tx,j*ty,k*tz),z->v(i*tx,j*ty,k*tz)) : mglPoint(x->v(i*tx),y->v(j*ty),z->v(k*tz)); aa = gr->GetA(a->v(i*tx,j*ty,k*tz)); bb = inv ? (1-aa)*(1-aa)*alpha : aa*aa*alpha; - pos[i+n*(j+m*k)] = gr->AddPnt(p,gr->GetC(ss,aa,false),q,bb); // TODO check boundary + pos[i+n*(j+m*k)] = gr->AddPnt(p,gr->GetC(ss,aa,false),q,bb); } if(dot) for(i=0;imark_plot(pos[i],'.'); else for(i=0;i1e-10 ? pc/sqrt(p1*p2) : NAN; } //----------------------------------------------------------------------------- -void mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *ky1,long *ky2, long *kz, std::vector kk, bool wire) +void mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *ky1,long *ky2, long *kz, std::vector kk, int wire) { register long i,j,k,i0,ii,jj; long id[12],us[12],pd[12],ni; @@ -214,30 +214,38 @@ void mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *ky1,long *k } if(i0<0) break; // no more triangles. NOTE: should be never here jj = i0; us[jj]=1; p3 = pd[jj]; - if(wire) + if(wire==1) { gr->line_plot(p1, p2); gr->line_plot(p1, p3); gr->line_plot(p2, p3); } + else if(wire==2) + { + gr->mark_plot(p1, '.'); + gr->mark_plot(p2, '.'); + gr->mark_plot(p3, '.'); + } else gr->trig_plot(p1, p2, p3); p2 = p3; } } } //----------------------------------------------------------------------------- -void mgl_surf3_xyz_val(HMGL gr, mreal val, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt) +void mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt) { long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); long *kx1,*kx2,*ky1,*ky2,*kz; - bool both = mgl_isboth(x,y,z,a), wire = sch && strchr(sch,'#'); + bool both = mgl_isboth(x,y,z,a); + int wire = mglchr(sch,'#')?1:0; + if(mglchr(sch,'.')) wire = 2; mreal d; if(mgl_check_dim3(gr,both,x,y,z,a,0,"Surf3")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Surf3",cgid++); - bool inv = (sch && strchr(sch,'-')); + bool inv = (mglchr(sch,'-')); long ss = gr->AddTexture(sch), pos; kx1 = new long[n*m]; kx2 = new long[n*m]; @@ -317,7 +325,7 @@ void mgl_surf3_xyz_val(HMGL gr, mreal val, HCDT x, HCDT y, HCDT z, HCDT a, const delete []ky2; delete []kz; } //----------------------------------------------------------------------------- -void mgl_surf3_val(HMGL gr, mreal val, HCDT a, const char *sch, const char *opt) +void mgl_surf3_val(HMGL gr, double val, HCDT a, const char *sch, const char *opt) { gr->SaveState(opt); mglData x(a->GetNx()), y(a->GetNy()), z(a->GetNz()); @@ -375,18 +383,20 @@ void mgl_surf3_(uintptr_t *gr, uintptr_t *a, const char *sch, const char *opt,in // Surf3A series // //----------------------------------------------------------------------------- -void mgl_surf3a_xyz_val(HMGL gr, mreal val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt) +void mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt) { long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); long *kx1,*kx2,*ky1,*ky2,*kz; - bool both = mgl_isboth(x,y,z,a), wire = sch && strchr(sch,'#'); + bool both = mgl_isboth(x,y,z,a); + int wire = mglchr(sch,'#')?1:0; + if(mglchr(sch,'.')) wire = 2; mreal d; if(mgl_check_dim3(gr,both,x,y,z,a,b,"Surf3A")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Surf3A",cgid++); - bool inv = (sch && strchr(sch,'-')); + bool inv = (mglchr(sch,'-')); long ss = gr->AddTexture(sch), pos; kx1 = new long[n*m]; kx2 = new long[n*m]; @@ -470,7 +480,7 @@ void mgl_surf3a_xyz_val(HMGL gr, mreal val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT delete []ky2; delete []kz; } //----------------------------------------------------------------------------- -void mgl_surf3a_val(HMGL gr, mreal val, HCDT a, HCDT b, const char *sch, const char *opt) +void mgl_surf3a_val(HMGL gr, double val, HCDT a, HCDT b, const char *sch, const char *opt) { gr->SaveState(opt); mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); @@ -541,18 +551,20 @@ void mgl_surf3a_(uintptr_t *gr, uintptr_t *a, uintptr_t *b, const char *sch, con // Surf3C series // //----------------------------------------------------------------------------- -void mgl_surf3c_xyz_val(HMGL gr, mreal val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt) +void mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt) { long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); long *kx1,*kx2,*ky1,*ky2,*kz; - bool both = mgl_isboth(x,y,z,a), wire = sch && strchr(sch,'#'); + bool both = mgl_isboth(x,y,z,a); + int wire = mglchr(sch,'#')?1:0; + if(mglchr(sch,'.')) wire = 2; mreal d; if(mgl_check_dim3(gr,both,x,y,z,a,b,"Surf3C")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Surf3C",cgid++); - bool inv = (sch && strchr(sch,'-')); + bool inv = (mglchr(sch,'-')); long ss = gr->AddTexture(sch), pos; kx1 = new long[n*m]; kx2 = new long[n*m]; @@ -636,7 +648,7 @@ void mgl_surf3c_xyz_val(HMGL gr, mreal val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT delete []ky2; delete []kz; } //----------------------------------------------------------------------------- -void mgl_surf3c_val(HMGL gr, mreal val, HCDT a, HCDT b, const char *sch, const char *opt) +void mgl_surf3c_val(HMGL gr, double val, HCDT a, HCDT b, const char *sch, const char *opt) { gr->SaveState(opt); mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); @@ -699,7 +711,7 @@ void mgl_surf3c_(uintptr_t *gr, uintptr_t *a, uintptr_t *b, const char *sch, con // flag & 0x1 -- accompanied coordinates // flag & 0x2 -- project to r*z // flag & 0x4 -- normalize field -void mgl_beam_md(HMGL gr, mreal val, const mglData *tr, const mglData *g1, const mglData *g2, const mglData *a, mreal r, const char *stl, int flag) +void mgl_beam_md(HMGL gr, double val, const mglData *tr, const mglData *g1, const mglData *g2, const mglData *a, double r, const char *stl, int flag) { long n = a->nz,m=a->nx,l=a->ny; if(n<2 || m<2 || l<2) { gr->SetWarn(mglWarnLow,"Beam"); return; } @@ -748,7 +760,7 @@ void mgl_beam_md(HMGL gr, mreal val, const mglData *tr, const mglData *g1, const mgl_surf3_xyz_val(gr,val,&x,&y,&z,&b,stl,0); } //----------------------------------------------------------------------------- -void mgl_beam_val(HMGL gr, mreal val, HCDT tr, HCDT g1, HCDT g2, HCDT a, mreal r, const char *stl, int flag) +void mgl_beam_val(HMGL gr, double val, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int flag) { const mglData *dtr=dynamic_cast(tr); @@ -805,7 +817,7 @@ void mgl_beam_val(HMGL gr, mreal val, HCDT tr, HCDT g1, HCDT g2, HCDT a, mreal r mgl_surf3_xyz_val(gr,val,&x,&y,&z,&b,stl,0); } //----------------------------------------------------------------------------- -void mgl_beam(HMGL gr, HCDT tr, HCDT g1, HCDT g2, HCDT a, mreal r, const char *stl, int flag, int num) +void mgl_beam(HMGL gr, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int flag, int num) { num = num<=0 ? 1 : num; for(long i=0;i * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -23,23 +23,27 @@ mglCanvasWnd::mglCanvasWnd() : mglCanvas() { Setup(); LoadFunc=0; FuncPar=0; DrawFunc=0; ClickFunc=0; GG = 0; NumFig = 0; CurFig = -1; -// set(MGL_USEDRWDAT); // TODO: experimental feature -- test later } //----------------------------------------------------------------------------- mglCanvasWnd::~mglCanvasWnd() { if(GG) free(GG); } //----------------------------------------------------------------------------- -void mglCanvasWnd::SetCurFig(int c) { CurFig=c; if(get(MGL_USEDRWDAT)) GetDrwDat(c); } +void mglCanvasWnd::SetCurFig(int c) +{ + CurFig=c; + if(get(MGL_VECT_FRAME) && c>=0 && c<(long)DrwDat.size() && DrawFunc) + GetFrame(c); +} //----------------------------------------------------------------------------- -void mglCanvasWnd::ClearFrames() +void mglCanvasWnd::ResetFrames() { if(GG) free(GG); GG = 0; - CurFrameId = NumFig = CurFig = 0; - DrwDat.clear(); + NumFig = CurFig = 0; + mglCanvas::ResetFrames(); } //----------------------------------------------------------------------------- void mglCanvasWnd::SetSize(int w,int h) { - ClearFrames(); + if(DrawFunc) ResetFrames(); mglCanvas::SetSize(w,h); // if(Wnd) Wnd->size(w,h); } @@ -54,27 +58,50 @@ void mglCanvasWnd::EndFrame() } else if(CurFig>NumFig-1) { - GG = (unsigned char *)realloc(GG,3*(NumFig+1)*Width*Height); - NumFig++; + GG = (unsigned char *)realloc(GG,3*(CurFig+1)*Width*Height); + NumFig = CurFig+1; } mglCanvas::EndFrame(); memcpy(GG + CurFig*Width*Height*3,G,3*Width*Height); CurFig++; } //----------------------------------------------------------------------------- +void mglCanvasWnd::SetFrame(long i) +{ + mglCanvas::SetFrame(i); + if(i>=0 && i=CurFrameId) return; + if(CurFig>=i) CurFig--; + long n = Width*Height*3; + if(CurFrameId-i>1) memmove(GG+i*n, GG+i*n+n, n*(CurFrameId-i-1)); + mglCanvas::DelFrame(i); +} +//----------------------------------------------------------------------------- void mglCanvasWnd::SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par, void (*reload)(void *p)) { - ClearFrames(); + ResetFrames(); + if(get(MGL_CLF_ON_UPD)) DefaultPlotParam(); + setlocale(LC_NUMERIC, "C"); + // use frames for quickly redrawing while adding/changing primitives + if(get(MGL_VECT_FRAME) && !(GetQuality()&4)) NewFrame(); + int n = draw ? draw(this,par) : 0; if(n=0) NumFig = n; DrawFunc = draw; FuncPar = par; LoadFunc = reload; + + if(get(MGL_VECT_FRAME) && !(GetQuality()&4)) EndFrame(); + setlocale(LC_NUMERIC, ""); } //----------------------------------------------------------------------------- const unsigned char *mglCanvasWnd::GetBits() { const unsigned char *g = mglCanvas::GetBits(); - if(GG && NumFig>0 && CurFig=0) + if(GG && NumFig>0 && CurFig=0 && !get(MGL_VECT_FRAME)) g = GG + CurFig*Width*Height*3; return g; } @@ -85,9 +112,16 @@ void mglCanvasWnd::ReLoad() { LoadFunc(FuncPar); // update number of slides - ClearFrames(); + ResetFrames(); + setlocale(LC_NUMERIC, "C"); + // use frames for quickly redrawing while adding/changing primitives + if(get(MGL_VECT_FRAME) && !(GetQuality()&4)) NewFrame(); + int n = DrawFunc ? DrawFunc(this,FuncPar) : 0; if(n=0) NumFig = n; + + if(get(MGL_VECT_FRAME) && !(GetQuality()&4)) EndFrame(); + setlocale(LC_NUMERIC, ""); Update(); } } @@ -164,53 +198,11 @@ void mgl_get_last_mouse_pos_(uintptr_t *gr, mreal *x, mreal *y, mreal *z) mglPoint p; if(g) p=g->GetMousePos(); *x=p.x; *y=p.y; *z=p.z; } //----------------------------------------------------------------------------- -#if MGL_HAVE_FLTK==0 -HMGL mgl_create_graph_fltk(int (*)(HMGL gr, void *p), const char *, void *, void (*)(void *p)) -{ return NULL; } -int mgl_fltk_run(){return 0;} -#endif -//----------------------------------------------------------------------------- -uintptr_t mgl_create_graph_fltk_(const char *title, int l) -{ - char *s = new char[l+1]; memcpy(s,title,l); s[l]=0; - uintptr_t t = uintptr_t(mgl_create_graph_fltk(0,s,0,0)); - delete []s; return t; -} -int mgl_fltk_run_() { return mgl_fltk_run(); } -//----------------------------------------------------------------------------- -void *mgl_fltk_tmp(void *) -{ mgl_fltk_run(); return 0; } -//----------------------------------------------------------------------------- -int mgl_fltk_thr() // NOTE: Qt couldn't be running in non-primary thread -{ -#if MGL_HAVE_PTHREAD - static pthread_t thr; - pthread_create(&thr,0,mgl_fltk_tmp,0); - pthread_detach(thr); -#endif - return 0; // stupid, but I don't want keep result returned by Fl::Run() -} -//----------------------------------------------------------------------------- - -#if MGL_HAVE_QT==0 -HMGL mgl_create_graph_qt(int (*)(HMGL gr, void *p), const char *, void *, void (*)(void *p)) -{ return NULL; } -int mgl_qt_run(){return 0;} -#endif -//----------------------------------------------------------------------------- -uintptr_t mgl_create_graph_qt_(const char *title, int l) -{ - char *s = new char[l+1]; memcpy(s,title,l); s[l]=0; - uintptr_t t = uintptr_t(mgl_create_graph_qt(0,s,0,0)); - delete []s; return t; -} -int mgl_qt_run_() { return mgl_qt_run(); } -//----------------------------------------------------------------------------- // // mglDraw class handling // //----------------------------------------------------------------------------- -int mgl_draw_class(HMGL gr, void *p) // so stupid way to save mglDraw class inheritance :( +/*int mgl_draw_class(HMGL gr, void *p) // so stupid way to save mglDraw class inheritance :( { mglGraph g(gr); mglWindow *w = (mglWindow *)p; return (w && w->dr) ? w->dr->Draw(&g) : 0; @@ -218,7 +210,13 @@ int mgl_draw_class(HMGL gr, void *p) // so stupid way to save mglDraw class inhe void mgl_reload_class(void *p) // so stupid way to save mglDraw class inheritance :( { mglWindow *w = (mglWindow *)p; if(w && w->dr) w->dr->Reload();} void mgl_click_class(void *p) // so stupid way to save mglDraw class inheritance :( -{ mglWindow *w = (mglWindow *)p; if(w && w->dr) w->dr->Click(); } +{ mglWindow *w = (mglWindow *)p; if(w && w->dr) w->dr->Click(); }*/ +int mgl_draw_class(HMGL gr, void *p) +{ mglGraph g(gr); mglDraw *dr = (mglDraw *)p; return dr->Draw(&g); } +void mgl_reload_class(void *p) +{ mglDraw *dr = (mglDraw *)p; dr->Reload(); } +void mgl_click_class(void *p) +{ mglDraw *dr = (mglDraw *)p; dr->Click(); } //----------------------------------------------------------------------------- typedef int (*draw_func)(mglGraph *gr); int mgl_draw_graph(HMGL gr, void *p) diff --git a/texinfo/CMakeLists.txt b/texinfo/CMakeLists.txt index b3afc0f..299b4d8 100644 --- a/texinfo/CMakeLists.txt +++ b/texinfo/CMakeLists.txt @@ -2,21 +2,32 @@ if(MGL_HAVE_DOC) set(MGL_PNG alpha area aspect axial axis barh bars belt boxplot box boxs candle chart cloud colorbar combined cones conta contd contfa contf contf_xyz cont contv cont_xyz curvcoor cut dat_diff - dat_extra densa dens dens_xyz dew dots error fall fit flow + dat_extra densa dens dens_xyz dew dots error fall fit flow fonts fog grad hist inplot label legend loglog map mark mesh mirror - molecule parser pde pipe plot primitives qo2d radar region schemes - several_light stem step stereo stfa style surf3a surf3c surf3 - surfa surfc surf tape tens ternary textmark text ticks tile - tiles torus traj triangulation triplot tube type0 type1 type2 vect venn ) + molecule parser pde pipe plot primitives projection qo2d radar region schemes + several_light solve stem step stereo stfa style surf3a surf3c surf3 + surfa surfc surf table tape tens ternary textmark text ticks tile tiles + torus traj triangulation triplot tube type0 type1 type2 vect vecta venn + projection5 ) set(MGL_PNG_N ) set(MGL_PNG_S ) + set(MGL_PNG_J ) set(MGL_OUT ${CMAKE_BINARY_DIR}/texinfo) set(MGL_TEX ${CMAKE_SOURCE_DIR}/texinfo) + file(MAKE_DIRECTORY ${MGL_OUT}/udav) file(MAKE_DIRECTORY ${MGL_OUT}/png) file(MAKE_DIRECTORY ${MGL_OUT}/small) - file(COPY ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png DESTINATION ${MGL_OUT}) - file(COPY ${MGL_TEX}/toc_ru.html ${MGL_TEX}/toc_fr.html ${MGL_TEX}/toc_en.html ${MGL_TEX}/title.html ${MGL_TEX}/index.html DESTINATION ${MGL_OUT}) + file(MAKE_DIRECTORY ${MGL_OUT}/json) + file(COPY ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/emblem_sm.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_OUT}) + file(COPY ${MGL_TEX}/toc_ru.html ${MGL_TEX}/toc_fr.html ${MGL_TEX}/toc_en.html ${MGL_TEX}/title.html ${MGL_TEX}/index.html ${MGL_TEX}/json.html ${MGL_TEX}/mathgl.js DESTINATION ${MGL_OUT}) + + set(UDAV_IMG udav_arg.png udav_calc.png udav_cmd.png udav_data.png + udav_gen_set.png udav_help.png udav_light.png udav_main.png udav_opt.png + udav_pen.png udav_prop.png udav_sch.png udav_txt.png udav_var.png) + foreach(SAMPLE ${UDAV_IMG}) + file(COPY ${MGL_TEX}/udav/${SAMPLE} DESTINATION ${MGL_OUT}/udav/) + endforeach(SAMPLE) foreach(SAMPLE ${MGL_PNG}) set(MGL_PNG_N ${MGL_PNG_N} ${MGL_OUT}/png/${SAMPLE}.png) @@ -29,12 +40,17 @@ if(MGL_HAVE_DOC) COMMAND ${CMAKE_BINARY_DIR}/examples/mgl_example -kind=${SAMPLE} -mini DEPENDS mgl_example WORKING_DIRECTORY ${MGL_OUT}/small ) + set(MGL_PNG_J ${MGL_PNG_J} ${MGL_OUT}/json/${SAMPLE}.json) + add_custom_command(OUTPUT ${MGL_OUT}/json/${SAMPLE}.json + COMMAND ${CMAKE_BINARY_DIR}/examples/mgl_example -json -kind=${SAMPLE} + DEPENDS mgl_example + WORKING_DIRECTORY ${MGL_OUT}/json ) endforeach(SAMPLE) - set(list_texi_files_en mathgl_en.texi mgl_en.texi overview_en.texi example_en.texi ex_mgl_en.texi parse_en.texi - core_en.texi concept_en.texi widget_en.texi data_en.texi other_en.texi appendix_en.texi fdl.texi) - set(list_texi_files_ru mathgl_ru.texi mgl_ru.texi overview_ru.texi example_ru.texi ex_mgl_ru.texi parse_ru.texi - core_ru.texi concept_ru.texi widget_ru.texi data_ru.texi other_ru.texi appendix_ru.texi fdl.texi) + set(list_texi_files_en overview_en.texi example_en.texi ex_mgl_en.texi parse_en.texi formats_en.texi udav_en.texi symbols_en.texi + core_en.texi concept_en.texi widget_en.texi data_en.texi other_en.texi appendix_en.texi fdl.texi ) + set(list_texi_files_ru overview_ru.texi example_ru.texi ex_mgl_ru.texi parse_ru.texi formats_ru.texi udav_ru.texi symbols_ru.texi + core_ru.texi concept_ru.texi widget_ru.texi data_ru.texi other_ru.texi appendix_ru.texi fdl.texi ) add_custom_command(OUTPUT ${MGL_OUT}/web_en.pdf COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/web_en.texi @@ -45,28 +61,28 @@ if(MGL_HAVE_DOC) ) add_custom_command(OUTPUT ${MGL_OUT}/web_en/web_en.html COMMAND ${findth} -I=${MGL_OUT}/png --split=section -o web_en ${MGL_TEX}/web_en.texi - DEPENDS web_en.texi ${MGL_PNG_S} + DEPENDS web_en.texi ${MGL_PNG_S} ${MGL_PNG_J} WORKING_DIRECTORY ${MGL_OUT} ) add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.info COMMAND ${findmi} --no-validate ${MGL_TEX}/mathgl_en.texi - DEPENDS ${list_texi_files_en} ${MGL_PNG_N} + DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en/mathgl_en.html COMMAND ${findth} -I=${MGL_OUT}/png --split=section -o mathgl_en ${MGL_TEX}/mathgl_en.texi - DEPENDS ${list_texi_files_en} ${MGL_PNG_N} + DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) add_custom_command(OUTPUT ${MGL_OUT}/doc_en/doc_en.html - COMMAND ${findth} -I=${MGL_OUT}/png --split=node --frames -o doc_en ${MGL_TEX}/doc_en.texi - DEPENDS ${list_texi_files_en} ${MGL_PNG_N} + COMMAND ${findth} -I=${MGL_OUT}/png --split=section --frames -o doc_en ${MGL_TEX}/doc_en.texi + DEPENDS ${list_texi_files_en} doc_en.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.html - COMMAND ${findth} -I=${MGL_OUT}/png --split=no -o mgl_en.html ${MGL_TEX}/mgl_en.texi - DEPENDS ${list_texi_files_en} ${MGL_PNG_N} + COMMAND ${findth} -I=${MGL_OUT} --split=no -o mgl_en.html ${MGL_TEX}/mgl_en.texi + DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) @@ -74,7 +90,15 @@ if(MGL_HAVE_DOC) COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/mathgl_en.texi COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/mathgl_en.texi COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/mathgl_en.texi - DEPENDS ${list_texi_files_en} ${MGL_PNG_N} + DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} + ) + + add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.pdf + COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/mgl_en.texi + COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/mgl_en.texi + COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/mgl_en.texi + DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) @@ -87,28 +111,28 @@ if(MGL_HAVE_DOC) ) add_custom_command(OUTPUT ${MGL_OUT}/web_ru/web_ru.html COMMAND ${findth} -I=${MGL_OUT}/png --split=section -o web_ru ${MGL_TEX}/web_ru.texi - DEPENDS web_ru.texi ${MGL_PNG_S} + DEPENDS web_ru.texi ${MGL_PNG_S} ${MGL_PNG_J} WORKING_DIRECTORY ${MGL_OUT} ) add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.info COMMAND ${findmi} --no-validate ${MGL_TEX}/mathgl_ru.texi - DEPENDS ${list_texi_files_ru} ${MGL_PNG_N} + DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru/mathgl_ru.html COMMAND ${findth} -I=${MGL_OUT}/png --split=section -o mathgl_ru ${MGL_TEX}/mathgl_ru.texi - DEPENDS ${list_texi_files_ru} ${MGL_PNG_N} + DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) add_custom_command(OUTPUT ${MGL_OUT}/doc_ru/doc_ru.html - COMMAND ${findth} -I=${MGL_OUT}/png --split=node --frames -o doc_ru ${MGL_TEX}/doc_ru.texi - DEPENDS ${list_texi_files_ru} ${MGL_PNG_N} + COMMAND ${findth} -I=${MGL_OUT}/png --split=section --frames -o doc_ru ${MGL_TEX}/doc_ru.texi + DEPENDS ${list_texi_files_ru} doc_ru.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.html COMMAND ${findth} -I=${MGL_OUT}/png --split=no -o mgl_ru.html ${MGL_TEX}/mgl_ru.texi - DEPENDS ${list_texi_files_ru} ${MGL_PNG_N} + DEPENDS ${list_texi_files_ru} mgl_ru.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) @@ -116,12 +140,13 @@ if(MGL_HAVE_DOC) COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/mathgl_ru.texi COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/mathgl_ru.texi COMMAND ${findtp} -I ${MGL_OUT}/png ${MGL_TEX}/mathgl_ru.texi - DEPENDS ${list_texi_files_ru} ${MGL_PNG_N} + DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N} WORKING_DIRECTORY ${MGL_OUT} ) add_custom_target(documentation ALL DEPENDS ${MGL_OUT}/mathgl_en.info + DEPENDS ${MGL_OUT}/mgl_en.pdf DEPENDS ${MGL_OUT}/mathgl_en.pdf DEPENDS ${MGL_OUT}/mgl_en.html DEPENDS ${MGL_OUT}/mathgl_en/mathgl_en.html @@ -134,18 +159,19 @@ if(MGL_HAVE_DOC) DEPENDS ${MGL_OUT}/mgl_ru.html DEPENDS ${MGL_OUT}/mathgl_ru/mathgl_ru.html -# DEPENDS ${MGL_OUT}/doc_ru/doc_ru.html -# DEPENDS ${MGL_OUT}/web_ru/web_ru.html + DEPENDS ${MGL_OUT}/doc_ru/doc_ru.html + DEPENDS ${MGL_OUT}/web_ru/web_ru.html ) # add_custom_target(clean # COMMAND rm -f * */* # WORKING_DIRECTORY ${MGL_OUT} # ) - set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "doc_en;mathgl_en;web_en;./mathgl*.*;small/*.*;png/*.*") - install(FILES ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png DESTINATION ${MGL_DOC_PATH}) + set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "doc_en;mathgl_en;web_en;./mathgl*.*;small/*.*;png/*.*;json/*.*") + install(FILES ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_DOC_PATH}) install(FILES ${MGL_OUT}/mathgl_en.pdf ${MGL_OUT}/mgl_en.html DESTINATION ${MGL_DOC_PATH}) install(DIRECTORY ${MGL_OUT}/mathgl_en DESTINATION ${MGL_DOC_PATH}) install(DIRECTORY ${MGL_OUT}/png DESTINATION ${MGL_DOC_PATH}) + install(DIRECTORY ${MGL_OUT}/udav DESTINATION ${MGL_DOC_PATH}) install(FILES ${MGL_TEX}/mglconv.1 ${MGL_TEX}/mglview.1 DESTINATION ${MGL_MAN_PATH}/man1) install(FILES ${MGL_TEX}/mgl.5 DESTINATION ${MGL_MAN_PATH}/man5) # TODO: try to install all mathgl*.info* in future!!! diff --git a/texinfo/classes.dia b/texinfo/classes.dia new file mode 100644 index 0000000000000000000000000000000000000000..04bf40dbd4b8027a7414c72b6aab9929e8a43b35 GIT binary patch literal 3500 zcmV;d4O8+TiwFP!000021MOXHZ`(!^{+?eUC|_lIU&&?Nq-c6b4`>c|#ii(>Uj*8s zWnO90plCbphx_ffBxPHoNK@i+RV#o4oM?-R+XLoj9zW?Fdbv(KYvqh99AI8)n z<58Ggq_ZfQe;EJv_4A1u|M2nM_p>PYPXC){!SzVLBUu!`eHdTm`OSByr}y{wPW-S4 z@-%be=+;?;r~eD$I5^dVPRAeLjYg{z%z`{9UR%Bzc39iErj7#V(^fPdik~v)j-}!hJN$uQr85NnQys`}|j7G{4FX zr>|aq0*_sRXr4v0mvLxqM9VDYb((&A>E;_;s%rKJpxN)DMRXpAO`m><`}{cl!!Xm= z?@mcZ&u=$;8mie^*>0vn8Oq(+Zhjlh!bQhpwmzn1rmN+!)2^#tAGhs=sa~qBJxURA z@DOIp=|4TMI!4PIyhNK(aFIuMkH4*4ll1(*;YGew_H&%xUt9%QJ~|nFO23Vt*Hn5% z70o`3|4G)bR$V_mo5uBx%XO1JJyT?I;yFSRslpRV>K9@YM%tvDpVx(CT8|)^$6+Pt zgg8V_%I{}h@n7orvY)zH&dX_jm*dvg0+OVqc=J#Es=%q?HUE~jO zSQii`x7XF|qTkdvTKn~d(B?9z-^_XVEgyIAL2XRiMK1RPYvXELhwFL#DOiLp`-c}; zs%^QGCV7**;`PyGa2>@D`eOyjVmvBuONoTlTmK%$cVQk~1gogO`zL5vZ8h8)Mb^KB znb38NZbCEe6o^TMG!s;}$=2N}A!dT~Du13_hs}5M*?8!dQW|-=ZEbP-Or-spm6|gv z2d7h}IkaL^0nVlzDHJL64fEVjL2?%?km+nNoj|6u$8^k`>0EH8lTS?NfiskJ{i-4|&uck8)EURTBxwqXlo4+r%>}3m$cWd9=4S$fLMpJR-9D`3rI# zG}lq;6o7_gXN~NHDcMmMlBe~=!m&;xEBEYgEF06j2pdY~)xz~SkEAw3{H>_`v4qHoC# zJ#eIlq3Ge?8fj-iHq-3zB}&2udQhhHP=rQ6250N1fh#tlj;9nmbkJ~ks}21ZQxWW>}s|JZjt2^t9CI?9()^P;1epz_Rj zlwPV80p-NiKY@+8uHNPdZ_{I5X<*FCmMzmELV9{X%iBfu2uEo))?#Eq z%G9kQdpM;E*pN4LYZxL8)JIc3R8tn~=IHHW${fO!x5!;KPU)f^X!u2WoL0qOFgx)V z{T15AfvOi1>po6}@##I|(+Rn}Bm{lL&_3c{{}JR@7@KY>_7KBMtk&+}1MnZ{31UTn z)e$1IbA)K15>g;i;1N>b=Xi=FXp;o-l+-2(iXli)!jqs_Awkyy2?EAhO5{A`yo2Vv z`)^2jHYpF|MlA*gQ8|R)6Zi;2;Vs>tHqJ2W$~6qpG%U(bcTfizWof1E z(iVh~OLB0AE_PtyK*9T#G;mSNq>Mia|K>H(t9o) zSwa$U?MU@Xv-`=bIE38ggs|4&_CVIR)iX5Bf?0ICc;S8wV8L5-3^7joVw%|jO_-I% z&Wo7xGtM6yWkFhSe|<2l05YuL@-mPZR$!&#$j@1DbA@3A;B7th^Pu4jqYCWx$1+Zg zWUwjDOgz;(=fp;>^ZxoE+rhFO2GQAKJFMGof$a1;9_zN-B|GEPVa`Cwj?-td^K6h^ ze|?bb-Zt4`L&$C(#a56u_KX5))H03o0X(EWxQA3ddq}}6aP(IQc@#H|M?rR2j@gob z6w7T`B|9<1aUcU{yQjQ6J9nb?ob65pXa6QZ!jAJP1eU|vi6drTr>#);aTLzma!MWpA%T{i8|4+*83 zmU@C;n&ns1?uH$_v#bV}MIV6eM!9`kdz7Cx&7$?^toDqNjStZH{Ouw)xXn{d4tWEB z4@3``wl+k6k@jNb-DzvAR#<|Hp%d3$MxFsWLPFQ|ad^?0z^jl)R!1t3u+xnvbQ{nq z2YHA&h&ce5BMmZT>xjebB90oO2d#a`;joa?U5TcElkG+!=pg7ofR6WiLB}5ebfkUI zae+ZcZUs6LK?gx+U!dc@TF~KS0Iv@8Qm5Ii!-3s8o$Hv&W3%NjbnGDXfH-!<>vimK zIt2L0eSnV(4L))^@R0~U2tNA*ANh*G$2ixm%ufUk;}AuJwcb2C&7WM zu2stj1TF-wR}5V2@PMm3VwMk*Bck9VX1$e&S>Hm$tip&{jF^3^5wrL6`1dH8rS}*$ zYbR>f$EaD`QL|hQ;o?;LaB=$3E>5+bi&LSC6BpcjTX6HkK3{3+(Zk&#Dv-dU4x^4L zf=QOWFqyK~3v)xch9L~wU=CQa3b6<@rZDA=%FXO!4cmR9H~K)_btJZT!SOm797bf;0XH{A{-rbFv@OlB=!VH{vanK z;Be$qQLcv+QzaUC)d`6Qo#czP{g0-BOYdA2CeI4O<_*!>-U z+TRuN1MvI1{`w%@;r{Mu=wefZ#L14N9m923`BH&723xTLcb<71e3{O3os)m9p3s z1uG4d$0*p%rIp@jK|#^Vm&xT!eUQpox(V+vs^G!SogZn*j)Ia zsH=Q&MwP>b@H9@6;&))ouItw@LOHB-kx^WM9oY)ZHCcg4=!QuxHZ9FlBN?zwGvc^X z@@JbaB#6SJ$m!2%lhqJVc^{ZhE$x zCv{IiWSo=Z8Pq`73Wr?B7qo~RrVdlW^UtW~P~yAA7L6#yfx)P*UvpG5Zqg8p4hoEj zL0bjUUg>ifF!~h!6@^(FB$>B#A;5lMZSdUTF7=D9vC<=a(i4Tw!@suZ zGDOLa0p6rHjutVn)8ZB{`t^4qkPue{s$E{fK^(fo562I+l}nsIR=HY#@9qxq>i0N! a2(ypxs$cZKc@|uMeD{BUH2?slI{^UkhPz_` literal 0 HcmV?d00001 diff --git a/texinfo/classes.odg b/texinfo/classes.odg deleted file mode 100644 index 4d245d237b8ab67af438bebfec65bfdbd17b8498..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11301 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 CDxe_% diff --git a/texinfo/classes.pdf b/texinfo/classes.pdf index 666ff9da08b20ca266a2963f334824d67c52cf03..db68b627132da4f0a3b50809fcffe66ee81dfd83 100644 GIT binary patch literal 53847 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

The color types are: ‘k’ -- black, ‘r’ -- red, ‘R’ -- dark red, ‘g’ -- green, ‘G’ -- dark green, ‘b’ -- blue, ‘B’ -- dark blue, ‘c’ -- cyan, ‘C’ -- dark cyan, ‘m’ -- magenta, ‘M’ -- dark magenta, ‘y’ -- yellow, ‘Y’ -- dark yellow (gold), ‘h’ -- gray, ‘H’ -- dark gray, ‘w’ -- white, ‘W’ -- bright gray, ‘l’ -- green-blue, ‘L’ -- dark green-blue, ‘e’ -- green-yellow, ‘E’ -- dark green-yellow, ‘n’ -- sky-blue, ‘N’ -- dark sky-blue, ‘u’ -- blue-violet, ‘U’ -- dark blue-violet, ‘p’ -- purple, ‘P’ -- dark purple, ‘q’ -- orange, ‘Q’ -- dark orange (brown).

+

The color types are: ‘k’ – black, ‘r’ – red, ‘R’ – dark red, ‘g’ – green, ‘G’ – dark green, ‘b’ – blue, ‘B’ – dark blue, ‘c’ – cyan, ‘C’ – dark cyan, ‘m’ – magenta, ‘M’ – dark magenta, ‘y’ – yellow, ‘Y’ – dark yellow (gold), ‘h’ – gray, ‘H’ – dark gray, ‘w’ – white, ‘W’ – bright gray, ‘l’ – green-blue, ‘L’ – dark green-blue, ‘e’ – green-yellow, ‘E’ – dark green-yellow, ‘n’ – sky-blue, ‘N’ – dark sky-blue, ‘u’ – blue-violet, ‘U’ – dark blue-violet, ‘p’ – purple, ‘P’ – dark purple, ‘q’ – orange, ‘Q’ – dark orange (brown).

@end html @end ifhtml @ifnothtml @@ -63,6 +63,16 @@ The color types are: @samp{k} -- black, @samp{r} -- red, @samp{R} -- dark red, @ You can also use ``bright'' colors. The ``bright'' color contain 2 symbols in brackets @samp{@{cN@}}: first one is the usual symbol for color id, the second one is a digit for its brightness. The digit can be in range @samp{1}...@samp{9}. Number @samp{5} corresponds to a normal color, @samp{1} is a very dark version of the color (practically black), and @samp{9} is a very bright version of the color (practically white). For example, the colors can be @samp{@{b2@}} @samp{@{b7@}} @samp{@{r7@}} and so on. +Finally, you can specify RGB or RGBA values of a color using format @samp{@{xRRGGBB@}} or @samp{@{xRRGGBBAA@}} correspondingly. For example, @samp{@{xFF9966@}} give you +@ifhtml +@html +melone color. +@end html +@end ifhtml +@ifnothtml +melone color. +@end ifnothtml + @c ------------------------------------------------------------------ @external @node Line styles, Color scheme, Color styles, General concepts @@ -77,7 +87,7 @@ The line style is defined by the string which may contain specifications for col @html By default palette contain following colors: dark grayH’, blueb’, greeng’, redr’, cyanc’, magentam’, yellowy’, grayh’, green-bluel’, sky-bluen’, orangeq’, green-yellowe’, blue-violetu’, purplep’. -

Dashing style has the following meaning: space -- no line (usable for plotting only marks), ‘-’ -- solid line (■■■■■■■■■■■■■■■■), ‘|’ -- long dashed line (■■■■■■■■□□□□□□□□), ‘;’ -- dashed line (■■■■□□□□■■■■□□□□), ‘=’ -- small dashed line (■■□□■■□□■■□□■■□□), ‘:’ -- dotted line (■□□□■□□□■□□□■□□□), ‘j’ -- dash-dotted line (■■■■■■■□□□□■□□□□), ‘i’ -- small dash-dotted line (■■■□□■□□■■■□□■□□).

+

Dashing style has the following meaning: space – no line (usable for plotting only marks), ‘-’ – solid line (■■■■■■■■■■■■■■■■), ‘|’ – long dashed line (■■■■■■■■□□□□□□□□), ‘;’ – dashed line (■■■■□□□□■■■■□□□□), ‘=’ – small dashed line (■■□□■■□□■■□□■■□□), ‘:’ – dotted line (■□□□■□□□■□□□■□□□), ‘j’ – dash-dotted line (■■■■■■■□□□□■□□□□), ‘i’ – small dash-dotted line (■■■□□■□□■■■□□■□□).

@end html @end ifhtml @ifnothtml @@ -105,6 +115,8 @@ The final color is a linear interpolation of color array. The color array is con There are several useful combinations. String @samp{kw} corresponds to the simplest gray color scheme where higher values are brighter. String @samp{wk} presents the inverse gray color scheme where higher value is darker. Strings @samp{kRryw}, @samp{kGgw}, @samp{kBbcw} present the well-known @emph{hot}, @emph{summer} and @emph{winter} color schemes. Strings @samp{BbwrR} and @samp{bBkRr} allow to view bi-color figure on white or black background, where negative values are blue and positive values are red. String @samp{BbcyrR} gives a color scheme similar to the well-known @emph{jet} color scheme. +For more precise coloring, you can change default (equidistant) position of colors in color scheme. The format is @samp{@{CN,pos@}}, @samp{@{CN,pos@}} or @samp{@{xRRGGBB,pos@}}. The position value @var{pos} should be in range [0, 1]. Note, that alternative method for fine tuning of the color scheme is using the formula for coloring (see @ref{Curved coordinates}). + @pfig{schemes, Most popular color schemes.} When coloring by @emph{coordinate} (used in @ref{map}), the final color is determined by the position of the point in 3d space and is calculated from formula c=x*c[1] + y*c[2]. Here, c[1], c[2] are the first two elements of color array; x, y are normalized to axis range coordinates of the point. @@ -209,7 +221,7 @@ There is no difference between lower or upper case in formulas. If argument valu Command options allow the easy setup of the selected plot by changing global settings only for this plot. Each option start from symbol @samp{;}. Options work so that MathGL remember the current settings, change settings as it being set in the option, execute function and return the original settings back. So, the options are most usable for plotting functions. -The most useful options are @code{xrange, yrange, zrange}. They sets the boundaries for data change. This boundaries are used for automatically filled variables. So, these options allow one to change the position of some plots. For example, in command @code{Plot(y,"","xrange 0.1 0.9");} or @code{plot y; xrange 0.1 0.9} the x coordinate will be equidistantly distributed in range 0.1 ... 0.9. +The most useful options are @code{xrange, yrange, zrange}. They sets the boundaries for data change. This boundaries are used for automatically filled variables. So, these options allow one to change the position of some plots. For example, in command @code{Plot(y,"","xrange 0.1 0.9");} or @code{plot y; xrange 0.1 0.9} the x coordinate will be equidistantly distributed in range 0.1 ... 0.9. @sref{Using options} The full list of options are: @cindex alpha @@ -217,14 +229,14 @@ The full list of options are: @deffn {MGL option} alpha @code{val} Sets alpha value (transparency) of the plot. The value should be in range [0, 1]. See also @ref{alphadef}. @end deffn -@cindex ambient -@deffn {MGL option} ambient @code{val} -Sets brightness of ambient light for the plot. The value should be in range [0, 1]. See also @ref{ambient}. -@end deffn -@cindex diffuse -@deffn {MGL option} diffuse @code{val} -Sets brightness of diffuse light for the plot. The value should be in range [0, 1]. See also @ref{diffuse}. -@end deffn +@c @cindex ambient +@c @deffn {MGL option} ambient @code{val} +@c Sets brightness of ambient light for the plot. The value should be in range [0, 1]. See also @ref{ambient}. +@c @end deffn +@c @cindex diffuse +@c @deffn {MGL option} diffuse @code{val} +@c Sets brightness of diffuse light for the plot. The value should be in range [0, 1]. See also @ref{diffuse}. +@c @end deffn @cindex xrange @deffn {MGL option} xrange @code{val1 val2} @@ -285,7 +297,7 @@ Finally, a special command language MGL (see @ref{MGL scripts}) was written for * C++ interface:: @end menu -@external +@comment @external @node C interface, C++ interface, , Interfaces @subsection C/Fortran interface @@ -304,7 +316,7 @@ These variables contain identifiers for graphics drawing objects and for the dat Fortran functions/subroutines have the same names as C functions. However, there is a difference. Variable of type @code{HMGL, HMDT} must be an integer with sufficient size (@code{integer*4} in the 32-bit operating system or @code{integer*8} in the 64-bit operating system). All C functions are subroutines in Fortran, which are called by operator @code{call}. The exceptions are functions, which return variables of types @code{HMGL} or @code{HMDT}. These functions should be declared as integer in Fortran code. Also, one should keep in mind that strings in Fortran are denoted by @code{'} symbol, not the @code{"} symbol. -@external +@comment @external @node C++ interface, , C interface, Interfaces @subsection C++/Python interface diff --git a/texinfo/concept_ru.texi b/texinfo/concept_ru.texi index 9525114..e90eef9 100644 --- a/texinfo/concept_ru.texi +++ b/texinfo/concept_ru.texi @@ -52,7 +52,7 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. @ifhtml @html -

Символы цвета: ‘k’ -- черный, ‘r’ -- красный, ‘R’ -- темно красный, ‘g’ -- зеленый, ‘G’ -- темно зеленый, ‘b’ -- синий, ‘B’ -- темно синий, ‘c’ -- голубой, ‘C’ -- темно голубой, ‘m’ -- пурпурный, ‘M’ -- темно пурпурный, ‘y’ -- желтый, ‘Y’ -- темно желтый (золотой), ‘h’ -- серый, ‘H’ -- темно серый, ‘w’ -- белый, ‘W’ -- светло серый, ‘l’ -- сине-зеленый, ‘L’ -- темно сине-зеленый, ‘e’ -- желто-зеленый, ‘E’ -- темно желто-зеленый, ‘n’ -- небесно-синий, ‘N’ -- темно небесно-синий, ‘u’ -- сине-фиолетовый, ‘U’ -- темно сине-фиолетовый, ‘p’ -- фиолетовый, ‘P’ -- темно фиолетовый, ‘q’ -- оранжевый, ‘Q’ -- темно оранжевый (коричневый).

+

Символы цвета: ‘k’ – черный, ‘r’ – красный, ‘R’ – темно красный, ‘g’ – зеленый, ‘G’ – темно зеленый, ‘b’ – синий, ‘B’ – темно синий, ‘c’ – голубой, ‘C’ – темно голубой, ‘m’ – пурпурный, ‘M’ – темно пурпурный, ‘y’ – желтый, ‘Y’ – темно желтый (золотой), ‘h’ – серый, ‘H’ – темно серый, ‘w’ – белый, ‘W’ – светло серый, ‘l’ – сине-зеленый, ‘L’ – темно сине-зеленый, ‘e’ – желто-зеленый, ‘E’ – темно желто-зеленый, ‘n’ – небесно-синий, ‘N’ – темно небесно-синий, ‘u’ – сине-фиолетовый, ‘U’ – темно сине-фиолетовый, ‘p’ – фиолетовый, ‘P’ – темно фиолетовый, ‘q’ – оранжевый, ‘Q’ – темно оранжевый (коричневый).

@end html @end ifhtml @ifnothtml @@ -61,6 +61,16 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. В цветовой схеме можно использовать тональные (``подсвеченные'') цвета. Тональный цвет задается двумя символами в фигурных скобках @samp{@{cN@}: первый -- обычный цвет, второй -- его яркость цифрой. Цифра может быть в диапазоне @samp{1}...@samp{9}. При этом @samp{5} соответствует нормальному цвету, @samp{1} -- очень темная версия цвета (почти черный), @samp{9} -- очень светлая версия цвета (почти белый). Например, цвета могут быть @samp{@{b2@}} @samp{@{b7@}} @samp{@{r7@}} и т.д. +Наконец, можно указать явно RGB или RGBA значения цвета, используя формат @samp{@{xRRGGBB@}} или @samp{@{xRRGGBBAA@}} соответственно. Например, @samp{@{xFF9966@}} даст цвет +@ifhtml +@html +дыни. +@end html +@end ifhtml +@ifnothtml +дыни. +@end ifnothtml + @c ------------------------------------------------------------------ @external @node Line styles, Color scheme, Color styles, General concepts @@ -75,7 +85,7 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. @html По умолчанию палитры содержит следующие цвета: темно серыйH’, синийb’, зеленыйg’, красныйr’, голубойc’, пурпурныйm’, yellowy’, серыйh’, сине-зеленыйl’, небесно-синийn’, оранжевыйq’, желто-зеленыйe’, сине-фиолетовыйu’, фиолетовыйp’. -

Тип пунктира: пробел -- нет линии (для рисования только маркеров), ‘-’ -- сплошная линия (■■■■■■■■■■■■■■■■), ‘|’ -- длинный пунктир (■■■■■■■■□□□□□□□□), ‘;’ -- пунктир (■■■■□□□□■■■■□□□□), ‘=’ -- короткий пунктир (■■□□■■□□■■□□■■□□), ‘:’ -- точки (■□□□■□□□■□□□■□□□), ‘j’ -- пунктир с точками (■■■■■■■□□□□■□□□□), ‘i’ -- мелкий пунктир с точками (■■■□□■□□■■■□□■□□).

+

Тип пунктира: пробел – нет линии (для рисования только маркеров), ‘-’ – сплошная линия (■■■■■■■■■■■■■■■■), ‘|’ – длинный пунктир (■■■■■■■■□□□□□□□□), ‘;’ – пунктир (■■■■□□□□■■■■□□□□), ‘=’ – короткий пунктир (■■□□■■□□■■□□■■□□), ‘:’ – точки (■□□□■□□□■□□□■□□□), ‘j’ – пунктир с точками (■■■■■■■□□□□■□□□□), ‘i’ – мелкий пунктир с точками (■■■□□■□□■■■□□■□□).

@end html @end ifhtml @ifnothtml @@ -84,7 +94,7 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. Тип пунктира: пробел -- нет линии (для рисования только маркеров), @samp{-} -- сплошная линия (################), @samp{|} -- длинный пунктир (########________), @samp{;} -- пунктир (####____####____), @samp{=} -- короткий пунктир (##__##__##__##__), @samp{:} -- точки (#___#___#___#___), @samp{j} -- пунктир с точками (#######____#____), @samp{i} -- мелкий пунктир с точками (###__#__###__#__). @end ifnothtml -Типы маркеров: @samp{o} -- окружность, @samp{+} -- крест, @samp{x} -- косой крест, @samp{s} - квадрат, @samp{d} - ромб, @samp{.} -- точка, @samp{^} -- треугольник вверх, @samp{v} -- треугольник вниз, @samp{<} -- треугольник влево, @samp{>} -- треугольник вправо, @samp{#*} -- знак Y, @samp{#+} -- крест в квадрате, @samp{#x} -- косой крест в квадрате, @samp{#.} -- точка в окружности. Если в строке присутствует символ @samp{#}, то используются символы с заполнением. +Типы маркеров: @samp{o} -- окружность, @samp{+} -- крест, @samp{x} -- косой крест, @samp{s} -- квадрат, @samp{d} - ромб, @samp{.} -- точка, @samp{^} -- треугольник вверх, @samp{v} -- треугольник вниз, @samp{<} -- треугольник влево, @samp{>} -- треугольник вправо, @samp{#*} -- знак Y, @samp{#+} -- крест в квадрате, @samp{#x} -- косой крест в квадрате, @samp{#.} -- точка в окружности. Если в строке присутствует символ @samp{#}, то используются символы с заполнением. На конце и в начале линии можно выводить специальный символ (стрелку), если в строке указать один из символов: @samp{A} -- стрелка наружу, @samp{V} -- стрелка внутрь, @samp{I} -- поперечная черта, @samp{K} -- стрелка с чертой, @samp{T} -- треугольник, @samp{S} -- квадрат, @samp{D} -- ромб, @samp{O} -- круг, @samp{_} -- нет стрелки (по умолчанию). При этом действует следующее правило: первый символ определяет стрелку на конце линии, второй символ -- стрелку в начале линии. Например, @samp{r-A} -- красная сплошная линия со стрелкой на конце, @samp{b|AI} -- синий пунктир со стрелкой на конце и чертой вначале, @samp{_O} -- линия с текущим стилем и кружком вначале. Эти стили действуют и при построении графиков (например, @ref{1D plotting}). @@ -103,6 +113,8 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. Есть несколько полезных цветовых схем. Строка @samp{kw} дает обычную серую (черно-белую) схему, когда большие значения светлее. Строка @samp{wk} представляет обратную серую схему, когда большие значения темнее. Строки @samp{kRryw}, @samp{kGgw}, @samp{kBbcw} представляют собой хорошо известные схемы @emph{hot}, @emph{summer} и @emph{winter}. Строки @samp{BbwrR} и @samp{bBkRr} позволяют рисовать двухцветные фигуры на белом или черном фоне, когда отрицательные значения показаны синим цветом, а положительные -- красным. Строка @samp{BbcyrR} дает цветовую схему, близкую к хорошо известной схеме @emph{jet}. +Для более точно раскрашивания поверхностей можно изменить равномерное (по умолчанию) положение цветов в цветовой схеме. Формат следующий: @samp{@{CN,pos@}}, @samp{@{CN,pos@}} или @samp{@{xRRGGBB,pos@}}. Здесь значение @var{pos} положения цвета должно быть в диапазоне [0, 1]. Отмечу, что альтернативным механизмом тонкой настройки цветовой схемы может служить использование формул для цветовой координаты (см. @ref{Curved coordinates}). + @pfig{schemes, Most popular color schemes.} При определении цвета по @emph{положению точки в пространстве} (используется в @ref{map}) окончательный цвет определяется по формуле c=x*c[1] + y*c[2]. Здесь c[1], c[2] -- первые три цвета в цветовом массиве; x, y -- координаты точки, нормированные на @var{Min}x@var{Max}. @@ -207,7 +219,7 @@ MathGL имеет быстрый парсер текстовых формул Опции команд позволяют легко настроить вид отдельного графика не меняя глобальных настроек для все рисунка. Каждая опция отделяется от предыдущей символом @samp{;}. Опции работают так, что запоминают текущие настройки рисунка, применяют собственные настройки, выполняют команду и возвращают глобальные настройки обратно. Поэтому использование опций для команд обработки данных или настройки графика бесполезно. -Наиболее часто используемые опции -- @code{xrange, yrange, zrange}, устанавливают границы изменения осей координат (и тем самым автоматических массивов). Например, команда @code{Plot(y,"","xrange 0.1 0.9");} или @code{plot y; xrange 0.1 0.9} построит кривую с x-координатой равно распределенной в интервале 0.1 ... 0.9, а не вдоль текущей оси x. +Наиболее часто используемые опции -- @code{xrange, yrange, zrange}, устанавливают границы изменения осей координат (и тем самым автоматических массивов). Например, команда @code{Plot(y,"","xrange 0.1 0.9");} или @code{plot y; xrange 0.1 0.9} построит кривую с x-координатой равно распределенной в интервале 0.1 ... 0.9, а не вдоль текущей оси x. @sref{Using options} Полный список опций: @cindex alpha @@ -215,14 +227,14 @@ MathGL имеет быстрый парсер текстовых формул @deffn {Опция MGL} alpha @code{val} Задает величину прозрачности поверхности. Значение должно быть в диапазоне [0, 1]. См. также @ref{alphadef} @end deffn -@cindex ambient -@deffn {Опция MGL} ambient @code{val} -Задает яркость фонового освещения. Значение должно быть в диапазоне [0, 1]. См. также @ref{ambient} -@end deffn -@cindex diffuse -@deffn {Опция MGL} diffuse @code{val} -Задает яркость диффузного освещения для поверхности. Значение должно быть в диапазоне [0, 1]. См. также @ref{diffuse}. -@end deffn +@c @cindex ambient +@c @deffn {Опция MGL} ambient @code{val} +@c Задает яркость фонового освещения. Значение должно быть в диапазоне [0, 1]. См. также @ref{ambient} +@c @end deffn +@c @cindex diffuse +@c @deffn {Опция MGL} diffuse @code{val} +@c Задает яркость диффузного освещения для поверхности. Значение должно быть в диапазоне [0, 1]. См. также @ref{diffuse}. +@c @end deffn @cindex xrange @deffn {Опция MGL} xrange @code{val1 val2} @@ -285,7 +297,7 @@ Finally, a special command language MGL (see @ref{MGL scripts}) was written for * C++ interface:: @end menu -@external +@comment @external @node C interface, C++ interface, , Interfaces @subsection C/Fortran interface @@ -304,7 +316,7 @@ These variables contain identifiers for graphics drawing objects and for the dat Fortran functions/subroutines have the same names as C functions. However, there is a difference. Variable of type @code{HMGL, HMDT} must be an integer with sufficient size (@code{integer*4} in the 32-bit operating system or @code{integer*8} in the 64-bit operating system). All C functions are subroutines in Fortran, which are called by operator @code{call}. The exceptions are functions, which return variables of types @code{HMGL} or @code{HMDT}. These functions should be declared as integer in Fortran code. Also, one should keep in mind that strings in Fortran are denoted by @code{'} symbol, not the @code{"} symbol. -@external +@comment @external @node C++ interface, , C interface, Interfaces @subsection C++/Python interface diff --git a/texinfo/copyright.texi b/texinfo/copyright.texi new file mode 100644 index 0000000..f76c118 --- /dev/null +++ b/texinfo/copyright.texi @@ -0,0 +1,11 @@ +Copyright @copyright{} 2008-2012 Alexey A. Balakin. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover +Texts. A copy of the license is included in the section entitled ``GNU +Free Documentation License.'' +@end quotation + diff --git a/texinfo/core_en.texi b/texinfo/core_en.texi index a4e6c40..b050d36 100644 --- a/texinfo/core_en.texi +++ b/texinfo/core_en.texi @@ -3,7 +3,7 @@ @cindex mglGraph @ifset UDAV -This chapter contains a lot of plotting commands for 1D, 2D and 3D data. It also encapsulates parameters for axes drawing. Moreover an arbitrary coordinate transformation can be used for each axis. Additional information about colors, fonts, formula parsing can be found in @ref{General concepts}. +This chapter contains a lot of plotting commands for 1D, 2D and 3D data. It also encapsulates parameters for axes drawing. Moreover an arbitrary coordinate transformation can be used for each axis. Additional information about colors, fonts, formula parsing can be found in @ref{General concepts}. The full list of symbols used by MathGL for setting up plots can be found in @ref{Symbols for styles}. @end ifset @ifclear UDAV @@ -72,11 +72,6 @@ Functions and variables in this group influences on overall graphics appearance. @deftypefnx {C function} @code{void} mgl_set_def_param (@code{HMGL} gr) Restore initial values for all of parameters. @end deftypefn - -@deftypefn {Method on @code{mglGraph}} @code{void} SetPlotId (@code{const char *}id) -@deftypefnx {C function} @code{void} mgl_set_plotid (@code{HMGL} gr, @code{const char *}id) -Sets name of plot for saving filename (in FLTK window for example). -@end deftypefn @end ifclear @menu @@ -91,7 +86,7 @@ Sets name of plot for saving filename (in FLTK window for example). @end menu @c ================================================================== -@external +@comment @external @node Transparency, Lighting, , Graphics setup @subsection Transparency @cindex Alpha @@ -141,7 +136,7 @@ Lamp-like transparency (@samp{2}) -- below and upper things are commutable and a @end deftypefn @c ================================================================== -@external +@comment @external @node Lighting, Fog, Transparency, Graphics setup @subsection Lighting @ifclear UDAV @@ -184,8 +179,8 @@ The function adds a light source with identification @var{n} in direction @var{d @anchor{diffuse} @ifclear UDAV -@deftypefn {Метод класса @code{mglGraph}} @code{void} SetDifLight (@code{bool} enable) -@deftypefnx {Функция С} @code{void} mgl_set_light_dif (@code{HMGL} gr, @code{int} enable) +@deftypefn {Method on @code{mglGraph}} @code{void} SetDifLight (@code{bool} enable) +@deftypefnx {C function} @code{void} mgl_set_light_dif (@code{HMGL} gr, @code{int} enable) Set on/off to use diffusive light (only for local light sources). @end deftypefn @end ifclear @@ -193,14 +188,14 @@ Set on/off to use diffusive light (only for local light sources). @anchor{ambient} @deftypefn {MGL command} {} ambient @code{val} @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetAmbient (@code{mreal} bright=@code{0.5}) -@deftypefnx {Функция С} @code{void} mgl_set_ambbr (@code{HMGL} gr, @code{mreal} bright) +@deftypefnx {Method on @code{mglGraph}} @code{void} SetAmbient (@code{mreal} bright=@code{0.5}) +@deftypefnx {C function} @code{void} mgl_set_ambbr (@code{HMGL} gr, @code{mreal} bright) @end ifclear Sets the brightness of ambient light. The value should be in range [0,1]. @end deftypefn @c ================================================================== -@external +@comment @external @node Fog, Default sizes, Lighting, Graphics setup @subsection Fog @cindex Fog @@ -215,7 +210,7 @@ Function imitate a fog in the plot. Fog start from relative distance @var{dz} fr @end deftypefn @c ================================================================== -@external +@comment @external @node Default sizes, Cutting, Fog, Graphics setup @subsection Default sizes @ifclear UDAV @@ -269,8 +264,26 @@ Sets size of arrows for @ref{1D plotting}, lines and curves (see @ref{Primitives Sets approximate number of lines in @ref{mesh}, @ref{fall}, @ref{grid} and also the number of hachures in @ref{vect}, @ref{dew} and the number of cells in @ref{cloud}. By default (=0) it draws all lines/hachures/cells. @end deftypefn +@anchor{facenum} +@deftypefn {MGL command} {} facenum @code{val} +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} SetFaceNum (@code{int} val) +@deftypefnx {C function} @code{void} mgl_set_facenum (@code{HMGL} gr, @code{int} num) +@end ifclear +Sets approximate number of visible faces. Can be used for speeding up drawing by cost of lower quality. By default (=0) it draws all of them. +@end deftypefn + +@anchor{plotid} +@deftypefn {MGL command} {} plotid 'id' +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} SetPlotId (@code{const char *}id) +@deftypefnx {C function} @code{void} mgl_set_plotid (@code{HMGL} gr, @code{const char *}id) +@end ifclear +Sets default name @var{id} as filename for saving (in FLTK window for example). +@end deftypefn + @c ================================================================== -@external +@comment @external @node Cutting, Font settings, Default sizes, Graphics setup @subsection Cutting @ifclear UDAV @@ -308,7 +321,7 @@ Sets the cutting off condition by formula @var{cond}. This condition determine w @end deftypefn @c ================================================================== -@external +@comment @external @node Font settings, Palette and colors, Cutting, Graphics setup @subsection Font settings @ifclear UDAV @@ -339,6 +352,15 @@ Font style for text and labels (see text). Initial style is 'fnt'=':rC' give Rom Sets to use or not text rotation. @end deftypefn +@anchor{loadfont} +@deftypefn {MGL command} {} loadfont ['name'=''] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} LoadFont (@code{const char *}name, @code{const char *}path=@code{""}) +@deftypefnx {C function} @code{void} mgl_load_font (@code{HMGL} gr, @code{const char *}name, @code{const char *}path) +@end ifclear +Load font typeface from @var{path}/@var{name}. Empty name will load default font. +@end deftypefn + @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{void} SetFontDef (@code{const char *}fnt) @deftypefnx {C function} @code{void} mgl_set_font_def (@code{HMGL} gr, @code{const char *} val) @@ -375,10 +397,14 @@ Copy font data from another @code{mglGraph} object. Restore font data to default typeface. @end deftypefn +@deftypefn {Функция С} @code{void} mgl_def_font (@code{const char *}name, @code{const char *}path) +Load default font typeface (for all newly created HMGL/mglGraph objects) from @var{path}/@var{name}. +@end deftypefn + @end ifclear @c ================================================================== -@external +@comment @external @node Palette and colors, Error handling, Font settings, Graphics setup @subsection Palette and colors @ifclear UDAV @@ -407,7 +433,7 @@ Sets RGB values for color with given @var{id}. @end ifclear @c ================================================================== -@external +@comment @external @node Error handling, , Palette and colors, Graphics setup @subsection Error handling @ifclear UDAV @@ -480,7 +506,7 @@ These large set of variables and functions control how the axis and ticks will b @end menu @c ------------------------------------------------------------------ -@external +@comment @external @node Ranges (bounding box), Curved coordinates, , Axis settings @subsection Ranges (bounding box) @cindex CRange @@ -516,7 +542,7 @@ Sets the range for @samp{x}-,@samp{y}-,@samp{z}- coordinate or coloring (@samp{c @deftypefnx {MGL command} {} zrange dat [@code{add=off}] @deftypefnx {MGL command} {} crange dat [@code{add=off}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} SetRange (@code{char} dir, @code{const mglData &}dat, @code{bool} add=@code{false}) +@deftypefnx {Method on @code{mglGraph}} @code{void} SetRange (@code{char} dir, @code{const mglDataA &}dat, @code{bool} add=@code{false}) @deftypefnx {C function} @code{void} mgl_set_range_dat (@code{HMGL} gr, @code{char} dir, @code{const HCDT} a, @code{int} add) @end ifclear Sets the range for @samp{x}-,@samp{y}-,@samp{z}- coordinate or coloring (@samp{c}) as minimal and maximal values of data @var{dat}. Parameter @code{add=on} shows that the new range will be joined to existed one (not replace it). @@ -533,9 +559,9 @@ Sets the ranges of coordinates. If minimal and maximal values of the coordinate @end deftypefn @ifclear UDAV -@deftypefn {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglData &}xx, @code{const mglData &}yy) -@deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglData &}xx, @code{const mglData &}yy, @code{const mglData &}zz) -@deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglData &}xx, @code{const mglData &}yy, @code{const mglData &}zz, @code{const mglData &}cc) +@deftypefn {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy) +@deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) +@deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz, @code{const mglDataA &}cc) Sets the ranges of @samp{x}-,@samp{y}-,@samp{z}-coordinates and coloring as minimal and maximal values of data @var{xx}, @var{yy}, @var{zz}, @var{cc} correspondingly. @end deftypefn @end ifclear @@ -550,9 +576,18 @@ Sets the ranges of @samp{x}-,@samp{y}-,@samp{z}-coordinates and coloring as mini Sets center of axis cross section. If one of values is NAN then MathGL try to select optimal axis position. @end deftypefn +@anchor{zoomaxis} +@deftypefn {MGL command} {} zoomaxis @code{x1 x2 [y1=0 y2=1 [z1=0 z2=1 [c1=0 c2=1]]]} +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} ZoomAxis (@code{mglPoint} p1, @code{mglPoint} p2) +@deftypefnx {C function} @code{void} mgl_zoom_axis (@code{HMGL} gr, @code{mreal} x1, @code{mreal} x2, @code{mreal} y1, @code{mreal} y2, @code{mreal} z1, @code{mreal} z2, @code{mreal} c1, @code{mreal} c2) +@end ifclear +Additionally extend axis range for any settings made by @code{SetRange} or @code{SetRanges} functions according the formula @math{min += (max-min)*p1} and @math{max += (max-min)*p1} (or @math{min *= (max/min)^p1} and @math{max *= (max/min)^p1} for log-axis range when @math{inf>max/min>100} or @math{00 then label is printed at the maximum of axis. If @var{pos}<0 then label is printed at the minimum of axis. @xref{Text printing}. +Prints the label @var{text} for axis @var{dir}=@samp{x},@samp{y},@samp{z},@samp{t} (here @samp{t} is ``ternary'' axis @math{t=1-x-y}). The position of label is determined by @var{pos} parameter. If @var{pos}=0 then label is printed at the center of axis. If @var{pos}>0 then label is printed at the maximum of axis. If @var{pos}<0 then label is printed at the minimum of axis. Value option set additional shifting of the label. @xref{Text printing}. @end deftypefn @c ################################################################## @@ -1624,18 +1724,18 @@ colors for background (first one) and border (second one) of legend. Note, that @sref{Legend sample} @anchor{legend} -@deftypefn {MGL command} {} legend [@code{pos=3} 'fnt'='#' @code{size=-0.8 llen=0.1}] +@deftypefn {MGL command} {} legend [@code{pos=3} 'fnt'='#'] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Legend (@code{int} pos=@code{0x3}, @code{const char *}fnt=@code{"#"}, @code{mreal} size=@code{-0.8}, @code{mreal} llen=@code{0.1}) -@deftypefnx {C function} @code{void} mgl_legend (@code{HMGL} gr, @code{int} pos, @code{const char *}fnt, @code{mreal} size, @code{mreal} llen) +@deftypefnx {Method on @code{mglGraph}} @code{void} Legend (@code{int} pos=@code{0x3}, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_legend (@code{HMGL} gr, @code{int} pos, @code{const char *}fnt, @code{const char *}opt) @end ifclear -Draws legend of accumulated legend entries by font @var{fnt} with @var{size}. Parameter @var{pos} sets the position of the legend: @samp{0} is bottom left corner, @samp{1} is bottom right corner, @samp{2} is top left corner, @samp{3} is top right corner (is default). Parameter @var{fnt} can contain colors for face (1st one), for border (2nd one) and for text (last one). If less than 3 colors are specified then the color for border is black (for 2 and less colors), and the color for face is white (for 1 or none colors). If string @var{fnt} contain @samp{#} then border around the legend is drawn. +Draws legend of accumulated legend entries by font @var{fnt} with @var{size}. Parameter @var{pos} sets the position of the legend: @samp{0} is bottom left corner, @samp{1} is bottom right corner, @samp{2} is top left corner, @samp{3} is top right corner (is default). Parameter @var{fnt} can contain colors for face (1st one), for border (2nd one) and for text (last one). If less than 3 colors are specified then the color for border is black (for 2 and less colors), and the color for face is white (for 1 or none colors). If string @var{fnt} contain @samp{#} then border around the legend is drawn. If string @var{fnt} contain @samp{-} then legend entries will arranged horizontally. @end deftypefn -@deftypefn {MGL command} {} legend @code{x y} ['fnt'='#' @code{size=-1 llen=0.1}] +@deftypefn {MGL command} {} legend @code{x y} ['fnt'='#'] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Legend (@code{mreal} x, @code{mreal} y, @code{const char *}fnt=@code{"#"}, @code{mreal} size=@code{-0.8}, @code{mreal} llen=@code{0.1}) -@deftypefnx {C function} @code{void} mgl_legend_pos (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{const char *}fnt, @code{mreal} size, @code{mreal} llen) +@deftypefnx {Method on @code{mglGraph}} @code{void} Legend (@code{mreal} x, @code{mreal} y, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_legend_pos (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{const char *}fnt, @code{const char *}opt) @end ifclear Draws legend of accumulated legend entries by font @var{fnt} with @var{size}. Position of legend is determined by parameter @var{x}, @var{y} which supposed to be normalized to interval [0,1]. @end deftypefn @@ -1703,9 +1803,9 @@ String @var{pen} specifies the color and style of line and marks (see @ref{Line @deftypefnx {MGL command} {} plot xdat ydat ['stl'=''] @deftypefnx {MGL command} {} plot xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Plot (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Plot (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Plot (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Plot (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Plot (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Plot (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_plot (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_plot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_plot_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1716,7 +1816,7 @@ These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @ @anchor{radar} @deftypefn {MGL command} {} radar adat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Radar (@code{const mglData &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Radar (@code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_radar (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @end ifclear This functions draws radar chart which is continuous lines between points located on an radial lines (like plot in Polar coordinates). Parameter @var{value} in options @var{opt} set the additional shift of data (i.e. the data @var{a}+@var{value} is used instead of @var{a}). If @code{value<0} then @code{r=max(0, -min(value)}. If @var{pen} containt @samp{#} symbol then "grid" (radial lines and circle for @var{r}) is drawn. See also @ref{plot}. @sref{Radar sample} @@ -1727,9 +1827,9 @@ This functions draws radar chart which is continuous lines between points locate @deftypefnx {MGL command} {} step xdat ydat ['stl'=''] @deftypefnx {MGL command} {} step xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Step (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Step (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Step (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Step (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Step (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Step (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_step (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_step_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_step_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1742,9 +1842,9 @@ These functions draw continuous stairs for points to axis plane. See also @ref{p @deftypefnx {MGL command} {} tens xdat ydat cdat ['stl'=''] @deftypefnx {MGL command} {} tens xdat ydat zdat cdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Tens (@code{const mglData &}y, @code{const mglData &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tens (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tens (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tens (@code{const mglDataA &}y, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tens (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tens (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tens (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tens_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @@ -1757,9 +1857,9 @@ These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @ @deftypefnx {MGL command} {} tape xdat ydat ['stl'=''] @deftypefnx {MGL command} {} tape xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Tape (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tape (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tape (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tape (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tape (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tape (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tape (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tape_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tape_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1772,9 +1872,9 @@ These functions draw tapes of normals for curve between points @{@var{x}[i], @va @deftypefnx {MGL command} {} area xdat ydat ['stl'=''] @deftypefnx {MGL command} {} area xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Area (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Area (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Area (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Area (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Area (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Area (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_area (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_area_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_area_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1786,8 +1886,8 @@ These functions draw continuous lines between points and fills it to axis plane. @deftypefn {MGL command} {} region ydat1 ydat2 ['stl'=''] @deftypefnx {MGL command} {} region xdat ydat1 ydat2 ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Region (@code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Region (@code{const mglData &}x, @code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Region (@code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Region (@code{const mglDataA &}x, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_region (@code{HMGL} gr, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_region_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @end ifclear @@ -1799,9 +1899,9 @@ These functions fill area between 2 curves. Dimensions of arrays @var{y1} and @v @deftypefnx {MGL command} {} stem xdat ydat ['stl'=''] @deftypefnx {MGL command} {} stem xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Stem (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Stem (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Stem (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Stem (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Stem (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Stem (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_stem (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_stem_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_stem_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1814,9 +1914,9 @@ These functions draw vertical lines from points to axis plane. See also @ref{are @deftypefnx {MGL command} {} bars xdat ydat ['stl'=''] @deftypefnx {MGL command} {} bars xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Bars (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Bars (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Bars (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Bars (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Bars (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Bars (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_bars (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_bars_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_bars_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1828,8 +1928,8 @@ These functions draw vertical bars from points to axis plane. If string @var{pen @deftypefn {MGL command} {} barh vdat ['stl'=''] @deftypefnx {MGL command} {} barh ydat vdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Barh (@code{const mglData &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Barh (@code{const mglData &}y, @code{const mglData &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Barh (@code{const mglDataA &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Barh (@code{const mglDataA &}y, @code{const mglDataA &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_barh (@code{HMGL} gr, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_barh_xy (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt) @end ifclear @@ -1841,9 +1941,9 @@ These functions draw horizontal bars from points to axis plane. If string contai @deftypefnx {MGL command} {} cones xdat ydat ['stl'=''] @deftypefnx {MGL command} {} cones xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Cones (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Cones (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Cones (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cones (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cones (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cones (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cones (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cones_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cones_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1856,7 +1956,7 @@ These functions draw cones from points to axis plane. If string contain symbol @ @anchor{chart} @deftypefn {MGL command} {} chart adat ['col'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Chart (@code{const mglData &}a, @code{const char *}col=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Chart (@code{const mglDataA &}a, @code{const char *}col=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_chart (@code{HMGL} gr, @code{HCDT} a, @code{const char *}col, @code{const char *}opt) @end ifclear The function draws colored stripes (boxes) for data in array @var{a}. The number of stripes is equal to the number of rows in @var{a} (equal to @var{a.ny}). The color of each next stripe is cyclically changed from colors specified in string @var{col} or in palette Pal (see @ref{Palette and colors}). Spaces in colors denote transparent ``color'' (i.e. corresponding stripe(s) are not drawn). The stripe width is proportional to value of element in @var{a}. Chart is plotted only for data with non-negative elements. If string @var{col} have symbol @samp{#} then black border lines are drawn. The most nice form the chart have in 3d (after rotation of coordinates) or in cylindrical coordinates (becomes so called Pie chart). @sref{Chart sample} @@ -1866,8 +1966,8 @@ The function draws colored stripes (boxes) for data in array @var{a}. The number @deftypefn {MGL command} {} boxplot adat ['stl'=''] @deftypefnx {MGL command} {} boxplot xdat adat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} BoxPlot (@code{const mglData &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} BoxPlot (@code{const mglData &}x, @code{const mglData &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} BoxPlot (@code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} BoxPlot (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_boxplot (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_boxplot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @end ifclear @@ -1881,11 +1981,11 @@ These functions draw boxplot (also known as a box-and-whisker diagram) at points @deftypefnx {MGL command} {} candle vdat1 vdat2 ydat1 ydat2 ['stl'=''] @deftypefnx {MGL command} {} candle xdat vdat1 vdat2 ydat1 ydat2 ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglData &}v1, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglData &}v1, @code{const mglData &}v2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglData &}v1, @code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglData &}v1, @code{const mglData &}v2, @code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglData &}x, @code{const mglData &}v1, @code{const mglData &}v2, @code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const mglDataA &}v2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const mglDataA &}v2, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}x, @code{const mglDataA &}v1, @code{const mglDataA &}v2, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_candle (@code{HMGL} gr, @code{HCDT} v1, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_candle_yv (@code{HMGL} gr, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_candle_xyv (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @@ -1899,9 +1999,9 @@ These functions draw candlestick chart at points @var{x}[i]. This is a combinati @deftypefnx {MGL command} {} error xdat ydat yerr ['stl'=''] @deftypefnx {MGL command} {} error xdat ydat xerr yerr ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{const mglData &}y, @code{const mglData &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ex, @code{const mglData &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{const mglDataA &}y, @code{const mglDataA &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ex, @code{const mglDataA &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_error (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_error_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_error_exy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ex, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @@ -1914,9 +2014,9 @@ These functions draw error boxes @{@var{ex}[i], @var{ey}[i]@} at points @{@var{x @deftypefnx {MGL command} {} mark xdat ydat rdat ['stl'=''] @deftypefnx {MGL command} {} mark xdat ydat zdat rdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{const mglData &}y, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_mark_y (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_mark_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_mark_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @@ -1930,14 +2030,14 @@ These functions draw marks with size @var{r}[i]*@ref{marksize} at points @{@var{ @deftypefnx {MGL command} {} textmark xdat ydat rdat 'txt' ['stl'=''] @deftypefnx {MGL command} {} textmark xdat ydat zdat rdat 'txt' ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglData &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglData &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglData &}y, @code{const mglData &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglData &}y, @code{const mglData &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_textmark (@code{HMGL} gr, @code{HCDT} y, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textmarkw (@code{HMGL} gr, @code{HCDT} y, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textmark_yr (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @@ -1955,12 +2055,12 @@ These functions draw string @var{txt} as marks with size proportional to @var{r} @deftypefnx {MGL command} {} label xdat ydat 'txt' ['stl'=''] @deftypefnx {MGL command} {} label xdat ydat zdat 'txt' ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglData &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglData &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglData &}x, @code{const mglData &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_label (@code{HMGL} gr, @code{HCDT} y, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_labelw (@code{HMGL} gr, @code{HCDT} y, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_label_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @@ -1968,7 +2068,21 @@ These functions draw string @var{txt} as marks with size proportional to @var{r} @deftypefnx {C function} @code{void} mgl_label_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_labelw_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @end ifclear -These functions draw string @var{txt} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If string @var{txt} contain @samp{%x}, @samp{%y}, @samp{%z} or @samp{%n} then it will be replaced by the value of x-,y-,z-coordinate of the point or its index. See also @ref{plot}, @ref{mark}, @ref{textmark}. @sref{Label sample} +These functions draw string @var{txt} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If string @var{txt} contain @samp{%x}, @samp{%y}, @samp{%z} or @samp{%n} then it will be replaced by the value of x-,y-,z-coordinate of the point or its index. See also @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{Label sample} +@end deftypefn + +@anchor{table} +@deftypefn {MGL command} {} table vdat 'txt' ['stl'='#'] +@deftypefnx {MGL command} {} table x y vdat 'txt' ['stl'='#'] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{const mglDataA &}val, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{const mglDataA &}val, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{mreal} x, @code{mreal} y, @code{const mglDataA &}val, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{mreal} x, @code{mreal} y, @code{const mglDataA &}val, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_table (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) +@deftypefnx {C function} @code{void} mgl_tablew (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) +@end ifclear +These functions draw table with values of @var{val} and captions from string @var{txt} (separated by newline symbol @samp{\n}) at points @{@var{x}, @var{y}@} (default at @{0,0@}) related to current subplot. If string @var{fnt} contain @samp{#} then cell border will be drawn. If string @var{fnt} contain @samp{|} then table width is limited by subplot width (equivalent option @samp{value 1}). If string @var{fnt} contain @samp{=} then widths of all cells are the same. Option @code{value} set the width of the table (default is 1). See also @ref{plot}, @ref{label}. @sref{Table sample} @end deftypefn @anchor{tube} @@ -1979,12 +2093,12 @@ These functions draw string @var{txt} at points @{@var{x}[i], @var{y}[i], @var{z @deftypefnx {MGL command} {} tube xdat ydat zdat rdat ['stl'=''] @deftypefnx {MGL command} {} tube xdat ydat zdat @code{rval} ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglData &}y, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglData &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglData &}x, @code{const mglData &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tube_r (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tube (@code{HMGL} gr, @code{HCDT} y, @code{mreal} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tube_xyr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @@ -1998,10 +2112,10 @@ These functions draw the tube with variable radius @var{r}[i] along the curve be @anchor{torus} @deftypefn {MGL command} {} torus rdat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Torus (@code{const mglData &}r, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Torus (@code{const mglDataA &}r, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_torus (@code{HMGL} gr, @code{HCDT} r, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @end ifclear -These functions draw surface which is result of curve @{@var{r}, @var{z}@} rotation around axis. If string @var{pen} contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). See also @ref{plot}, @ref{axial}. @sref{Torus sample} +These functions draw surface which is result of curve @{@var{r}, @var{z}@} rotation around axis. If string @var{pen} contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). If string @var{pen} have symbol @samp{#} then wire plot is produced. If string @var{pen} have symbol @samp{.} then plot by dots is produced. See also @ref{plot}, @ref{axial}. @sref{Torus sample} @end deftypefn @c ################################################################## @@ -2028,20 +2142,20 @@ These functions perform plotting of 2D data. 2D means that data depend from 2 in @deftypefn {MGL command} {} surf zdat ['sch'=''] @deftypefnx {MGL command} {} surf xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. If string @var{sch} have symbol @samp{#} then grid lines are drawn. See also @ref{mesh}, @ref{dens}, @ref{belt}, @ref{tile}, @ref{boxs}, @ref{surfc}, @ref{surfa}. @sref{Surf sample} +The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{mesh}, @ref{dens}, @ref{belt}, @ref{tile}, @ref{boxs}, @ref{surfc}, @ref{surfa}. @sref{Surf sample} @end deftypefn @anchor{mesh} @deftypefn {MGL command} {} mesh zdat ['sch'=''] @deftypefnx {MGL command} {} mesh xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Mesh (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Mesh (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Mesh (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Mesh (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_mesh (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_mesh_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2052,8 +2166,8 @@ The function draws mesh lines for surface specified parametrically @{@var{x}[i,j @deftypefn {MGL command} {} fall zdat ['sch'=''] @deftypefnx {MGL command} {} fall xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Fall (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Fall (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Fall (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Fall (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_fall (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_fall_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2064,8 +2178,8 @@ The function draws fall lines for surface specified parametrically @{@var{x}[i,j @deftypefn {MGL command} {} belt zdat ['sch'=''] @deftypefnx {MGL command} {} belt xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Belt (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Belt (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Belt (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Belt (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_belt (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_belt_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2076,20 +2190,20 @@ The function draws belts for surface specified parametrically @{@var{x}[i,j], @v @deftypefn {MGL command} {} boxs zdat ['sch'=''] @deftypefnx {MGL command} {} boxs xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Boxs (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Boxs (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Boxs (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Boxs (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_boxs (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_boxs_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws vertical boxes for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. See also @ref{surf}, @ref{dens}, @ref{tile}, @ref{step}. @sref{Boxs sample} +The function draws vertical boxes for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Symbol @samp{@@} in @var{sch} set to draw filled boxes. See also @ref{surf}, @ref{dens}, @ref{tile}, @ref{step}. @sref{Boxs sample} @end deftypefn @anchor{tile} @deftypefn {MGL command} {} tile zdat ['sch'=''] @deftypefnx {MGL command} {} tile xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tile (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tile_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2100,20 +2214,20 @@ The function draws horizontal tiles for surface specified parametrically @{@var{ @deftypefn {MGL command} {} dens zdat ['sch'=''] @deftypefnx {MGL command} {} dens xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Dens (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Dens (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Dens (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Dens (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) @deftypefnx {C function} @code{void} mgl_dens (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws density plot for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} = @var{Min}.z. If string @var{sch} have symbol @samp{#} then grid lines are drawn. See also @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample} +The function draws density plot for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} = @var{Min}.z. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample} @end deftypefn @anchor{cont} @deftypefn {MGL command} {} cont vdat zdat ['sch'=''] @deftypefnx {MGL command} {} cont vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont__val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2123,8 +2237,8 @@ The function draws contour lines for surface specified parametrically @{@var{x}[ @deftypefn {MGL command} {} cont zdat ['sch'=''] @deftypefnx {MGL command} {} cont xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2135,8 +2249,8 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefn {MGL command} {} contf vdat zdat ['sch'=''] @deftypefnx {MGL command} {} contf vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2146,8 +2260,8 @@ The function draws solid (or filled) contour lines for surface specified paramet @deftypefn {MGL command} {} contf zdat ['sch'=''] @deftypefnx {MGL command} {} contf xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2158,8 +2272,8 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefn {MGL command} {} contd vdat zdat ['sch'=''] @deftypefnx {MGL command} {} contd vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contd_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contd_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2169,8 +2283,8 @@ The function draws solid (or filled) contour lines for surface specified paramet @deftypefn {MGL command} {} contd zdat ['sch'=''] @deftypefnx {MGL command} {} contd xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contd (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contd_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2181,19 +2295,19 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefn {MGL command} {} contv vdat zdat ['sch'=''] @deftypefnx {MGL command} {} contv vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contv_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contv_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws vertical cylinder at contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k] or at @var{z} = @var{Min}.z if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. See also @ref{cont}, @ref{contf}. @sref{ContV sample} +The function draws vertical cylinder (tube) at contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k] or at @var{z} = @var{Min}.z if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. See also @ref{cont}, @ref{contf}. @sref{ContV sample} @end deftypefn @deftypefn {MGL command} {} contv zdat ['sch'=''] @deftypefnx {MGL command} {} contv xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contv (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contv_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2204,19 +2318,19 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefn {MGL command} {} axial vdat zdat ['sch'=''] @deftypefnx {MGL command} {} axial vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_axial_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_axial_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws surface which is result of contour plot rotation for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If string @var{sch} have symbol @samp{#} then wire plot is produced. If string contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). See also @ref{cont}, @ref{contf}, @ref{torus}, @ref{surf3}. @sref{Axial sample} +The function draws surface which is result of contour plot rotation for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If string @var{sch} have symbol @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. If string contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). See also @ref{cont}, @ref{contf}, @ref{torus}, @ref{surf3}. @sref{Axial sample} @end deftypefn @deftypefn {MGL command} {} axial zdat ['sch'=''] @deftypefnx {MGL command} {} axial xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) @deftypefnx {C function} @code{void} mgl_axial (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_axial_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2227,8 +2341,8 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefn {MGL command} {} grid2 zdat ['sch'=''] @deftypefnx {MGL command} {} grid2 xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Grid (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Grid (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Grid (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Grid (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_grid (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_grid_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2254,19 +2368,19 @@ These functions perform plotting of 3D data. 3D means that data depend from 3 in @deftypefn {MGL command} {} surf3 adat @code{val} ['sch'=''] @deftypefnx {MGL command} {} surf3 xdat ydat zdat adat @code{val} ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. If string contain @samp{#} then wire plot is produced. Note, that there is possibility of incorrect plotting due to uncertainty of cross-section defining if there are two or more isosurface intersections inside one cell. See also @ref{cloud}, @ref{dens3}, @ref{surf3c}, @ref{surf3a}, @ref{axial}. @sref{Surf3 sample} +The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. If string contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. Note, that there is possibility of incorrect plotting due to uncertainty of cross-section defining if there are two or more isosurface intersections inside one cell. See also @ref{cloud}, @ref{dens3}, @ref{surf3c}, @ref{surf3a}, @ref{axial}. @sref{Surf3 sample} @end deftypefn @deftypefn {MGL command} {} surf3 adat ['sch'=''] @deftypefnx {MGL command} {} surf3 xdat ydat zdat adat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2277,20 +2391,20 @@ Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. @deftypefn {MGL command} {} cloud adat ['sch'=''] @deftypefnx {MGL command} {} cloud xdat ydat zdat adat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Cloud (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Cloud (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cloud (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cloud (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cloud (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cloud_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws cloud plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). This plot is a set of cubes with color and transparency proportional to value of @var{a}. The resulting plot is like cloud -- low value is transparent but higher ones are not. The number of plotting cells depend on @ref{meshnum}. If string @var{sch} contain symbol @samp{.} then lower quality plot will produced with much low memory usage. If string @var{sch} contain symbol @samp{!} then transparency will be inversed, i.e. higher become transparent and lower become not transparent. See also @ref{surf3}, @ref{meshnum}. @sref{Cloud sample} +The function draws cloud plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). This plot is a set of cubes with color and transparency proportional to value of @var{a}. The resulting plot is like cloud -- low value is transparent but higher ones are not. The number of plotting cells depend on @ref{meshnum}. If string @var{sch} contain symbol @samp{.} then lower quality plot will produced with much low memory usage. If string @var{sch} contain symbol @samp{i} then transparency will be inversed, i.e. higher become transparent and lower become not transparent. See also @ref{surf3}, @ref{meshnum}. @sref{Cloud sample} @end deftypefn @anchor{dens3} @deftypefn {MGL command} {} dens3 adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} dens3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Dens3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Dens3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Dens3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Dens3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dens3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dens3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2301,8 +2415,8 @@ The function draws density plot for 3d data specified parametrically @var{a}[i,j @deftypefn {MGL command} {} cont3 vdat adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} cont3 vdat xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2312,8 +2426,8 @@ The function draws contour plot for 3d data specified parametrically @var{a}[i,j @deftypefn {MGL command} {} cont3 adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} cont3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2324,8 +2438,8 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefn {MGL command} {} contf3 vdat adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} contf3 vdat xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2335,8 +2449,8 @@ The function draws solid (or filled) contour plot for 3d data specified parametr @deftypefn {MGL command} {} contf3 adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} contf3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2347,8 +2461,8 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefn {MGL command} {} grid3 adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} grid3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Grid3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Grid3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Grid3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Grid3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_grid3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_grid3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2358,8 +2472,8 @@ The function draws grid for 3d data specified parametrically @var{a}[i,j,k](@var @anchor{beam} @deftypefn {MGL command} {} beam tr g1 g2 adat @code{rval} ['sch'='' @code{flag=0 num=3}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Beam (@code{const mglData &}tr, @code{const mglData &}g1, @code{const mglData &}g2, @code{const mglData &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}, @code{int} num=@code{3}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Beam (@code{mreal} val, @code{const mglData &}tr, @code{const mglData &}g1, @code{const mglData &}g2, @code{const mglData &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Beam (@code{const mglDataA &}tr, @code{const mglDataA &}g1, @code{const mglDataA &}g2, @code{const mglDataA &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}, @code{int} num=@code{3}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Beam (@code{mreal} val, @code{const mglDataA &}tr, @code{const mglDataA &}g1, @code{const mglDataA &}g2, @code{const mglDataA &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}) @deftypefnx {C function} @code{void} mgl_beam (@code{HMGL} gr, @code{HCDT} tr, @code{HCDT} g1, @code{HCDT} g2, @code{HCDT} a, @code{mreal} r, @code{const char *}stl, @code{int} flag, @code{int} num) @deftypefnx {C function} @code{void} mgl_beam_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} tr, @code{HCDT} g1, @code{HCDT} g2, @code{HCDT} a, @code{mreal} r, @code{const char *}stl, @code{int} flag) @end ifclear @@ -2385,31 +2499,31 @@ These plotting functions draw @emph{two matrix} simultaneously. There are 5 gene @deftypefn {MGL command} {} surfc zdat cdat ['sch'=''] @deftypefnx {MGL command} {} surfc xdat ydat zdat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} SurfC (@code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} SurfC (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} SurfC (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} SurfC (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surfc (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surfc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfa}, @ref{surf3c}. @sref{SurfC sample} +The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfa}, @ref{surf3c}. @sref{SurfC sample} @end deftypefn @anchor{surf3c} @deftypefn {MGL command} {} surf3c adat cdat @code{val} ['sch'=''] @deftypefnx {MGL command} {} surf3c xdat ydat zdat adat cdat @code{val} ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3c_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3c_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3C sample} +The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3C sample} @end deftypefn @deftypefn {MGL command} {} surf3c adat cdat ['sch'=''] @deftypefnx {MGL command} {} surf3c xdat ydat zdat adat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3c (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3c_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2421,31 +2535,31 @@ Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. @deftypefn {MGL command} {} surfa zdat cdat ['sch'=''] @deftypefnx {MGL command} {} surfa xdat ydat zdat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} SurfA (@code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} SurfA (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} SurfA (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} SurfA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surfa (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and transparent it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfc}, @ref{surf3a}. @sref{SurfA sample} +The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and transparent it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfc}, @ref{surf3a}. @sref{SurfA sample} @end deftypefn @anchor{surf3a} @deftypefn {MGL command} {} surf3a adat cdat @code{val} ['sch'=''] @deftypefnx {MGL command} {} surf3a xdat ydat zdat adat cdat @code{val} ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3a_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3a_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample} +The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample} @end deftypefn @deftypefn {MGL command} {} surf3a adat cdat ['sch'=''] @deftypefnx {MGL command} {} surf3a xdat ydat zdat adat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3a (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3a_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2456,8 +2570,8 @@ Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. @deftypefn {MGL command} {} tiles zdat rdat ['sch'=''] @deftypefnx {MGL command} {} tiles xdat ydat zdat rdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tiles (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tiles_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2468,8 +2582,8 @@ The function draws horizontal tiles for surface specified parametrically @{@var{ @deftypefn {MGL command} {} map udat vdat ['sch'=''] @deftypefnx {MGL command} {} map xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Map (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Map (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Map (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Map (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_map (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_map_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2480,8 +2594,8 @@ The function draws mapping plot for matrices @{@var{ax}, @var{ay} @} which param @deftypefn {MGL command} {} stfa re im @code{dn} ['sch'=''] @deftypefnx {MGL command} {} stfa xdat ydat re im @code{dn} ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} STFA (@code{const mglData &}re, @code{const mglData &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} STFA (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}re, @code{const mglData &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} STFA (@code{const mglDataA &}re, @code{const mglDataA &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} STFA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}re, @code{const mglDataA &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_stfa (@code{HMGL} gr, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_stfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2506,8 +2620,8 @@ These functions perform plotting of 2D and 3D vector fields. There are 5 general @deftypefn {MGL command} {} traj xdat ydat udat vdat ['sch'=''] @deftypefnx {MGL command} {} traj xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Traj (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Traj (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Traj (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Traj (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_traj_xyz (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}z, @code{HCDT}ax, @code{HCDT}ay, @code{HCDT}az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_traj_xy (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}ax, @code{HCDT}ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2518,12 +2632,12 @@ The function draws vectors @{@var{ax}, @var{ay}, @var{az}@} along a curve @{@var @deftypefn {MGL command} {} vect udat vdat ['sch'=''] @deftypefnx {MGL command} {} vect xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_vect_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_vect_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws plane vector field plot for the field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z}=@var{Min}.z. The length and color of arrows are proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of arrows depend on @ref{meshnum}. The apperance of the hachures (arrows) can be changed by symbols: +The function draws plane vector field plot for the field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z}=@var{Min}.z. The length and color of arrows are proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of arrows depend on @ref{meshnum}. The appearance of the hachures (arrows) can be changed by symbols: @itemize @bullet @item @samp{f} for drawing arrows with fixed lengths, @@ -2540,20 +2654,43 @@ See also @ref{flow}, @ref{dew}. @sref{Vect sample} @deftypefn {MGL command} {} vect udat vdat wdat ['sch'=''] @deftypefnx {MGL command} {} vect xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_vect_3d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_vect_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @end ifclear This is 3D version of the first functions. Here arrays @var{ax}, @var{ay}, @var{az} must be 3-ranged tensors with equal sizes and the length and color of arrows is proportional to @math{\sqrt@{ax^2+ay^2+az^2@}}. @end deftypefn +@anchor{vect3} +@deftypefn {MGL command} {} vect3 udat vdat wdat ['sch'='' sval] +@deftypefnx {MGL command} {} vect3 xdat ydat zdat udat vdat wdat ['sch'='' sval] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Vect3 (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Vect3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_vect3 (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) +@deftypefnx {C function} @code{void} mgl_vect3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) +@end ifclear +The function draws 3D vector field plot for the field @{@var{ax}, @var{ay}, @var{az}@} depending parametrically on coordinates @var{x}, @var{y}, @var{z}. Vector field is drawn at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). The length and color of arrows are proportional to @math{\sqrt@{ax^2+ay^2+az^2@}}. The number of arrows depend on @ref{meshnum}. The appearance of the hachures (arrows) can be changed by symbols: +@itemize @bullet +@item +@samp{f} for drawing arrows with fixed lengths, +@item +@samp{>}, @samp{<} for drawing arrows to or from the cell point (default is centering), +@item +@samp{.} for drawing hachures with dots instead of arrows, +@item +@samp{=} for enabling color gradient along arrows. +@end itemize +See also @ref{vect}, @ref{flow}, @ref{dew}. @sref{Vect3 sample} +@end deftypefn + @anchor{dew} @deftypefn {MGL command} {} dew udat vdat ['sch'=''] @deftypefnx {MGL command} {} dew xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Dew (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Dew (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Dew (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Dew (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dew (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dew_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2564,8 +2701,8 @@ The function draws dew-drops for plane vector field @{@var{ax}, @var{ay}@} depen @deftypefn {MGL command} {} flow udat vdat ['sch'=''] @deftypefnx {MGL command} {} flow xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_flow_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flow_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2586,8 +2723,8 @@ See also @ref{pipe}, @ref{vect}, @ref{tape}, @ref{barwidth}. @sref{Flow sample} @deftypefn {MGL command} {} flow udat vdat wdat ['sch'=''] @deftypefnx {MGL command} {} flow xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_flow_3d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flow_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2597,8 +2734,8 @@ This is 3D version of the first functions. Here arrays @var{ax}, @var{ay}, @var{ @deftypefn {MGL command} {} flow @code{x0 y0} udat vdat ['sch'=''] @deftypefnx {MGL command} {} flow @code{x0 y0} xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_flowp_2d (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flowp_xy (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2608,8 +2745,8 @@ The same as first one (@ref{flow}) but draws single flow thread starting from po @deftypefn {MGL command} {} flow @code{x0 y0 z0} udat vdat wdat ['sch'=''] @deftypefnx {MGL command} {} flow @code{x0 y0 z0} xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_flowp_3d (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flowp_xyz (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2621,9 +2758,9 @@ This is 3D version of the previous functions. @deftypefnx {MGL command} {} grad xdat ydat pdat ['sch'=''] @deftypefnx {MGL command} {} grad xdat ydat zdat pdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Grad (@code{const mglData &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Grad (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Grad (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Grad (@code{const mglDataA &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Grad (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Grad (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_grad (@code{HMGL} gr, @code{HCDT} phi, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_grad_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} phi, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_grad_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} phi, @code{const char *}sch, @code{const char *}opt) @@ -2635,8 +2772,8 @@ The function draws gradient lines for scalar field @var{phi}[i,j] (or @var{phi}[ @deftypefn {MGL command} {} pipe udat vdat ['sch'='' @code{r0=0.05}] @deftypefnx {MGL command} {} pipe xdat ydat udat vdat ['sch'='' @code{r0=0.05}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_pipe_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_pipe_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @end ifclear @@ -2646,8 +2783,8 @@ The function draws flow pipes for the plane vector field @{@var{ax}, @var{ay}@} @deftypefn {MGL command} {} pipe udat vdat wdat ['sch'='' @code{r0=0.05}] @deftypefnx {MGL command} {} pipe xdat ydat zdat udat vdat wdat ['sch'='' @code{r0=0.05}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_pipe_3d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_pipe_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @end ifclear @@ -2677,9 +2814,9 @@ These functions perform miscellaneous plotting. There is unstructured data point @deftypefnx {MGL command} {} densy dat ['sch'='' @code{sval=nan}] @deftypefnx {MGL command} {} densz dat ['sch'='' @code{sval=nan}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} DensX (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} DensY (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} DensZ (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} DensX (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} DensY (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} DensZ (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dens_x (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dens_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dens_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2692,9 +2829,9 @@ These plotting functions draw density plot in x, y, or z plain. If @var{a} is a @deftypefnx {MGL command} {} conty dat ['sch'='' @code{sval=nan}] @deftypefnx {MGL command} {} contz dat ['sch'='' @code{sval=nan}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} ContX (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContY (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContZ (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContX (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContY (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContZ (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont_x (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2703,9 +2840,9 @@ These plotting functions draw contour lines in x, y, or z plain. If @var{a} is a @end deftypefn @ifclear UDAV -@deftypefn {Method on @code{mglGraph}} @code{void} ContX (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContY (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContZ (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefn {Method on @code{mglGraph}} @code{void} ContX (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContY (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContZ (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont_x_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_y_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_z_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2718,9 +2855,9 @@ The same as previous with manual contour levels. @deftypefnx {MGL command} {} contfy dat ['sch'='' @code{sval=nan}] @deftypefnx {MGL command} {} contfz dat ['sch'='' @code{sval=nan}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} ContFX (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContFY (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContFZ (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContFX (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContFY (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContFZ (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf_x (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2729,9 +2866,9 @@ These plotting functions draw solid contours in x, y, or z plain. If @var{a} is @end deftypefn @ifclear UDAV -@deftypefn {Method on @code{mglGraph}} @code{void} ContFX (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContFY (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} ContFZ (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefn {Method on @code{mglGraph}} @code{void} ContFX (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContFY (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} ContFZ (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf_x_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_y_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_z_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2778,9 +2915,9 @@ Draws command parametrical surface @{@samp{x(u,v)}, @samp{y(u,v)}, @samp{z(u,v)} @deftypefnx {MGL command} {} triplot idat xdat ydat zdat ['sch'=''] @deftypefnx {MGL command} {} triplot idat xdat ydat zdat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} TriPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TriPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TriPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TriPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TriPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TriPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_triplot_xy (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_triplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_triplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @@ -2793,10 +2930,10 @@ The function draws the surface of triangles. Triangle vertexes are set by indexe @deftypefnx {MGL command} {} tricont vdat idat xdat ydat zdat ['sch'=''] @deftypefnx {MGL command} {} tricont idat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} TriCont (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TriCont (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TriContV (@code{const mglData &}v, @code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} TriContV (@code{const mglData &}v, @code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TriCont (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TriCont (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TriContV (@code{const mglDataA &}v, @code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} TriContV (@code{const mglDataA &}v, @code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tricont_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tricont_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tricont_xyzcv (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @@ -2810,9 +2947,9 @@ The function draws contour lines for surface of triangles at @var{z}=@var{v}[k] @deftypefnx {MGL command} {} quadplot idat xdat ydat zdat ['sch'=''] @deftypefnx {MGL command} {} quadplot idat xdat ydat zdat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} QuadPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} QuadPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} QuadPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} QuadPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} QuadPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} QuadPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_quadplot_xy (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_quadplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_quadplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @@ -2824,8 +2961,8 @@ The function draws the surface of quadrangles. Quadrangles vertexes are set by i @deftypefn {MGL command} {} dots xdat ydat zdat ['sch'=''] @deftypefnx {MGL command} {} dots xdat ydat zdat adat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Dots (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Dots (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Dots (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Dots (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dots (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dots_a (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2835,7 +2972,7 @@ The function draws the arbitrary placed points @{@var{x}[i], @var{y}[i], @var{z} @anchor{crust} @deftypefn {MGL command} {} crust xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Crust (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Crust (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_crust (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function reconstruct and draws the surface for arbitrary placed points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. See also @ref{dots}, @ref{triplot}. @c @sref{Crust sample} @@ -2862,14 +2999,14 @@ Functions Fit() and FitS() do not draw the obtained data themselves. They fill t @deftypefnx {MGL command} {} fits res xdat ydat adat sdat 'func' 'var' [ini=0] @deftypefnx {MGL command} {} fits res xdat ydat zdat adat sdat 'func' 'var' [ini=0] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_fit_ys (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xys (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xyzs (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @@ -2884,14 +3021,14 @@ Fit data along x-, y- and z-directions for array specified parametrically @var{a @deftypefnx {MGL command} {} fit res xdat ydat adat sdat 'func' 'var' [ini=0] @deftypefnx {MGL command} {} fit res xdat ydat zdat adat sdat 'func' 'var' [ini=0] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_fit_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @@ -2902,10 +3039,10 @@ Fit data along x-, y- and z-directions for array specified parametrically @var{a @ifclear UDAV -@deftypefn {Method on @code{mglGraph}} @code{mglData} Fit2 (@code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit2 (@code{mglData &}fit, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefn {Method on @code{mglGraph}} @code{mglData} Fit2 (@code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit2 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_fit_2 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) Fit data along all directions for 2d or 3d arrays @var{a} with @var{s}=1 and @var{x}, @var{y}, @var{z} equidistantly distributed in interval [@var{Min}, @var{Max}]. @@ -2941,9 +3078,9 @@ Get last fitted formula with found coefficients (as numbers). @deftypefnx {MGL command} {} hist @sc{res} xdat ydat adat @deftypefnx {MGL command} {} hist @sc{res} xdat ydat zdat adat @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Hist (@code{const mglData &}x, @code{const mglData &}a, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Hist (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{mglData} Hist (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Hist (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Hist (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} Hist (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_hist_x (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_hist_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} a, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_hist_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}opt) @@ -2957,8 +3094,8 @@ These functions make distribution (histogram) of data. They do not draw the obta @deftypefnx {MGL command} {} fill dat 'eq' vdat wdat @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglData &}v, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglData &}v, @code{const mglData &}w, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglDataA &}v, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglDataA &}v, @code{const mglDataA &}w, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_data_fill_eq (@code{HMGL} gr, @code{HMDT} u, @code{const char *}eq, @code{HCDT}v, @code{HCDT}w, @code{const char *}opt) @end ifclear Fills the value of array @samp{u} according to the formula in string @var{eq}. Formula is an arbitrary expression depending on variables @samp{x}, @samp{y}, @samp{z}, @samp{u}, @samp{v}, @samp{w}. Coordinates @samp{x}, @samp{y}, @samp{z} are supposed to be normalized in axis range. Variable @samp{u} is the original value of the array. Variables @samp{v} and @samp{w} are values of arrays @var{v}, @var{w} which can be @code{NULL} (i.e. can be omitted). @@ -2966,7 +3103,7 @@ Fills the value of array @samp{u} according to the formula in string @var{eq}. F @deftypefn {MGL command} {} datagrid dat xdat ydat zdat @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} DataGrid (@code{mglData &}u, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} DataGrid (@code{mglData &}u, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_data_grid (@code{HMGL} gr, @code{HMDT} u, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}opt) @end ifclear Fills the value of array @samp{u} according to the linear interpolation of triangulated surface, found for arbitrary placed points @samp{x}, @samp{y}, @samp{z}. Interpolation is done at points equidistantly distributed in axis range. NAN value is used for grid points placed outside of triangulated surface. @@ -2976,7 +3113,7 @@ Fills the value of array @samp{u} according to the linear interpolation of trian @deftypefn {MGL command} {} pde @sc{res} 'ham' ini_re ini_im [@code{dz=0.1 k0=100}] @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{mglData} PDE (@code{const char *}ham, @code{const mglData &}ini_re, @code{const mglData &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{mglData} PDE (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_pde_solve (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt) @end ifclear Solves equation du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators. Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Coordinates @samp{x}, @samp{y}, @samp{z} are supposed to be normalized in axis range. Note, that really this ranges are increased by factor 3/2 for purpose of reducing reflection from boundaries. Parameter @var{dz} set the step along evolutionary coordinate z. At this moment, simplified form of function @var{ham} is supported -- all ``mixed'' terms (like @samp{x*p}->x*d/dx) are excluded. For example, in 2D case this function is effectively @math{ham = f(p,z) + g(x,z,u)}. However commutable combinations (like @samp{x*q}->x*d/dy) are allowed. Here variable @samp{u} is used for field amplitude |u|. This allow one solve nonlinear problems -- for example, for nonlinear Shrodinger equation you may set @code{ham="p^2 + q^2 - u^2"}. You may specify imaginary part for wave absorption, like @code{ham = "p^2 + i*x*(x>0)"}, but only if dependence on variable @samp{i} is linear (i.e. @math{ham = hre+i*him}). @sref{PDE solving hints} diff --git a/texinfo/core_ru.texi b/texinfo/core_ru.texi index 9e7ee0a..e74a51d 100644 --- a/texinfo/core_ru.texi +++ b/texinfo/core_ru.texi @@ -72,11 +72,6 @@ MGL не требует создания данного типа объекто @deftypefnx {Функция С} @code{void} mgl_set_def_param (@code{HMGL} gr) Устанавливает все настройки по умолчанию. @end deftypefn - -@deftypefn {Метод класса @code{mglGraph}} @code{void} SetPlotId (@code{const char *}id) -@deftypefnx {Функция С} @code{void} mgl_set_plotid (@code{HMGL} gr, @code{const char *}id) -Задает имя графика для сохранения в файл (например, в окне FLTK). -@end deftypefn @end ifclear @menu @@ -91,7 +86,7 @@ MGL не требует создания данного типа объекто @end menu @c ================================================================== -@external +@comment @external @node Transparency, Lighting, , Graphics setup @subsection Прозрачность @cindex Alpha @@ -132,7 +127,7 @@ MGL не требует создания данного типа объекто @end deftypefn @c ================================================================== -@external +@comment @external @node Lighting, Fog, Transparency, Graphics setup @subsection Освещение @ifclear UDAV @@ -191,7 +186,7 @@ MGL не требует создания данного типа объекто @end deftypefn @c ================================================================== -@external +@comment @external @node Fog, Default sizes, Lighting, Graphics setup @subsection Туман @cindex Fog @@ -206,7 +201,7 @@ MGL не требует создания данного типа объекто @end deftypefn @c ================================================================== -@external +@comment @external @node Default sizes, Cutting, Fog, Graphics setup @subsection Базовые размеры @ifclear UDAV @@ -260,8 +255,26 @@ MGL не требует создания данного типа объекто Задает ориентировочное число линий в @ref{mesh}, @ref{fall}, @ref{grid} и число стрелок (штрихов) в @ref{vect}, @ref{dew} и число ячеек в @ref{cloud}. По умолчанию (=0) рисуются все линии, стрелки, ячейки. @end deftypefn +@anchor{facenum} +@deftypefn {Команда MGL} {} facenum @code{val} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetFaceNum (@code{int} val) +@deftypefnx {Функция С} @code{void} mgl_set_facenum (@code{HMGL} gr, @code{int} num) +@end ifclear +Задает ориентировочное число видимых граней. Может быть использована для ускорения рисования за счет более грубого рисунка. По умолчанию (=0) рисуются все грани. +@end deftypefn + +@anchor{plotid} +@deftypefn {Команда MGL} {} plotid 'id' +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetPlotId (@code{const char *}id) +@deftypefnx {Функция С} @code{void} mgl_set_plotid (@code{HMGL} gr, @code{const char *}id) +@end ifclear +Задает имя графика для сохранения в файл (например, в окне FLTK). +@end deftypefn + @c ================================================================== -@external +@comment @external @node Cutting, Font settings, Default sizes, Graphics setup @subsection Обрезание @ifclear UDAV @@ -299,7 +312,7 @@ MGL не требует создания данного типа объекто @end deftypefn @c ================================================================== -@external +@comment @external @node Font settings, Palette and colors, Cutting, Graphics setup @subsection Шрифты @ifclear UDAV @@ -330,6 +343,15 @@ MGL не требует создания данного типа объекто Включает/выключает вращение меток и подписей осей координат вдоль оси. @end deftypefn +@anchor{loadfont} +@deftypefn {MGL command} {} loadfont ['name'=''] +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} LoadFont (@code{const char *}name, @code{const char *}path=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_load_font (@code{HMGL} gr, @code{const char *}name, @code{const char *}path) +@end ifclear +Загружает начертание шрифта из файла @var{path}/@var{name}. Пустая строка загрузит шрифт по умолчанию. +@end deftypefn + @ifclear UDAV @deftypefn {Метод класса @code{mglGraph}} @code{void} SetFontDef (@code{const char *}fnt) @deftypefnx {Функция С} @code{void} mgl_set_font_def (@code{HMGL} gr, @code{const char *} val) @@ -351,11 +373,6 @@ MGL не требует создания данного типа объекто Задает размер шрифта в дюймах для заданного DPI (по умолчанию 0.22 in = 16 pt). @end deftypefn -@deftypefn {Метод класса @code{mglGraph}} @code{void} LoadFont (@code{const char *}name, @code{const char *}path=@code{""}) -@deftypefnx {Функция С} @code{void} mgl_load_font (@code{HMGL} gr, @code{const char *}name, @code{const char *}path) -Загружает начертание шрифта из файла @var{path}/@var{name}. -@end deftypefn - @deftypefn {Метод класса @code{mglGraph}} @code{void} CopyFont (@code{mglGraph *} from) @deftypefnx {Функция С} @code{void} mgl_copy_font (@code{HMGL} gr, @code{HMGL} gr_from) Копирует начертание шрифта из другого объекта @code{mglGraph}. @@ -366,10 +383,14 @@ MGL не требует создания данного типа объекто Восстанавливает начертание шрифта по умолчанию. @end deftypefn +@deftypefn {Функция С} @code{void} mgl_def_font (@code{const char *}name, @code{const char *}path) +Загружает начертание шрифта по умолчанию (для всех вновь создаваемых HMGL/mglGraph объектов) из файла @var{path}/@var{name}. +@end deftypefn + @end ifclear @c ================================================================== -@external +@comment @external @node Palette and colors, Error handling, Font settings, Graphics setup @subsection Палитра и цвета @ifclear UDAV @@ -387,18 +408,18 @@ MGL не требует создания данного типа объекто @end deftypefn @ifclear UDAV -@deftypefn {Method on @code{mglGraph}} @code{void} SetDefScheme (@code{const char *}sch) -@deftypefnx {C function} @code{void} mgl_set_def_sch (@code{HMGL} gr, @code{const char *}sch) +@deftypefn {Метод класса @code{mglGraph}} @code{void} SetDefScheme (@code{const char *}sch) +@deftypefnx {Функция С} @code{void} mgl_set_def_sch (@code{HMGL} gr, @code{const char *}sch) Устанавливает @var{sch} в качестве цветовой схемы по умолчанию. Начальное значение @code{"BbcyrR"}. @end deftypefn -@deftypefn {C function} @code{void} mgl_set_color (@code{char} id, @code{mreal} r, @code{mreal} g, @code{mreal} b) +@deftypefn {Функция С} @code{void} mgl_set_color (@code{char} id, @code{mreal} r, @code{mreal} g, @code{mreal} b) Задает RGB значения для цвета с заданным @var{id}. @end deftypefn @end ifclear @c ================================================================== -@external +@comment @external @node Error handling, , Palette and colors, Graphics setup @subsection Обработка ошибок @ifclear UDAV @@ -471,7 +492,7 @@ Setsize: размер(ы) равны нулю или отрицательны @end menu @c ------------------------------------------------------------------ -@external +@comment @external @node Ranges (bounding box), Curved coordinates, , Axis settings @subsection Масштаб осей координат @cindex CRange @@ -506,7 +527,7 @@ Setsize: размер(ы) равны нулю или отрицательны @deftypefnx {Команда MGL} {} zrange dat [@code{add=off}] @deftypefnx {Команда MGL} {} crange dat [@code{add=off}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetRange (@code{char} dir, @code{const mglData &}dat, @code{bool} add=@code{false}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetRange (@code{char} dir, @code{const mglDataA &}dat, @code{bool} add=@code{false}) @deftypefnx {Функция С} @code{void} mgl_set_range_dat (@code{HMGL} gr, @code{char} dir, @code{const HCDT} a, @code{int} add) @end ifclear Задает диапазон изменения @samp{x}-,@samp{y}-,@samp{z}-,@samp{c}-координат как минимальное и максимальное значение массива @var{dat}. Параметр @code{add=on} указывает добавлять новый диапазон к существующему (не заменять его). @@ -523,9 +544,9 @@ Setsize: размер(ы) равны нулю или отрицательны @end deftypefn @ifclear UDAV -@deftypefn {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglData &}xx, @code{const mglData &}yy) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglData &}xx, @code{const mglData &}yy, @code{const mglData &}zz) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglData &}xx, @code{const mglData &}yy, @code{const mglData &}zz, @code{const mglData &}cc) +@deftypefn {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz, @code{const mglDataA &}cc) Задает диапазон изменения @samp{x}-,@samp{y}-,@samp{z}-,@samp{c}-координат как минимальное и максимальное значение массивов @var{xx}, @var{yy}, @var{zz}, @var{cc} соответственно. @end deftypefn @end ifclear @@ -540,9 +561,18 @@ Setsize: размер(ы) равны нулю или отрицательны Задает центр пересечения осей координат. Если одно из значений равно NAN, то MathGL попытается выбрать оптимальное положение осей координат по этому направлению. @end deftypefn +@anchor{zoomaxis} +@deftypefn {Команда MGL} {} zoomaxis @code{x1 x2 [y1=0 y2=1 [z1=0 z2=1 [c1=0 c2=1]]]} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ZoomAxis (@code{mglPoint} p1, @code{mglPoint} p2) +@deftypefnx {Функция С} @code{void} mgl_zoom_axis (@code{HMGL} gr, @code{mreal} x1, @code{mreal} x2, @code{mreal} y1, @code{mreal} y2, @code{mreal} z1, @code{mreal} z2, @code{mreal} c1, @code{mreal} c2) +@end ifclear +Дополнительно расширяет диапазон осей координат, задаваемый функциями @code{SetRange} или @code{SetRanges}, в соответствии с формулами @math{min += (max-min)*p1} и @math{max += (max-min)*p1} (или @math{min *= (max/min)^p1} и @math{max *= (max/min)^p1} для "логарифмических" диапазонов, когда @math{inf>max/min>100} или @math{0} -- с правого края, @samp{A} или @samp{^} -- с верхнего края, @samp{U} или @samp{_} -- с нижнего края. Ячейка может быть дополнительно сдвинута относительно своего обычного положения на относительный размер @var{dx}, @var{dy}. +Помещает последующий вывод в @var{m}-ую ячейку сетки размером @var{nx}*@var{ny} от всего рисунка. Функция сбрасывает матрицу трансформации (повороты и сжатие графика) и должна вызываться первой для создания "подграфика". С эстетической точки зрения не рекомендуется вызывать эту функцию с различными (или не кратными) размерами сетки. Место для осей/colorbar резервируется только если строка @var{stl} содержит: @samp{L} или @samp{<} -- с левого края, @samp{R} или @samp{>} -- с правого края, @samp{A} или @samp{^} -- с верхнего края, @samp{U} или @samp{_} -- с нижнего края. Если строка @var{stl} содержит @samp{#}, то оси координат будут занимать все доступное пространство (место резервироваться не будет). Ячейка может быть дополнительно сдвинута относительно своего обычного положения на относительный размер @var{dx}, @var{dy}. @end deftypefn @anchor{multiplot} @@ -852,19 +889,28 @@ Setsize: размер(ы) равны нулю или отрицательны Задает масштаб картинки. Не рекомендуется устанавливать значения меньше 1.5. Это аналог функции Zoom(), но применяется только к конкретному подграфику. Используйте ноль для включения автоматического масштабирования. @end deftypefn -Также есть 2 функции, которые управляют масштабированием @code{Zoom()} и вращением @code{View()} всего рисунка. Т.е. они действуют как ещё одна матрица трансформации. Они были введены для вращения/приближения графика с помощью мыши. +@end ifclear + -@deftypefn {Метод класса @code{mglGraph}} @code{void} View (@code{mreal} TetX, @code{mreal} TetZ, @code{mreal} TetY=@code{0}) +Также есть 2 функции, которые управляют масштабированием @code{Zoom()} и вращением @code{View()} всего рисунка. Т.е. они действуют как ещё одна матрица трансформации. Они были введены для вращения/приближения графика с помощью мыши. Не рекомендуется вызывать их при рисовании графика. + +@anchor{view} +@deftypefn {Команда MGL} {} view @code{tetx tetz [tety=0]} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} View (@code{mreal} TetX, @code{mreal} TetZ, @code{mreal} TetY=@code{0}) @deftypefnx {Функция С} @code{void} mgl_view (@code{HMGL} gr, @code{mreal} TetX, @code{mreal} TetZ, @code{mreal} TetY) -Вращает систему координат относительно осей @{x, z, y@} последовательно на углы @var{TetX}, @var{TetZ}, @var{TetY}. Вращение происходит независимо от @ref{rotate}. Используйте @code{Zoom(0,0,1,1)} для возвращения к виду по умолчанию. +@end ifclear +Вращает систему координат относительно осей @{x, z, y@} последовательно на углы @var{TetX}, @var{TetZ}, @var{TetY}. Вращение происходит независимо от @ref{rotate}. Внимание! эти настройки не могут быть переписаны функцией @code{DefaultPlotParam()}. Используйте @code{Zoom(0,0,1,1)} для возвращения к виду по умолчанию. @end deftypefn -@deftypefn {Метод класса @code{mglGraph}} @code{void} Zoom (@code{mreal} x1, @code{mreal} y1, @code{mreal} x2, @code{mreal} y2) +@anchor{zoom} +@deftypefn {Команда MGL} {} zoom @code{x1 y1 x2 y2} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Zoom (@code{mreal} x1, @code{mreal} y1, @code{mreal} x2, @code{mreal} y2) @deftypefnx {Функция С} @code{void} mgl_set_zoom (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} x2, @code{mreal} y2) -Масштабирует весь рисунок. После вызова функции текущий график будет очищен и в дальнейшем рисунок будет содержать только область [x1,x2]*[y1,y2] от исходного рисунка. Координаты @var{x1}, @var{x2}, @var{y1}, @var{y2} меняются в диапазоне от 0 до 1. Внимание! эти настройки не могут быть переписаны никакими другими функциями. Используйте @code{Zoom(0,0,1,1)} для возвращения к виду по умолчанию. -@end deftypefn - @end ifclear +Масштабирует весь рисунок. После вызова функции текущий график будет очищен и в дальнейшем рисунок будет содержать только область [x1,x2]*[y1,y2] от исходного рисунка. Координаты @var{x1}, @var{x2}, @var{y1}, @var{y2} меняются в диапазоне от 0 до 1. Внимание! эти настройки не могут быть переписаны никакими другими функциями, включая @code{DefaultPlotParam()}. Используйте @code{Zoom(0,0,1,1)} для возвращения к виду по умолчанию. +@end deftypefn @c ################################################################## @external @@ -884,12 +930,12 @@ Setsize: размер(ы) равны нулю или отрицательны @end deftypefn @anchor{quality} -@deftypefn {Команда MGL} {} quality @code{val} +@deftypefn {Команда MGL} {} quality [@code{val}=2] @ifclear UDAV @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetQuality (@code{int} val=@code{MGL_DRAW_NORM}) @deftypefnx {Функция С} @code{void} mgl_set_quality (@code{HMGL} gr, @code{int} val) @end ifclear -Задает качество графика в зависимости от значения @var{val}: @code{MGL_DRAW_WIRE=0} -- нет рисования граней (наиболее быстрый), @code{MGL_DRAW_FAST=1} -- нет интерполяции цвета (быстрый), @code{MGL_DRAW_NORM=2} -- высокое качество (нормальный). Если установлен бит @code{MGL_DRAW_LMEM=0x4}, то происходит прямое рисование в растровое изображение (меньше затраты памяти). +Задает качество графика в зависимости от значения @var{val}: @code{MGL_DRAW_WIRE=0} -- нет рисования граней (наиболее быстрый), @code{MGL_DRAW_FAST=1} -- нет интерполяции цвета (быстрый), @code{MGL_DRAW_NORM=2} -- высокое качество (нормальный), @code{MGL_DRAW_NORM=3} -- высокое качество с рисованием 3d примитивов (стрелок и маркеров). Если установлен бит @code{MGL_DRAW_LMEM=0x4}, то происходит прямое рисование в растровое изображение (меньше затраты памяти). @end deftypefn @ifclear UDAV @@ -912,7 +958,7 @@ Setsize: размер(ы) равны нулю или отрицательны @end menu @c ================================================================== -@external +@comment @external @node Export to file, Frames/Animation, , Export picture @subsection Экспорт в файл @cindex Write @@ -927,6 +973,7 @@ Setsize: размер(ы) равны нулю или отрицательны @cindex WriteBPS @cindex WriteTGA @cindex WriteTEX +@cindex WritePRC @cindex WriteOBJ @cindex WriteWGL @cindex WriteJPEG @@ -941,7 +988,7 @@ Setsize: размер(ы) равны нулю или отрицательны @deftypefnx {Метод класса @code{mglGraph}} @code{void} WriteFrame (@code{const char *}fname=@code{""}, @code{const char *}descr=@code{""}) @deftypefnx {Функция С} @code{void} mgl_write_frame (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) @end ifclear -Экспортирует текущий кадр в файл @var{fname} с типом, определяемым по расширению. Параметр @var{descr} добавляет описание (может быть пустым). Если @var{fname} пустой, то используется имя @samp{frame####.jpg}, где @samp{####} -- текущий номер кадра и имя @samp{frame} определяется переменной @var{PlotId}. +Экспортирует текущий кадр в файл @var{fname} с типом, определяемым по расширению. Параметр @var{descr} добавляет описание (может быть пустым). Если @var{fname} пустой, то используется имя @samp{frame####.jpg}, где @samp{####} -- текущий номер кадра и имя @samp{frame} определяется переменной @ref{plotid}. @end deftypefn @ifclear UDAV @@ -989,7 +1036,13 @@ Setsize: размер(ы) равны нулю или отрицательны @deftypefn {Метод класса @code{mglGraph}} @code{void} WriteTEX (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {Функция С} @code{void} mgl_write_tex (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) -Экспортирует текущий кадр в LaTeX файл (пакет Tikz/PGF), используя векторное представление графика. Вследствие чего не рекомендуется сохранять большие графики (поверхности, а особенно поверхности уровня) из-за большого размера файла. Хотя никаких внутренних ограничений на размер выходного файла нет. Для них лучше использовать растровый формат (например, PNG или JPEG). Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. +Экспортирует текущий кадр в LaTeX файл (пакет Tikz/PGF), используя векторное представление графика. Вследствие чего не рекомендуется сохранять большие графики (поверхности, а особенно поверхности уровня) из-за большого размера файла. Хотя никаких внутренних ограничений на размер выходного файла нет. Для них лучше использовать растровый формат (например, PNG или JPEG). Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. Отмечу, что сейчас отсутствует изменение размера текста (например, в subplot), что может приводить к неправильному положению надписей. +@end deftypefn + + +@deftypefn {Метод класса @code{mglGraph}} @code{void} WritePRC (@code{const char *}fname, @code{const char *}descr=@code{""}, @code{bool} make_pdf=@code{true}) +@deftypefnx {Функция С} @code{void} mgl_write_prc (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr, @code{int} make_pdf) +Экспортирует текущий кадр в PRC файл, используя векторное представление графика (см. @url{http://en.wikipedia.org/wiki/PRC_%28file_format%29}). Вследствие чего не рекомендуется сохранять большие графики (поверхности, а особенно поверхности уровня) из-за большого размера файла. Хотя никаких внутренних ограничений на размер выходного файла нет. Для них лучше использовать растровый формат (например, PNG или JPEG). Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. Если параметр @var{make_pdf}=@code{true} и PDF был выбран при конфигурировании MathGL, то также создается соответствующий PDF файл с 3D изображением. @end deftypefn @deftypefn {Метод класса @code{mglGraph}} @code{void} WriteOBJ (@code{const char *}fname, @code{const char *}descr=@code{""}) @@ -1030,21 +1083,26 @@ Setsize: размер(ы) равны нулю или отрицательны @end deftypefn +@deftypefn {Метод класса @code{mglGraph}} @code{void} WriteJSON (@code{const char *}fname, @code{const char *}descr=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_write_json (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) +Экспортирует точки и примитивы в текстовый файл используя @ref{JSON format}. В дальнейшем этот файл можно загрузить и просмотреть в JavaScript скрипте. Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. +@end deftypefn + @deftypefn {Метод класса @code{mglGraph}} @code{void} ExportMGLD (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {Функция С} @code{void} mgl_export_mgld (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) -Экспортирует точки и примитивы в файл MGLD формата. В дальнейшем этот файл можно загрузить и просмотреть с помощью @code{mglview}. Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. +Экспортирует точки и примитивы в файл @ref{MGLD format}. В дальнейшем этот файл можно загрузить и просмотреть с помощью @code{mglview}. Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. @end deftypefn @deftypefn {Метод класса @code{mglGraph}} @code{void} ImportMGLD (@code{const char *}fname, @code{bool} add=@code{false}) @deftypefnx {Функция С} @code{void} mgl_import_mgld (@code{HMGL} gr, @code{const char *}fname, @code{int} add) -Импортирует точки и примитивы из файла в формате MGLD. Параметры функции следующие: @var{fname} -- имя файла, @var{add} -- флаг добавления или замены существующих точек и примитивов. +Импортирует точки и примитивы из файла в @ref{MGLD format}. Параметры функции следующие: @var{fname} -- имя файла, @var{add} -- флаг добавления или замены существующих точек и примитивов. @end deftypefn @end ifclear @c ################################################################## -@external +@comment @external @node Frames/Animation, Bitmap in memory, Export to file, Export picture @subsection Кадры/Анимация @@ -1062,8 +1120,8 @@ Setsize: размер(ы) равны нулю или отрицательны Эти функции позволяют создавать несколько картинок одновременно. В большинстве случаев это бесполезно, но для органов управления (см. @ref{Widget classes}) это позволяет показывать анимацию. Также можно записать несколько кадров в анимированный GIF файл. -@deftypefn {Метод класса @code{mglGraph}} @code{int} NewFrame () -@deftypefnx {Функция С} @code{int} mgl_new_frame (@code{HMGL} gr) +@deftypefn {Метод класса @code{mglGraph}} @code{void} NewFrame () +@deftypefnx {Функция С} @code{void} mgl_new_frame (@code{HMGL} gr) Создает новый кадр. Функция возвращает номер текущего кадра. В режиме OpenGL функция не должны вызываться в параллельных потоках! -- используйте прямое создание списка. Функция @code{EndFrame()} @strong{должна} быть вызвана после рисования кадра для каждого вызова этой функции. @end deftypefn @@ -1077,8 +1135,28 @@ Setsize: размер(ы) равны нулю или отрицательны Возвращает число созданных кадров. @end deftypefn +@deftypefn {Метод класса @code{mglGraph}} @code{void} GetFrame (@code{int} i) +@deftypefnx {Функция С} @code{void} mgl_get_frame (@code{HMGL} gr, @code{int} i) +Завершает рисование кадра и сохраняет объекты рисования в кадр с номером @var{i}, который должен быть в диапазоне [0, @code{GetNumFrame()}-1]. Функция аналогична @code{EndFrame()}, но не добавляет кадр в GIF изображение. +@end deftypefn + +@deftypefn {Метод класса @code{mglGraph}} @code{void} GetFrame (@code{int} i) +@deftypefnx {Функция С} @code{void} mgl_get_frame (@code{HMGL} gr, @code{int} i) +Заменяет объекты рисования на объекты из кадра с номером @var{i}. Функция работает если установлен флаг @code{MGL_VECT_FRAME} (по умолчанию). +@end deftypefn + +@deftypefn {Метод класса @code{mglGraph}} @code{void} ShowFrame (@code{int} i) +@deftypefnx {Функция С} @code{void} mgl_show_frame (@code{HMGL} gr, @code{int} i) +Добавляет объекты рисования из кадра с номером @var{i} к уже существующим. Функция работает если установлен флаг @code{MGL_VECT_FRAME} (по умолчанию). +@end deftypefn + +@deftypefn {Метод класса @code{mglGraph}} @code{void} DelFrame (@code{int} i) +@deftypefnx {Функция С} @code{void} mgl_del_frame (@code{HMGL} gr, @code{int} i) +Удаляет объекты рисования для кадра с номером @var{i} и сдвигает нумерацию всех последующих кадров. Функция работает если установлен флаг @code{MGL_VECT_FRAME} (по умолчанию). +@end deftypefn + @deftypefn {Метод класса @code{mglGraph}} @code{void} ResetFrames () -@deftypefnx {Функция С} @code{int} mgl_reset_frames (@code{HMGL} gr) +@deftypefnx {Функция С} @code{void} mgl_reset_frames (@code{HMGL} gr) Сбрасывает счетчик кадров в 0. @end deftypefn @@ -1087,14 +1165,14 @@ Setsize: размер(ы) равны нулю или отрицательны Начинает запись кадров в анимированный GIF файл @var{fname}. Параметр @var{ms} задает задержку между кадрами в миллисекундах. Вы @strong{не должны} менять размер рисунка во время создания кино. Используйте CloseGIF() для завершения записи. Эта функция не работает в режиме OpenGL. @end deftypefn -@deftypefn {Метод класса @code{mglGraph}} @code{int} CloseGIF () +@deftypefn {Метод класса @code{mglGraph}} @code{void} CloseGIF () @deftypefnx {Функция С} @code{void} mgl_close_gif (@code{HMGL} gr) Завершает запись анимированного GIF файла. @end deftypefn @end ifclear @c ------------------------------------------------------------------ -@external +@comment @external @node Bitmap in memory, Parallelization, Frames/Animation, Export picture @subsection Рисование в памяти @@ -1144,13 +1222,13 @@ gr.GetBGRN(bits, len(bits)); Задает числовой идентификатор для объектов или subplot/inplot. @end deftypefn -@deftypefn {Метод класса @code{mglGraph}} @code{int} GetObjId (@code{long} xs, @code{long} ys) -@deftypefnx {Функция С} @code{int} mgl_get_obj_id (@code{HMGL} gr, @code{long} xs, @code{long} ys) +@deftypefn {Метод класса @code{mglGraph}} @code{int} GetObjId (@code{int} xs, @code{int} ys) +@deftypefnx {Функция С} @code{int} mgl_get_obj_id (@code{HMGL} gr, @code{int} xs, @code{int} ys) Возвращает числовой идентификатор верхнего объекта в точке @{xs, ys@} рисунка. @end deftypefn -@deftypefn {Метод класса @code{mglGraph}} @code{int} GetSplId (@code{long} xs, @code{long} ys) -@deftypefnx {Функция С} @code{int} mgl_get_spl_id (@code{HMGL} gr, @code{long} xs, @code{long} ys) +@deftypefn {Метод класса @code{mglGraph}} @code{int} GetSplId (@code{int} xs, @code{int} ys) +@deftypefnx {Функция С} @code{int} mgl_get_spl_id (@code{HMGL} gr, @code{int} xs, @code{int} ys) Возвращает числовой идентификатор верхнего "подграфика" в точке @{xs, ys@} рисунка. @end deftypefn @@ -1159,10 +1237,15 @@ gr.GetBGRN(bits, len(bits)); Выделяет объект с заданным @var{id}. @end deftypefn +@deftypefn {Метод класса @code{mglGraph}} @code{long} IsActive (@code{int} xs, @code{int} ys, @code{int} d=@code{1}) +@deftypefnx {Функция С} @code{long} mgl_is_active (@code{HMGL} gr, @code{int} xs, @code{int} ys, @code{int} d) +Проверяет близка ли точка @{@var{xs}, @var{ys}@} к активной точке (т.е. mglBase::Act) с точностью @var{d} и возвращает индекс активной точки или @code{-1} если не найдено. Активные точки -- специальные точки, которые характеризуют примитивы (например, вершины). Это функция только для опытных пользователей. +@end deftypefn + @end ifclear @c ------------------------------------------------------------------ -@external +@comment @external @node Parallelization, , Bitmap in memory, Export picture @subsection Распараллеливание @@ -1242,12 +1325,15 @@ gr.GetBGRN(bits, len(bits)); Рисует маркер (точку по умолчанию) с координатами @var{p}=@{@var{x}, @var{y}, @var{z}@} и цветом @var{col}. @end deftypefn +@anchor{errbox} +@deftypefn {Команда MGL} {} errbox @code{x y ex ey} ['stl'=''] +@deftypefnx {Команда MGL} {} errbox @code{x y z ex ey ez} ['stl'=''] @ifclear UDAV -@deftypefn {Метод класса @code{mglGraph}} @code{void} Error (@code{mglPoint} p, @code{mglPoint} e, @code{char} *stl=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Error (@code{mglPoint} p, @code{mglPoint} e, @code{char} *stl=@code{""}) @deftypefnx {Функция С} @code{void} mgl_error_box (@code{HMGL} gr, @code{mreal} px, @code{mreal} py, @code{mreal} pz, @code{mreal} ex, @code{mreal} ey, @code{mreal} ez, @code{char *}stl) -Рисует 3d error box в точке @var{p} размером @var{e} и стилем @var{stl}. Используйте NAN в компонентах @var{e} для уменьшения рисуемых элементов. -@end deftypefn @end ifclear +Рисует 3d error box в точке @var{p}=@{@var{x}, @var{y}, @var{z}@} размером @var{e}=@{@var{ex}, @var{ey}, @var{ez}@} и стилем @var{stl}. Используйте NAN в компонентах @var{e} для уменьшения рисуемых элементов. +@end deftypefn @anchor{line} @deftypefn {Команда MGL} {} line @code{x1 y1 x2 y2} ['stl'=''] @@ -1269,12 +1355,21 @@ gr.GetBGRN(bits, len(bits)); Рисует кривую Безье из точки @var{p1} в @var{p2} используя стиль линии @var{stl}. Касательные в точках пропорциональны @var{d1}, @var{d2}. Параметр @var{num} определяет гладкость линии (число точек на линии). Если @var{num}=@code{2}, то рисуется прямая даже в криволинейных координатах (см. @ref{Curved coordinates}). Наоборот, для больших значений (например, =@code{100}) рисуется геодезическая линия (окружность в полярных координатах, парабола в параболических и т.д.). Кривая рисуется даже если часть ее лежит вне диапазона осей координат. @end deftypefn +@anchor{face} +@deftypefn {Команда MGL} {} face @code{x1 y1 x2 y2 x3 y3 x4 y4} ['stl'=''] +@deftypefnx {Команда MGL} {} face @code{x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4} ['stl'=''] @ifclear UDAV -@deftypefn {Метод класса @code{mglGraph}} @code{void} Face (@code{mglPoint} p1, @code{mglPoint} p2, @code{mglPoint} p3, @code{mglPoint} p4, @code{const char *}stl=@code{"w"}) -@deftypefnx {Функция С} @code{void} mgl_curve (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} x3, @code{mreal} y3, @code{mreal} z3, @code{mreal} x4, @code{mreal} y4, @code{mreal} z4, @code{const char *}stl) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Face (@code{mglPoint} p1, @code{mglPoint} p2, @code{mglPoint} p3, @code{mglPoint} p4, @code{const char *}stl=@code{"w"}) +@deftypefnx {Функция С} @code{void} mgl_face (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} x3, @code{mreal} y3, @code{mreal} z3, @code{mreal} x4, @code{mreal} y4, @code{mreal} z4, @code{const char *}stl) +@end ifclear Рисует заполненный четырехугольник (грань) с углами в точках @var{p1}, @var{p2}, @var{p3}, @var{p4} и цветом(-ами) @var{stl}. При этом цвет может быть один для всей грани, или различным если указаны все 4 цвета. Грань будет нарисована даже если часть ее лежит вне диапазона осей координат. @end deftypefn -@end ifclear + +@anchor{rect} +@deftypefn {MGL command} {} rect @code{x1 y1 x2 y2} ['stl'=''] +@deftypefnx {MGL command} {} rect @code{x1 y1 z1 x2 y2 z2} ['stl'=''] +Рисует закрашенный прямоугольник (грань) с вершинами @{@var{x1}, @var{y1}, @var{z1}@} и @{@var{x2}, @var{y2}, @var{z2}@} цветом @var{stl}. При этом цвет может быть один для всей грани, или различным для разных вершин если указаны все 4 цвета. Грань будет нарисована даже если часть ее лежит вне диапазона осей координат. +@end deftypefn @anchor{facex} @anchor{facey} @@ -1332,8 +1427,8 @@ gr.GetBGRN(bits, len(bits)); @end deftypefn @anchor{ellipse} -@deftypefn {Команда MGL} {} ellipse @code{x1 y1 x2 y2 r} ['col'='r' @code{sh=1 asp=1}] -@deftypefnx {Команда MGL} {} ellipse @code{x1 y1 z1 x2 y2 z2 r} ['col'='r' @code{sh=1 asp=1}] +@deftypefn {Команда MGL} {} ellipse @code{x1 y1 x2 y2 r} ['col'='r'] +@deftypefnx {Команда MGL} {} ellipse @code{x1 y1 z1 x2 y2 z2 r} ['col'='r'] @ifclear UDAV @deftypefnx {Метод класса @code{mglGraph}} @code{void} Ellipse (@code{mglPoint} p1, @code{mglPoint} p2, @code{mreal} r, @code{const char *}col=@code{"r"}) @deftypefnx {Функция С} @code{void} mgl_ellipse(@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} r, @code{const char *}col) @@ -1342,8 +1437,8 @@ gr.GetBGRN(bits, len(bits)); @end deftypefn @anchor{rhomb} -@deftypefn {Команда MGL} {} rhomb @code{x1 y1 x2 y2 r} ['col'='r' @code{sh=1 asp=1}] -@deftypefnx {Команда MGL} {} rhomb @code{x1 y1 z1 x2 y2 z2 r} ['col'='r' @code{sh=1 asp=1}] +@deftypefn {Команда MGL} {} rhomb @code{x1 y1 x2 y2 r} ['col'='r'] +@deftypefnx {Команда MGL} {} rhomb @code{x1 y1 z1 x2 y2 z2 r} ['col'='r'] @ifclear UDAV @deftypefnx {Метод класса @code{mglGraph}} @code{void} Rhomb (@code{mglPoint} p1, @code{mglPoint} p2, @code{mreal} r, @code{const char *}col=@code{"r"}) @deftypefnx {Функция С} @code{void} mgl_rhomb(@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} r, @code{const char *}col) @@ -1360,7 +1455,6 @@ gr.GetBGRN(bits, len(bits)); @cindex Putsw @end ifclear @cindex Text -@cindex Label @cindex fgets Функции для вывода текста позволяют вывести строку текста в произвольном месте рисунка, в произвольном направлении и вдоль произвольной кривой. MathGL позволяет использовать произвольное начертание шрифта и многие ТеХ-ие команды (детальнее см. @ref{Font styles}). Все функции вывода текста имеют варианты для 8-bit строк (@code{char *}) и для Unicode строк (@code{wchar_t *}). В первом случае используется конверсия из текущей локали, т.е. иногда вам требуется явно указать локаль с помощью функции @code{setlocale()}. Аргумент @var{size} определяет размер текста: размер шрифта если положителен или относительный размер (=-@var{size}*@code{SetFontSize()}) если отрицателен. Начертание шрифта (STIX, arial, courier, times и др.) можно изменить с помощью функции LoadFont(). @xref{Font settings}. @@ -1406,12 +1500,12 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} text xdat ydat 'text' ['fnt'='' @code{size=-1 zval=nan}] @deftypefnx {Команда MGL} {} text xdat ydat zdat 'text' ['fnt'='' @code{size=-1}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglData &}y, @code{const char *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglData &}y, @code{const wchar_t *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglData &}x, @code{const mglData &}y, @code{const wchar_t *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const wchar_t *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglDataA &}y, @code{const char *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglDataA &}y, @code{const wchar_t *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const wchar_t *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Text (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const wchar_t *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_text_y (@code{HMGL} gr, @code{HCDT} y, @code{const char *}text, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_textw_y (@code{HMGL} gr, @code{HCDT} y, @code{const wchar_t *}text, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_text_xy (@code{HCDT} x, @code{HCDT} y, @code{const char *}text, @code{const char *}fnt, @code{const char *}opt) @@ -1437,10 +1531,10 @@ gr.GetBGRN(bits, len(bits)); @anchor{axis} @deftypefn {Команда MGL} {} axis ['dir'='xyz' 'stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axis (@code{const char *}dir=@code{"xyz"}, @code{const char *}stl=@code{""}) -@deftypefnx {Функция С} @code{void} mgl_axis (@code{HMGL} gr, @code{const char *}dir, @code{const char *}stl) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axis (@code{const char *}dir=@code{"xyz"}, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_axis (@code{HMGL} gr, @code{const char *}dir, @code{const char *}stl, @code{const char *}opt) @end ifclear -Рисует оси координат и метки на них (см. @ref{Axis settings}) в направлениях @samp{xyz}, указанных строкой @var{dir}. Если строка содержит символ @samp{_}, то подписи меток отображаться не будут. Если строка содержит символ @samp{AKDTVISO}, то будет нарисована соответствующая стрелка на конце оси. Стиль меток и оси(ей) задается строкой @var{stl}. @sref{Axis and ticks} +Рисует оси координат и метки на них (см. @ref{Axis settings}) в направлениях @samp{xyz}, указанных строкой @var{dir}. Заглавные буквы @samp{XYZ} приведут к расположению меток с другой стороны от оси. Если строка содержит символ @samp{_}, то подписи меток отображаться не будут. Если строка содержит символ @samp{AKDTVISO}, то будет нарисована соответствующая стрелка на конце оси. Стиль меток и оси(ей) задается строкой @var{stl}. @sref{Axis and ticks} @end deftypefn @anchor{colorbar} @@ -1454,7 +1548,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} colorbar vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Colorbar (@code{const mglData &}v, @code{const char *}sch=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Colorbar (@code{const mglDataA &}v, @code{const char *}sch=@code{""}) @deftypefnx {Функция С} @code{void} mgl_colorbar_val (@code{HMGL} gr, @code{HCDT} v, @code{const char *}sch) @end ifclear Аналогично предыдущему, но для цветовой схемы без сглаживания с заданными значениями @var{v}. @sref{ContD sample} @@ -1470,7 +1564,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} colorbar vdat 'sch' @code{x y [w=1 h=1]} @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Colorbar (@code{const mglData &}v, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w=@code{1}, @code{mreal} h=@code{1}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Colorbar (@code{const mglDataA &}v, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w=@code{1}, @code{mreal} h=@code{1}) @deftypefnx {Функция С} @code{void} mgl_colorbar_val_ext (@code{HMGL} gr, @code{HCDT} v, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w, @code{mreal} h) @end ifclear Аналогично предыдущему, но для цветовой схемы @var{sch} без сглаживания с заданными значениями @var{v}. @sref{ContD sample} @@ -1479,8 +1573,8 @@ gr.GetBGRN(bits, len(bits)); @anchor{grid} @deftypefn {Команда MGL} {} grid ['dir'='xyz' 'pen'='B'] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid (@code{const char *}dir=@code{"xyz"}, @code{const char *}pen=@code{"B"}) -@deftypefnx {Функция С} @code{void} mgl_axis_grid (@code{HMGL} gr, @code{const char *}dir, @code{const char *}pen) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid (@code{const char *}dir=@code{"xyz"}, @code{const char *}pen=@code{"B"}, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_axis_grid (@code{HMGL} gr, @code{const char *}dir, @code{const char *}pen, @code{const char *}opt) @end ifclear Рисует линии сетки в направлениях перпендикулярным @var{dir}. Шаг сетки такой же как у меток осей координат. Стиль линий задается параметром @var{pen} (по умолчанию -- сплошная темно синяя линия @samp{B-}). @end deftypefn @@ -1499,18 +1593,17 @@ gr.GetBGRN(bits, len(bits)); @anchor{ylabel} @anchor{zlabel} @anchor{tlabel} -@deftypefn {Команда MGL} {} xlabel 'text' [@code{pos=1 shift=0}] -@deftypefnx {Команда MGL} {} ylabel 'text' [@code{pos=1 shift=0}] -@deftypefnx {Команда MGL} {} zlabel 'text' [@code{pos=1 shift=0}] -@deftypefnx {Команда MGL} {} tlabel 'text' [@code{pos=1 shift=0}] +@deftypefn {Команда MGL} {} xlabel 'text' [@code{pos=1}] +@deftypefnx {Команда MGL} {} ylabel 'text' [@code{pos=1}] +@deftypefnx {Команда MGL} {} zlabel 'text' [@code{pos=1}] +@deftypefnx {Команда MGL} {} tlabel 'text' [@code{pos=1}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{char} dir, @code{const char *}text, @code{mreal} pos=@code{1}, @code{mreal} shift=@code{0}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{char} dir, @code{const wchar_t *}text, @code{mreal} pos=@code{1}, @code{mreal} shift=@code{0}) -@deftypefnx {Функция С} @code{void} mgl_label (@code{HMGL} gr, @code{char} dir, @code{const char *}text) -@deftypefnx {Функция С} @code{void} mgl_label_ext (@code{HMGL} gr, @code{char} dir, @code{const char *}text, @code{mreal} pos, @code{mreal} shift) -@deftypefnx {Функция С} @code{void} mgl_labelw_ext (@code{HMGL} gr, @code{char} dir, @code{const wchar_t *}text, @code{mreal} pos, @code{mreal} shift) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{char} dir, @code{const char *}text, @code{mreal} pos=@code{1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{char} dir, @code{const wchar_t *}text, @code{mreal} pos=@code{1}, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_label (@code{HMGL} gr, @code{char} dir, @code{const char *}text, @code{mreal} pos, @code{const char *}opt) +@deftypefnx {Функция С} @code{void} mgl_labelw (@code{HMGL} gr, @code{char} dir, @code{const wchar_t *}text, @code{mreal} pos, @code{const char *}opt) @end ifclear -Выводит подпись @var{text} для оси @var{dir}=@samp{x},@samp{y},@samp{z},@samp{t} (где @samp{t} -- ``тернарная'' ось @math{t=1-x-y}). Параметр @var{pos} задает положение подписи: при @var{pos}=0 -- по центру оси, при @var{pos}>0 -- около максимальных значений, при @var{pos}<0 -- около минимальных значений. @xref{Text printing}. +Выводит подпись @var{text} для оси @var{dir}=@samp{x},@samp{y},@samp{z},@samp{t} (где @samp{t} -- ``тернарная'' ось @math{t=1-x-y}). Параметр @var{pos} задает положение подписи: при @var{pos}=0 -- по центру оси, при @var{pos}>0 -- около максимальных значений, при @var{pos}<0 -- около минимальных значений. Опция @code{value} задает дополнительный сдвиг текста. @xref{Text printing}. @end deftypefn @c ################################################################## @@ -1526,18 +1619,18 @@ gr.GetBGRN(bits, len(bits)); Эти функции обеспечивают рисование легенды графика (полезно для @ref{1D plotting}). Запись в легенде состоит из двух строк: одна для стиля линии и маркеров, другая с текстом описания (с включенным разбором TeX-их команд). Можно использовать непосредственно массивы строк, или накопление во внутренние массивы с помощью функции AddLegend() с последующим отображением. Положение легенды можно задать автоматически или вручную. Параметры @var{fnt} и @var{size} задают стиль и размер шрифта (см. @ref{Font settings}). Параметр @var{llen} задает относительную ширину примера линии. Ели стиль линии пустой, то соответствующий текст печатается без отступа. Если строка @var{fnt} содержит символ @samp{A}, то координаты легенды считаются относительно картинки (а не текущего subplot). Если строка @var{fnt} содержит символ @samp{#}, то рисуется прямоугольник вокруг легенды. @sref{Legend sample} @anchor{legend} -@deftypefn {Команда MGL} {} legend [@code{pos=3} 'fnt'='#' @code{size=-0.8 llen=0.1}] +@deftypefn {Команда MGL} {} legend [@code{pos=3} 'fnt'='#'] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Legend (@code{int} pos=@code{0x3}, @code{const char *}fnt=@code{"#"}, @code{mreal} size=@code{-0.8}, @code{mreal} llen=@code{0.1}) -@deftypefnx {Функция С} @code{void} mgl_legend (@code{HMGL} gr, @code{int} pos, @code{const char *}fnt, @code{mreal} size, @code{mreal} llen) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Legend (@code{int} pos=@code{0x3}, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_legend (@code{HMGL} gr, @code{int} pos, @code{const char *}fnt, @code{const char *}opt) @end ifclear -Рисует легенду из накопленных записей шрифтом @var{fnt} размером @var{size}. Параметр @var{pos} задает положение легенды: @samp{0} -- в нижнем левом углу, @samp{1} -- нижнем правом углу, @samp{2} -- верхнем левом углу, @samp{3} -- верхнем правом углу (по умолчанию). Строка @var{fnt} может содержать вет для прямоугольника (1-ый цвет), для его границы (2-ой цвет) и для текста (последний). Если указано менее 3 цветов, то цвет рёбер будет чёрным (2 и менее цвета), а цвет прямоугольника белым (1 и менее цвета). Прямоугольник рисуется если строка @var{fnt} содержит @samp{#}. +Рисует легенду из накопленных записей шрифтом @var{fnt} размером @var{size}. Параметр @var{pos} задает положение легенды: @samp{0} -- в нижнем левом углу, @samp{1} -- нижнем правом углу, @samp{2} -- верхнем левом углу, @samp{3} -- верхнем правом углу (по умолчанию). Строка @var{fnt} может содержать вет для прямоугольника (1-ый цвет), для его границы (2-ой цвет) и для текста (последний). Если указано менее 3 цветов, то цвет рёбер будет чёрным (2 и менее цвета), а цвет прямоугольника белым (1 и менее цвета). Прямоугольник рисуется если строка @var{fnt} содержит @samp{#}. Если строка @var{fnt} содержит @samp{-}, то записи располагаются горизонтально. @end deftypefn -@deftypefn {Команда MGL} {} legend @code{x y} ['fnt'='#' @code{size=-1 llen=0.1}] +@deftypefn {Команда MGL} {} legend @code{x y} ['fnt'='#'] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Legend (@code{mreal} x, @code{mreal} y, @code{const char *}fnt=@code{"#"}, @code{mreal} size=@code{-0.8}, @code{mreal} llen=@code{0.1}) -@deftypefnx {Функция С} @code{void} mgl_legend_pos (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{const char *}fnt, @code{mreal} size, @code{mreal} llen) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Legend (@code{mreal} x, @code{mreal} y, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_legend_pos (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{const char *}fnt, @code{const char *}opt) @end ifclear Рисует легенду из накопленных записей шрифтом @var{fnt} размером @var{size}. Положение легенды задается параметрами @var{x}, @var{y}, которые полагаются нормированными в диапазоне [0,1]. @end deftypefn @@ -1605,9 +1698,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} plot xdat ydat ['stl'=''] @deftypefnx {Команда MGL} {} plot xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Plot (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Plot (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Plot (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Plot (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Plot (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Plot (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_plot (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_plot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_plot_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1618,7 +1711,7 @@ gr.GetBGRN(bits, len(bits)); @anchor{radar} @deftypefn {Команда MGL} {} radar adat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Radar (@code{const mglData &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Radar (@code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_radar (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @end ifclear Функции рисуют radar chart, представляющий собой ломанную с вершинами на радиальных линиях (типа ломанной в полярных координатах). Параметр @var{value} в опциях @var{opt} задает дополнительный сдвиг данных (т.е. использование @var{a}+@var{value} вместо @var{a}). Если @var{pen} содержит @samp{#}, то рисуется "сетка" (радиальные линии). См. также @ref{plot}. @sref{Radar sample} @@ -1629,9 +1722,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} step xdat ydat ['stl'=''] @deftypefnx {Команда MGL} {} step xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Step (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Step (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Step (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Step (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Step (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Step (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_step (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_step_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_step_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1644,9 +1737,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} tens xdat ydat cdat ['stl'=''] @deftypefnx {Команда MGL} {} tens xdat ydat zdat cdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tens (@code{const mglData &}y, @code{const mglData &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tens (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tens (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tens (@code{const mglDataA &}y, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tens (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tens (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_tens (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tens_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @@ -1659,9 +1752,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} tape xdat ydat ['stl'=''] @deftypefnx {Команда MGL} {} tape xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tape (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tape (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tape (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tape (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tape (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tape (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_tape (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tape_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tape_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1674,9 +1767,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} area xdat ydat ['stl'=''] @deftypefnx {Команда MGL} {} area xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Area (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Area (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Area (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Area (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Area (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Area (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_area (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_area_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_area_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1688,8 +1781,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} region ydat1 ydat2 ['stl'=''] @deftypefnx {Команда MGL} {} region xdat ydat1 ydat2 ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Region (@code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Region (@code{const mglData &}x, @code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Region (@code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Region (@code{const mglDataA &}x, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_region (@code{HMGL} gr, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_region_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @end ifclear @@ -1701,9 +1794,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} stem xdat ydat ['stl'=''] @deftypefnx {Команда MGL} {} stem xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Stem (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Stem (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Stem (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Stem (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Stem (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Stem (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_stem (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_stem_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_stem_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1716,9 +1809,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} bars xdat ydat ['stl'=''] @deftypefnx {Команда MGL} {} bars xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Bars (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Bars (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Bars (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Bars (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Bars (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Bars (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_bars (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_bars_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_bars_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1730,8 +1823,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} barh vdat ['stl'=''] @deftypefnx {Команда MGL} {} barh ydat vdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Barh (@code{const mglData &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Barh (@code{const mglData &}y, @code{const mglData &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Barh (@code{const mglDataA &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Barh (@code{const mglDataA &}y, @code{const mglDataA &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_barh (@code{HMGL} gr, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_barh_xy (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt) @end ifclear @@ -1743,9 +1836,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} cones xdat ydat ['stl'=''] @deftypefnx {Команда MGL} {} cones xdat ydat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cones (@code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cones (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cones (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cones (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cones (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cones (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_cones (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cones_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cones_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @@ -1758,7 +1851,7 @@ gr.GetBGRN(bits, len(bits)); @anchor{chart} @deftypefn {Команда MGL} {} chart adat ['col'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Chart (@code{const mglData &}a, @code{const char *}col=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Chart (@code{const mglDataA &}a, @code{const char *}col=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_chart (@code{HMGL} gr, @code{HCDT} a, @code{const char *}col, @code{const char *}opt) @end ifclear Рисует цветные полосы (пояса) для массива данных @var{a}. Число полос равно числу строк @var{a} (равно @var{a.ny}). Цвет полос поочерёдно меняется из цветов указанных в @var{col} или в палитре (см. @ref{Palette and colors}). Пробел в цветах соответствует прозрачному "цвету", т.е. если @var{col} содержит пробел(ы), то соответствующая полоса не рисуется. Ширина полосы пропорциональна значению элемента в @var{a}. График строится только для массивов не содержащих отрицательных значений. Если строка @var{col} содержит @samp{#}, то рисуется также чёрная граница полос. График выглядит лучше в (после вращения системы координат) и/или в полярной системе координат (становится Pie chart). @sref{Chart sample} @@ -1768,8 +1861,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} boxplot adat ['stl'=''] @deftypefnx {Команда MGL} {} boxplot xdat adat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} BoxPlot (@code{const mglData &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} BoxPlot (@code{const mglData &}x, @code{const mglData &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} BoxPlot (@code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} BoxPlot (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_boxplot (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_boxplot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @end ifclear @@ -1783,11 +1876,11 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} candle vdat1 vdat2 ydat1 ydat2 ['stl'=''] @deftypefnx {Команда MGL} {} candle xdat vdat1 vdat2 ydat1 ydat2 ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglData &}v1, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglData &}v1, @code{const mglData &}v2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglData &}v1, @code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglData &}v1, @code{const mglData &}v2, @code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglData &}x, @code{const mglData &}v1, @code{const mglData &}v2, @code{const mglData &}y1, @code{const mglData &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const mglDataA &}v2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const mglDataA &}v2, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}x, @code{const mglDataA &}v1, @code{const mglDataA &}v2, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_candle (@code{HMGL} gr, @code{HCDT} v1, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_candle_yv (@code{HMGL} gr, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_candle_xyv (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @@ -1801,9 +1894,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} error xdat ydat yerr ['stl'=''] @deftypefnx {Команда MGL} {} error xdat ydat xerr yerr ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Error (@code{const mglData &}y, @code{const mglData &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Error (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Error (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ex, @code{const mglData &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Error (@code{const mglDataA &}y, @code{const mglDataA &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Error (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Error (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ex, @code{const mglDataA &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_error (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_error_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_error_exy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ex, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @@ -1816,9 +1909,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} mark xdat ydat rdat ['stl'=''] @deftypefnx {Команда MGL} {} mark xdat ydat zdat rdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mark (@code{const mglData &}y, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mark (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_mark_y (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_mark_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_mark_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @@ -1832,14 +1925,14 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} textmark xdat ydat rdat 'txt' ['stl'=''] @deftypefnx {Команда MGL} {} textmark xdat ydat zdat rdat 'txt' ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglData &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglData &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglData &}y, @code{const mglData &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglData &}y, @code{const mglData &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_textmark (@code{HMGL} gr, @code{HCDT} y, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_textmarkw (@code{HMGL} gr, @code{HCDT} y, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_textmark_yr (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @@ -1857,12 +1950,12 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} label xdat ydat 'txt' ['stl'=''] @deftypefnx {Команда MGL} {} label xdat ydat zdat 'txt' ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglData &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglData &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglData &}x, @code{const mglData &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglData &}x, @code{const mglData &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglDataA &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglDataA &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_label (@code{HMGL} gr, @code{HCDT} y, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_labelw (@code{HMGL} gr, @code{HCDT} y, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_label_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @@ -1870,7 +1963,21 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_label_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_labelw_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @end ifclear -Функции выводят текстовую строку @var{txt} в точках @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Если строка @var{txt} содержит @samp{%x}, @samp{%y}, @samp{%z} или @samp{%n}, то они будут заменены на значения соответствующих координат или на номер точки. См. также @ref{plot}, @ref{mark}, @ref{textmark}. @sref{Label sample} +Функции выводят текстовую строку @var{txt} в точках @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Если строка @var{txt} содержит @samp{%x}, @samp{%y}, @samp{%z} или @samp{%n}, то они будут заменены на значения соответствующих координат или на номер точки. См. также @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{Label sample} +@end deftypefn + +@anchor{table} +@deftypefn {MGL command} {} table vdat 'txt' ['stl'='#'] +@deftypefnx {MGL command} {} table x y vdat 'txt' ['stl'='#'] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{const mglDataA &}val, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{const mglDataA &}val, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{mreal} x, @code{mreal} y, @code{const mglDataA &}val, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{mreal} x, @code{mreal} y, @code{const mglDataA &}val, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_table (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) +@deftypefnx {C function} @code{void} mgl_tablew (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) +@end ifclear +Рисует таблицу значений массива @var{val} с заголовками @var{txt} (разделенными символом новой строки @samp{\n}) в точке @{@var{x}, @var{y}@} (по умолчанию @{0,0@}) относительно текущего subplot. Если строка @var{fnt} содержит @samp{#}, то рисуются границы ячеек. Если строка @var{fnt} содержит @samp{=}, то ширина всех ячеек одинакова. Если строка @var{fnt} содержит @samp{|}, то ширина таблицы ограничена шириной subplot (эквивалентно опции @samp{value 1}). Опция @code{value} задает ширину таблицы (по умолчанию 1). См. также @ref{label}. @sref{Table sample} @end deftypefn @anchor{tube} @@ -1881,12 +1988,12 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} tube xdat ydat zdat rdat ['stl'=''] @deftypefnx {Команда MGL} {} tube xdat ydat zdat @code{rval} ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglData &}y, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglData &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglData &}x, @code{const mglData &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_tube_r (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tube (@code{HMGL} gr, @code{HCDT} y, @code{mreal} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tube_xyr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @@ -1900,10 +2007,10 @@ gr.GetBGRN(bits, len(bits)); @anchor{torus} @deftypefn {Команда MGL} {} torus rdat zdat ['stl'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Torus (@code{const mglData &}r, @code{const mglData &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Torus (@code{const mglDataA &}r, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_torus (@code{HMGL} gr, @code{HCDT} r, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @end ifclear -Функции рисуют поверхность вращения кривой @{@var{r}, @var{z}@} относительно оси. Если строка @var{pen} содержит @samp{x} или @samp{z}, то ось вращения будет выбрана в указанном направлении (по умолчанию вдоль оси y). См. также @ref{plot}, @ref{axial}. @sref{Torus sample} +Функции рисуют поверхность вращения кривой @{@var{r}, @var{z}@} относительно оси. Если строка @var{pen} содержит @samp{x} или @samp{z}, то ось вращения будет выбрана в указанном направлении (по умолчанию вдоль оси y). Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{plot}, @ref{axial}. @sref{Torus sample} @end deftypefn @@ -1933,20 +2040,20 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} surf zdat ['sch'=''] @deftypefnx {Команда MGL} {} surf xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_surf (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_surf_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Если @var{sch} содержит @samp{#}, то рисуется сетка на поверхности. См. также @ref{mesh}, @ref{dens}, @ref{belt}, @ref{tile}, @ref{boxs}, @ref{surfc}, @ref{surfa}. @sref{Surf sample} +Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Если @var{sch} содержит @samp{#}, то рисуется сетка на поверхности. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{mesh}, @ref{dens}, @ref{belt}, @ref{tile}, @ref{boxs}, @ref{surfc}, @ref{surfa}. @sref{Surf sample} @end deftypefn @anchor{mesh} @deftypefn {Команда MGL} {} mesh zdat ['sch'=''] @deftypefnx {Команда MGL} {} mesh xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mesh (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mesh (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mesh (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Mesh (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_mesh (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_mesh_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -1957,8 +2064,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} fall zdat ['sch'=''] @deftypefnx {Команда MGL} {} fall xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Fall (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Fall (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Fall (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Fall (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_fall (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_fall_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -1969,8 +2076,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} belt zdat ['sch'=''] @deftypefnx {Команда MGL} {} belt xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Belt (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Belt (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Belt (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Belt (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_belt (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_belt_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -1981,8 +2088,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} boxs zdat ['sch'=''] @deftypefnx {Команда MGL} {} boxs xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Boxs (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Boxs (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Boxs (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Boxs (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_boxs (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_boxs_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -1993,8 +2100,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} tile zdat ['sch'=''] @deftypefnx {Команда MGL} {} tile xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tile (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tile (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_tile (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tile_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2005,20 +2112,20 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} dens zdat ['sch'=''] @deftypefnx {Команда MGL} {} dens xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dens (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dens (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dens (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dens (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) @deftypefnx {Функция С} @code{void} mgl_dens (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_dens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует график плотности для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z} = @var{Min}.z. Если @var{sch} содержит @samp{#}, то рисуется сетка. См. также @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample} +Рисует график плотности для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z} = @var{Min}.z. Если @var{sch} содержит @samp{#}, то рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample} @end deftypefn @anchor{cont} @deftypefn {Команда MGL} {} cont vdat zdat ['sch'=''] @deftypefnx {Команда MGL} {} cont vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_cont__val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cont_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2028,8 +2135,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} cont zdat ['sch'=''] @deftypefnx {Команда MGL} {} cont xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_cont (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cont_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2040,8 +2147,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} contf vdat zdat ['sch'=''] @deftypefnx {Команда MGL} {} contf vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContF (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContF (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contf_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contf_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2051,8 +2158,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} contf zdat ['sch'=''] @deftypefnx {Команда MGL} {} contf xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContF (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContF (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contf (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contf_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2063,8 +2170,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} contd vdat zdat ['sch'=''] @deftypefnx {Команда MGL} {} contd vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContD (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContD (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contd_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contd_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2074,8 +2181,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} contd zdat ['sch'=''] @deftypefnx {Команда MGL} {} contd xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContD (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContD (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contd (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contd_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2086,8 +2193,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} contv vdat zdat ['sch'=''] @deftypefnx {Команда MGL} {} contv vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContV (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContV (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contv_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contv_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2097,8 +2204,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} contv zdat ['sch'=''] @deftypefnx {Команда MGL} {} contv xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContV (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContV (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contv (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contv_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2109,19 +2216,19 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} axial vdat zdat ['sch'=''] @deftypefnx {Команда MGL} {} axial vdat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axial (@code{const mglData &}v, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axial (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_axial_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_axial_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует поверхность вращения линии уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если строка содержит символы @samp{x} или @samp{z}, то ось вращения устанавливается в указанное направление (по умолчанию вдоль @samp{y}). См. также @ref{cont}, @ref{contf}, @ref{torus}, @ref{surf3}. @sref{Axial sample} +Рисует поверхность вращения линии уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Если строка содержит символы @samp{x} или @samp{z}, то ось вращения устанавливается в указанное направление (по умолчанию вдоль @samp{y}). См. также @ref{cont}, @ref{contf}, @ref{torus}, @ref{surf3}. @sref{Axial sample} @end deftypefn @deftypefn {Команда MGL} {} axial zdat ['sch'=''] @deftypefnx {Команда MGL} {} axial xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axial (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axial (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) @deftypefnx {Функция С} @code{void} mgl_axial (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_axial_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2132,8 +2239,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} grid2 zdat ['sch'=''] @deftypefnx {Команда MGL} {} grid2 xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid (@code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_grid (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_grid_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2160,19 +2267,19 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} surf3 adat @code{val} ['sch'=''] @deftypefnx {Команда MGL} {} surf3 xdat ydat zdat adat @code{val} ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_surf3_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_surf3_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Замечу, что возможно некорректная отрисовка граней вследствие неопределённости построения сечения если поверхность пересекает ячейку данных 2 и более раз. См. также @ref{cloud}, @ref{dens3}, @ref{surf3c}, @ref{surf3a}, @ref{axial}. @sref{Surf3 sample} +Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Замечу, что возможно некорректная отрисовка граней вследствие неопределённости построения сечения если поверхность пересекает ячейку данных 2 и более раз. См. также @ref{cloud}, @ref{dens3}, @ref{surf3c}, @ref{surf3a}, @ref{axial}. @sref{Surf3 sample} @end deftypefn @deftypefn {Команда MGL} {} surf3 adat ['sch'=''] @deftypefnx {Команда MGL} {} surf3 xdat ydat zdat adat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_surf3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_surf3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2183,20 +2290,20 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} cloud adat ['sch'=''] @deftypefnx {Команда MGL} {} cloud xdat ydat zdat adat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cloud (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cloud (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cloud (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cloud (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_cloud (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cloud_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует облачный график для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). График состоит из кубиков с цветом и прозрачностью пропорциональной значениям @var{a}. Результат похож на облако -- малые значения прозрачны, а большие нет. Число кубиков зависит от @ref{meshnum}. Если @var{sch} содержит @samp{.}, то будет построен график более низкого качества, но с заметно меньшим использованием памяти. Если @var{sch} содержит @samp{!}, то прозрачность будет инвертирована, т.е. области с более высокими значениями будут более прозрачны, а с более низким -- менее прозрачны. См. также @ref{surf3}, @ref{meshnum}. @sref{Cloud sample} +Рисует облачный график для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). График состоит из кубиков с цветом и прозрачностью пропорциональной значениям @var{a}. Результат похож на облако -- малые значения прозрачны, а большие нет. Число кубиков зависит от @ref{meshnum}. Если @var{sch} содержит @samp{.}, то будет построен график более низкого качества, но с заметно меньшим использованием памяти. Если @var{sch} содержит @samp{i}, то прозрачность будет инвертирована, т.е. области с более высокими значениями будут более прозрачны, а с более низким -- менее прозрачны. См. также @ref{surf3}, @ref{meshnum}. @sref{Cloud sample} @end deftypefn @anchor{dens3} @deftypefn {Команда MGL} {} dens3 adat ['sch'='' @code{sval=-1}] @deftypefnx {Команда MGL} {} dens3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dens3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dens3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dens3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dens3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_dens3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_dens3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2207,8 +2314,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} cont3 vdat adat ['sch'='' @code{sval=-1}] @deftypefnx {Команда MGL} {} cont3 vdat xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont3 (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont3 (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_cont3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cont3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2218,8 +2325,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} cont3 adat ['sch'='' @code{sval=-1}] @deftypefnx {Команда MGL} {} cont3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_cont3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cont3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2230,8 +2337,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} contf3 vdat adat ['sch'='' @code{sval=-1}] @deftypefnx {Команда MGL} {} contf3 vdat xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Contf3 (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Contf3 (@code{const mglData &}v, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contf3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contf3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2241,8 +2348,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} contf3 adat ['sch'='' @code{sval=-1}] @deftypefnx {Команда MGL} {} contf3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Contf3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Contf3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contf3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contf3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2253,8 +2360,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} grid3 adat ['sch'='' @code{sval=-1}] @deftypefnx {Команда MGL} {} grid3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid3 (@code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid3 (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_grid3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_grid3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear @@ -2264,8 +2371,8 @@ gr.GetBGRN(bits, len(bits)); @anchor{beam} @deftypefn {Команда MGL} {} beam tr g1 g2 adat @code{rval} ['sch'='' @code{flag=0 num=3}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Beam (@code{const mglData &}tr, @code{const mglData &}g1, @code{const mglData &}g2, @code{const mglData &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}, @code{int} num=@code{3}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Beam (@code{mreal} val, @code{const mglData &}tr, @code{const mglData &}g1, @code{const mglData &}g2, @code{const mglData &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Beam (@code{const mglDataA &}tr, @code{const mglDataA &}g1, @code{const mglDataA &}g2, @code{const mglDataA &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}, @code{int} num=@code{3}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Beam (@code{mreal} val, @code{const mglDataA &}tr, @code{const mglDataA &}g1, @code{const mglDataA &}g2, @code{const mglDataA &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}) @deftypefnx {Функция С} @code{void} mgl_beam (@code{HMGL} gr, @code{HCDT} tr, @code{HCDT} g1, @code{HCDT} g2, @code{HCDT} a, @code{mreal} r, @code{const char *}stl, @code{int} flag, @code{int} num) @deftypefnx {Функция С} @code{void} mgl_beam_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} tr, @code{HCDT} g1, @code{HCDT} g2, @code{HCDT} a, @code{mreal} r, @code{const char *}stl, @code{int} flag) @end ifclear @@ -2292,31 +2399,31 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} surfc zdat cdat ['sch'=''] @deftypefnx {Команда MGL} {} surfc xdat ydat zdat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfC (@code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfC (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfC (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfC (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_surfc (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_surfc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом, заданным массивом @var{c}[i,j]. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfa}, @ref{surf3c}. @sref{SurfC sample} +Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом, заданным массивом @var{c}[i,j]. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfa}, @ref{surf3c}. @sref{SurfC sample} @end deftypefn @anchor{surf3c} @deftypefn {Команда MGL} {} surf3c adat cdat @code{val} ['sch'=''] @deftypefnx {Команда MGL} {} surf3c xdat ydat zdat adat cdat @code{val} ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_surf3c_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_surf3c_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но цвет задается массивом @var{c}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3C sample} +Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но цвет задается массивом @var{c}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3C sample} @end deftypefn @deftypefn {Команда MGL} {} surf3c adat cdat ['sch'=''] @deftypefnx {Команда MGL} {} surf3c xdat ydat zdat adat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3C (@code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3C (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3C (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3C (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_surf3c (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_surf3c_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2328,31 +2435,31 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} surfa zdat cdat ['sch'=''] @deftypefnx {Команда MGL} {} surfa xdat ydat zdat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfA (@code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfA (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfA (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_surfa (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_surfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с прозрачностью, заданной массивом @var{c}[i,j]. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfc}, @ref{surf3a}. @sref{SurfA sample} +Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с прозрачностью, заданной массивом @var{c}[i,j]. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfc}, @ref{surf3a}. @sref{SurfA sample} @end deftypefn @anchor{surf3a} @deftypefn {Команда MGL} {} surf3a adat cdat @code{val} ['sch'=''] @deftypefnx {Команда MGL} {} surf3a xdat ydat zdat adat cdat @code{val} ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_surf3a_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_surf3a_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но прозрачность задается массивом @var{c}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample} +Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но прозрачность задается массивом @var{c}. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample} @end deftypefn @deftypefn {Команда MGL} {} surf3a adat cdat ['sch'=''] @deftypefnx {Команда MGL} {} surf3a xdat ydat zdat adat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3A (@code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3A (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3A (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3A (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_surf3a (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_surf3a_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2363,8 +2470,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} tiles zdat rdat ['sch'=''] @deftypefnx {Команда MGL} {} tiles xdat ydat zdat rdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TileS (@code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TileS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}r, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_tiles (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tiles_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2375,8 +2482,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} map udat vdat ['sch'=''] @deftypefnx {Команда MGL} {} map xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Map (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Map (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Map (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Map (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_map (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_map_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2387,8 +2494,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} stfa re im @code{dn} ['sch'=''] @deftypefnx {Команда MGL} {} stfa xdat ydat re im @code{dn} ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} STFA (@code{const mglData &}re, @code{const mglData &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} STFA (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}re, @code{const mglData &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} STFA (@code{const mglDataA &}re, @code{const mglDataA &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} STFA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}re, @code{const mglDataA &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_stfa (@code{HMGL} gr, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_stfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2413,8 +2520,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} traj xdat ydat udat vdat ['sch'=''] @deftypefnx {Команда MGL} {} traj xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Traj (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Traj (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Traj (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Traj (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_traj_xyz (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}z, @code{HCDT}ax, @code{HCDT}ay, @code{HCDT}az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_traj_xy (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}ax, @code{HCDT}ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2425,8 +2532,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} vect udat vdat ['sch'=''] @deftypefnx {Команда MGL} {} vect xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Vect (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Vect (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_vect_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_vect_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2447,20 +2554,43 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} vect udat vdat wdat ['sch'=''] @deftypefnx {Команда MGL} {} vect xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Vect (@code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Vect (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_vect_3d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_vect_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @end ifclear Это 3d версия графика. Здесь массивы @var{ax}, @var{ay}, @var{az} должны трёхмерными тензорами и длина вектора пропорциональна @math{\sqrt@{ax^2+ay^2+az^2@}}. @end deftypefn +@anchor{vect3} +@deftypefn {MGL command} {} vect3 udat vdat wdat ['sch'='' sval] +@deftypefnx {MGL command} {} vect3 xdat ydat zdat udat vdat wdat ['sch'='' sval] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Vect3 (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Vect3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_vect3 (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) +@deftypefnx {C function} @code{void} mgl_vect3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) +@end ifclear +Рисует 3D векторное поле @{@var{ax}, @var{ay}, @var{az}@} параметрически зависящее от координат @var{x}, @var{y}, @var{z}. График рисуется на срезе @var{sVal} в направлении @{@samp{x}, @samp{y}, @samp{z}@}, указанном в строке @var{sch} (по умолчанию, в напралении @samp{y}). Длина и цвет векторов пропорциональна @math{\sqrt@{ax^2+ay^2+az^2@}}. Число рисуемых векторов зависит от @ref{meshnum}. Вид стрелок/штрихов может быть изменён символами: +@itemize @bullet +@item +@samp{f} для стрелок одинаковой длины, +@item +@samp{>}, @samp{<} для стрелок начинающихся или заканчивающихся в ячейке сетки (по умолчанию центрированы), +@item +@samp{.} для рисования штрихов с точкой в начале вместо стрелок, +@item +@samp{=} для использования градиента цвета вдоль стрелок. +@end itemize +См. также @ref{vect}, @ref{flow}, @ref{dew}. @sref{Vect sample} +@end deftypefn + @anchor{dew} @deftypefn {Команда MGL} {} dew udat vdat ['sch'=''] @deftypefnx {Команда MGL} {} dew xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dew (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dew (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dew (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dew (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_dew (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_dew_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2471,8 +2601,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} flow udat vdat ['sch'=''] @deftypefnx {Команда MGL} {} flow xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Flow (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Flow (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_flow_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_flow_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2493,8 +2623,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} flow udat vdat wdat ['sch'=''] @deftypefnx {Команда MGL} {} flow xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Flow (@code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Flow (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_flow_3d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_flow_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2504,8 +2634,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} flow @code{x0 y0} udat vdat ['sch'=''] @deftypefnx {Команда MGL} {} flow @code{x0 y0} xdat ydat udat vdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_flowp_2d (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_flowp_xy (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2515,8 +2645,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} flow @code{x0 y0 z0} udat vdat wdat ['sch'=''] @deftypefnx {Команда MGL} {} flow @code{x0 y0 z0} xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_flowp_3d (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_flowp_xyz (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2528,9 +2658,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} grad xdat ydat pdat ['sch'=''] @deftypefnx {Команда MGL} {} grad xdat ydat zdat pdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grad (@code{const mglData &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grad (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grad (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grad (@code{const mglDataA &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grad (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Grad (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_grad (@code{HMGL} gr, @code{HCDT} phi, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_grad_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} phi, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_grad_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} phi, @code{const char *}sch, @code{const char *}opt) @@ -2542,8 +2672,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} pipe udat vdat ['sch'='' @code{r0=0.05}] @deftypefnx {Команда MGL} {} pipe xdat ydat udat vdat ['sch'='' @code{r0=0.05}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Pipe (@code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Pipe (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}ax, @code{const mglData &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_pipe_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_pipe_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @end ifclear @@ -2553,8 +2683,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} pipe udat vdat wdat ['sch'='' @code{r0=0.05}] @deftypefnx {Команда MGL} {} pipe xdat ydat zdat udat vdat wdat ['sch'='' @code{r0=0.05}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Pipe (@code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Pipe (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}ax, @code{const mglData &}ay, @code{const mglData &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_pipe_3d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_pipe_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @end ifclear @@ -2584,9 +2714,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} densy dat ['sch'='' @code{sval=nan}] @deftypefnx {Команда MGL} {} densz dat ['sch'='' @code{sval=nan}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} DensX (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} DensY (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} DensZ (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} DensX (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} DensY (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} DensZ (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_dens_x (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_dens_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_dens_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2599,9 +2729,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} conty dat ['sch'='' @code{sval=nan}] @deftypefnx {Команда MGL} {} contz dat ['sch'='' @code{sval=nan}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContX (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContY (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContZ (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContX (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContY (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContZ (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_cont_x (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cont_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cont_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2610,9 +2740,9 @@ gr.GetBGRN(bits, len(bits)); @end deftypefn @ifclear UDAV -@deftypefn {Метод класса @code{mglGraph}} @code{void} ContX (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContY (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContZ (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefn {Метод класса @code{mglGraph}} @code{void} ContX (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContY (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContZ (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_cont_x_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cont_y_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cont_z_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2625,9 +2755,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} contfy dat ['sch'='' @code{sval=nan}] @deftypefnx {Команда MGL} {} contfz dat ['sch'='' @code{sval=nan}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFX (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFY (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFZ (@code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFX (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFY (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFZ (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contf_x (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contf_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contf_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2636,9 +2766,9 @@ gr.GetBGRN(bits, len(bits)); @end deftypefn @ifclear UDAV -@deftypefn {Метод класса @code{mglGraph}} @code{void} ContFX (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFY (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFZ (@code{const mglData &}v, @code{const mglData &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefn {Метод класса @code{mglGraph}} @code{void} ContFX (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFY (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ContFZ (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_contf_x_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contf_y_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contf_z_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @@ -2685,9 +2815,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} triplot idat xdat ydat zdat ['sch'=''] @deftypefnx {Команда MGL} {} triplot idat xdat ydat zdat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_triplot_xy (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_triplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_triplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @@ -2700,10 +2830,10 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} tricont vdat idat xdat ydat zdat ['sch'=''] @deftypefnx {Команда MGL} {} tricont idat xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriCont (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriCont (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriContV (@code{const mglData &}v, @code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriContV (@code{const mglData &}v, @code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriCont (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriCont (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriContV (@code{const mglDataA &}v, @code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} TriContV (@code{const mglDataA &}v, @code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_tricont_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tricont_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tricont_xyzcv (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @@ -2717,9 +2847,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} quadplot idat xdat ydat zdat ['sch'=''] @deftypefnx {Команда MGL} {} quadplot idat xdat ydat zdat cdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} QuadPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} QuadPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} QuadPlot (@code{const mglData &}id, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} QuadPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} QuadPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} QuadPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_quadplot_xy (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_quadplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_quadplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @@ -2731,8 +2861,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} dots xdat ydat zdat ['sch'=''] @deftypefnx {Команда MGL} {} dots xdat ydat zdat adat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dots (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dots (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dots (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Dots (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_dots (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_dots_a (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear @@ -2742,7 +2872,7 @@ gr.GetBGRN(bits, len(bits)); @anchor{crust} @deftypefn {Команда MGL} {} crust xdat ydat zdat ['sch'=''] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Crust (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Crust (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_crust (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear Реконструирует и рисует поверхность по произвольно расположенным точкам @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Опция @var{value} задает радиус ошибки (увеличите для удаления дыр). Строка @var{sch} задает цветовую схему. Если строка содержит @samp{#}, то рисуется сетчатая поверхность. Массивы @var{x}, @var{y}, @var{z} должны иметь одинаковые размеры. См. также @ref{dots}, @ref{triplot}. @c @sref{Crust sample} @@ -2769,14 +2899,14 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} fits res xdat ydat adat sdat 'func' 'var' [ini=0] @deftypefnx {Команда MGL} {} fits res xdat ydat zdat adat sdat 'func' 'var' [ini=0] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const mglData &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{HMDT} mgl_fit_ys (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {Функция С} @code{HMDT} mgl_fit_xys (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {Функция С} @code{HMDT} mgl_fit_xyzs (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @@ -2791,14 +2921,14 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} fit res xdat ydat adat sdat 'func' 'var' [ini=0] @deftypefnx {Команда MGL} {} fit res xdat ydat zdat adat sdat 'func' 'var' [ini=0] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{HMDT} mgl_fit_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {Функция С} @code{HMDT} mgl_fit_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {Функция С} @code{HMDT} mgl_fit_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @@ -2809,10 +2939,10 @@ gr.GetBGRN(bits, len(bits)); @ifclear UDAV -@deftypefn {Метод класса @code{mglGraph}} @code{mglData} Fit2 (@code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit2 (@code{mglData &}fit, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglData &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefn {Метод класса @code{mglGraph}} @code{mglData} Fit2 (@code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit2 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{HMDT} mgl_fit_2 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {Функция С} @code{HMDT} mgl_fit_3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) "Подгоняют" формулу вдоль всех направлений для 2d или 3d массива @var{a} с @var{s}=1 и @var{x}, @var{y}, @var{z} равно распределёнными в диапазоне осей координат. @@ -2848,9 +2978,9 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} hist @sc{res} xdat ydat adat @deftypefnx {Команда MGL} {} hist @sc{res} xdat ydat zdat adat @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Hist (@code{const mglData &}x, @code{const mglData &}a, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Hist (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}a, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Hist (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const mglData &}a, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Hist (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Hist (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} Hist (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{HMDT} mgl_hist_x (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}opt) @deftypefnx {Функция С} @code{HMDT} mgl_hist_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} a, @code{const char *}opt) @deftypefnx {Функция С} @code{HMDT} mgl_hist_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}opt) @@ -2864,8 +2994,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Команда MGL} {} fill dat 'eq' vdat wdat @ifclear UDAV @deftypefnx {Метод класса @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglData &}v, @code{const char *}opt=@code{""}) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglData &}v, @code{const mglData &}w, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglDataA &}v, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglDataA &}v, @code{const mglDataA &}w, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_data_fill_eq (@code{HMGL} gr, @code{HMDT} u, @code{const char *}eq, @code{HCDT}v, @code{HCDT}w, @code{const char *}opt) @end ifclear Заполняют значения массива @samp{u} в соответствии с формулой в строке @var{eq}. Формула -- произвольное выражение, зависящее от переменных @samp{x}, @samp{y}, @samp{z}, @samp{u}, @samp{v}, @samp{w}. Координаты @samp{x}, @samp{y}, @samp{z} полагаются в диапазоне изменения осей координат. Переменная @samp{u} -- значение исходного массива. Переменные @samp{v} и @samp{w} -- значения массивов @var{v}, @var{w}, которые могут быть @code{NULL} (т.е. могут быть опущены). @@ -2873,8 +3003,8 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {MGL command} {} datagrid dat xdat ydat zdat @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} DataGrid (@code{mglData &}u, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}opt=@code{""}) -@deftypefnx {C function} @code{void} mgl_data_grid (@code{HMGL} gr, @code{HMDT} u, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}opt) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} DataGrid (@code{mglData &}u, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_data_grid (@code{HMGL} gr, @code{HMDT} u, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}opt) @end ifclear Заполняет значения массива @samp{u} результатом линейной интерполяции по триангулированной поверхности, найденной по произвольно расположенным точкам @samp{x}, @samp{y}, @samp{z}. NAN значение используется для точек сетки вне триангулированной поверхности. @end deftypefn @@ -2883,7 +3013,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefn {Команда MGL} {} pde @sc{res} 'ham' ini_re ini_im [@code{dz=0.1 k0=100}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} PDE (@code{const char *}ham, @code{const mglData &}ini_re, @code{const mglData &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{mglData} PDE (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{HMDT} mgl_pde_solve (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt) @end ifclear Решает уравнение в частных производных du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], где p=-i/k0*d/dx, q=-i/k0*d/dy -- псевдо-дифференциальные оперторы. Параметры @var{ini_re}, @var{ini_im} задают действительную и мнимую часть начального распределения поля. Координаты @samp{x}, @samp{y}, @samp{z} полагаются в диапазоне изменения осей координат. Отмечу, ято в действительности этот диапазон увеличен на 3/2 для уменьшения отражения от границ сетки. Параметр @var{dz} задает шаг по эволюционной координате z. Сейчас используется упрощенный вид функции @var{ham} -- исключены все ``смешанные'' члены (типа @samp{x*p}->x*d/dx). Например, в 2D случае это функция вида @math{ham = f(p,z) + g(x,z,u)}. Однако, коммутирующие члены (типа @samp{x*q}->x*d/dy) разрешены. Переменная @samp{u} используется для амплитуды поля |u|, что позволяет решать нелинейные задачи -- например уравнение Шредингера @code{ham="p^2 + q^2 - u^2"}. Вы можете задавать мнимую часть для поглощения волн, например @code{ham = "p^2 + i*x*(x>0)"}, но только для линейной зависимости от переменной @samp{i} (т.е. @math{ham = hre+i*him}). @sref{PDE solving hints} diff --git a/texinfo/data_en.texi b/texinfo/data_en.texi index 585e29d..24382b5 100644 --- a/texinfo/data_en.texi +++ b/texinfo/data_en.texi @@ -6,7 +6,7 @@ This chapter describe commands for allocation, resizing, loading and saving, mod @end ifset @ifclear UDAV -This chapter describe class @code{mglData} for working with data array. This class is defined in @code{#include }. The class has functions for easy and safe allocation, resizing, loading and saving, modifying of data arrays. Also it can numerically differentiate and integrate data, interpolate, fill data by formula and so on. Class supports data with dimensions up to 3 (like function of 3 variables -- x,y,z). The internal representation of numbers is mreal. Float type was chosen because it has smaller size in memory and usually it has enough precision in plotting purposes. You can change it by selecting option @code{--enable-double} at the library configuring (see @ref{Installation}). Data arrays are denoted by Small Caps (like @sc{dat}) if it can be (re-)created by MGL commands. +This chapter describe classes @code{mglData} and @code{mglDataC} for working with data arrays of real and complex numbers. Both classes are derived from abstract class @code{mglDataA}, and can be used as arguments of any plotting functions (see @ref{MathGL core}). These classes are defined in @code{#include } and @code{#include } correspondengly. The classes have mostly the same set of functions for easy and safe allocation, resizing, loading, saving, modifying of data arrays. Also it can numerically differentiate and integrate data, interpolate, fill data by formula and so on. Classes support data with dimensions up to 3 (like function of 3 variables -- x,y,z). The internal representation of numbers is mreal (or dual=std::complex for @code{mglDataC}), which can be configured as float or double by selecting option @code{--enable-double} at the MathGL configuring (see @ref{Installation}). Float type have smaller size in memory and usually it has enough precision in plotting purposes. However, double type provide high accuracy what can be important for time-axis, for example. Data arrays are denoted by Small Caps (like @sc{dat}) if it can be (re-)created by MGL commands. @end ifclear @menu @@ -22,6 +22,7 @@ This chapter describe class @code{mglData} for working with data array. This cla * Operators:: * Global functions:: * Evaluate expression:: +* MGL variables:: @end menu @c ------------------------------------------------------------------ @@ -35,32 +36,43 @@ MGL don't support direct access to data arrays. See section @ref{Data filling} @ifclear UDAV @deftypecv {Variable} mglData @code{mreal *} a +@deftypecvx {Variable} mglDataC @code{dual *} a Data array itself. The flat data representation is used. For example, matrix [nx x ny] is presented as flat (1d-) array with length nx*ny. The element with indexes @{i, j, k@} is a[i+nx*j+nx*ny*k] (indexes are zero based). @end deftypecv -@deftypecv {Variable} mglData @code{int} nx +@deftypecv {Variable} mglData @code{long} nx +@deftypecvx {Variable} mglDataC @code{long} nx Number of points in 1st dimensions ('x' dimension). @end deftypecv -@deftypecv {Variable} mglData @code{int} ny +@deftypecv {Variable} mglData @code{long} ny +@deftypecvx {Variable} mglDataC @code{long} ny Number of points in 2nd dimensions ('y' dimension). @end deftypecv -@deftypecv {Variable} mglData @code{int} nz +@deftypecv {Variable} mglData @code{long} nz +@deftypecvx {Variable} mglDataC @code{long} nz Number of points in 3d dimensions ('z' dimension). @end deftypecv -@deftypecv {Variable} mglData @code{char *} id -Column (or slice if nz>1) names -- one character per column. +@deftypecv {Variable} mglData @code{std::string} id +@deftypecvx {Variable} mglDataC @code{std::string} id +Names of column (or slice if nz>1) -- one character per column. @end deftypecv @deftypecv {Variable} mglData @code{bool} link +@deftypecvx {Variable} mglDataC @code{bool} link Flag to use external data, i.e. don't delete it. @end deftypecv @deftypefn {Method on @code{mglData}} @code{mreal} GetVal (@code{long} i) +@deftypefnx {Method on @code{mglDataC}} @code{mreal} GetVal (@code{long} i) @deftypefnx {Method on @code{mglData}} @code{void} SetVal (@code{mreal} val, @code{long} i) +@deftypefnx {Method on @code{mglDataC}} @code{void} SetVal (@code{mreal} val, @code{long} i) Gets or sets the value in by "flat" index @var{i} without border checking. Index @var{i} should be in range [0, nx*ny*nz-1]. @end deftypefn @deftypefn {Method on @code{mglData}} @code{long} GetNx () +@deftypefnx {Method on @code{mglDataC}} @code{long} GetNx () @deftypefnx {Method on @code{mglData}} @code{long} GetNy () +@deftypefnx {Method on @code{mglDataC}} @code{long} GetNy () @deftypefnx {Method on @code{mglData}} @code{long} GetNz () +@deftypefnx {Method on @code{mglDataC}} @code{long} GetNz () @deftypefnx {C function} @code{long} mgl_data_get_nx (@code{HCDT} dat) @deftypefnx {C function} @code{long} mgl_data_get_ny (@code{HCDT} dat) @deftypefnx {C function} @code{long} mgl_data_get_nz (@code{HCDT} dat) @@ -68,11 +80,15 @@ Gets the x-, y-, z-size of the data. @end deftypefn @deftypefn {C function} @code{mreal} mgl_data_get_value (@code{HCDT} dat, @code{int} i, @code{int} j, @code{int} k) +@deftypefnx {C function} @code{dual} mgl_datac_get_value (@code{HCDT} dat, @code{int} i, @code{int} j, @code{int} k) @deftypefnx {C function} @code{mreal *} mgl_data_value (@code{HMDT} dat, @code{int} i, @code{int} j, @code{int} k) +@deftypefnx {C function} @code{dual *} mgl_datac_value (@code{HADT} dat, @code{int} i, @code{int} j, @code{int} k) @deftypefnx {C function} @code{void} mgl_data_set_value (@code{HMDT} dat, @code{mreal} v, @code{int} i, @code{int} j, @code{int} k) +@deftypefnx {C function} @code{void} mgl_datac_set_value (@code{HADT} dat, @code{dual} v, @code{int} i, @code{int} j, @code{int} k) Gets or sets the value in specified cell of the data with border checking. @end deftypefn @deftypefn {C function} @code{const mreal *} mgl_data_data (@code{HCDT} dat) +@deftypefnx {C function} @code{const dual *} mgl_datac_data (@code{HCDT} dat) Returns pointer to internal data array. @end deftypefn @end ifclear @@ -93,8 +109,11 @@ There are many functions, which can create data for output (see @ref{Data fillin @deftypefnx {MGL command} {} new @sc{dat} @code{nx ny nz} ['eq'] @ifclear UDAV @deftypefnx {Constructor on @code{mglData}} {} mglData (@code{int} mx=@code{1}, @code{int} my=@code{1}, @code{int} mz=@code{1}) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{int} mx=@code{1}, @code{int} my=@code{1}, @code{int} mz=@code{1}) @deftypefnx {C function} @code{HMDT} mgl_create_data () @deftypefnx {C function} @code{HMDT} mgl_create_data_size (@code{int} mx, @code{int} my, @code{int} mz) +@deftypefnx {C function} @code{HADT} mgl_create_datac () +@deftypefnx {C function} @code{HADT} mgl_create_datac_size (@code{int} mx, @code{int} my, @code{int} mz) @end ifclear Default constructor. Allocates the memory for data array and initializes it by zero. If string @var{eq} is specified then data will be filled by corresponding formula as in @ref{fill}. @end deftypefn @@ -103,14 +122,22 @@ Default constructor. Allocates the memory for data array and initializes it by z @deftypefn {MGL command} {} copy @sc{dat} dat2 ['eq'=''] @deftypefnx {MGL command} {} copy @sc{dat} @code{val} @ifclear UDAV -@deftypefnx {Constructor on @code{mglData}} {} mglData (@code{const mglData &}dat2) +@deftypefnx {Constructor on @code{mglData}} {} mglData (@code{const mglDataA &}dat2) @deftypefnx {Constructor on @code{mglData}} {} mglData (@code{const mglDataA *}dat2) -@deftypefnx {Constructor on @code{mglData}} {} mglData (@code{int} size, @code{const mreal *}dat2) -@deftypefnx {Constructor on @code{mglData}} {} mglData (@code{int} size, @code{int} cols, @code{const mreal *}dat2) +@deftypefnx {Constructor on @code{mglData}} {} mglData (@code{int} size, @code{const float *}dat2) +@deftypefnx {Constructor on @code{mglData}} {} mglData (@code{int} size, @code{int} cols, @code{const float *}dat2) @deftypefnx {Constructor on @code{mglData}} {} mglData (@code{int} size, @code{const double *}dat2) @deftypefnx {Constructor on @code{mglData}} {} mglData (@code{int} size, @code{int} cols, @code{const double *}dat2) @deftypefnx {Constructor on @code{mglData}} {} mglData (@code{const double *}dat2, @code{int} size) @deftypefnx {Constructor on @code{mglData}} {} mglData (@code{const double *}dat2, @code{int} size, @code{int} cols) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{const mglDataA &}dat2) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{const mglDataA *}dat2) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{int} size, @code{const float *}dat2) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{int} size, @code{int} cols, @code{const float *}dat2) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{int} size, @code{const double *}dat2) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{int} size, @code{int} cols, @code{const double *}dat2) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{int} size, @code{const dual *}dat2) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{int} size, @code{int} cols, @code{const dual *}dat2) @end ifclear Copy constructor. Allocates the memory for data array and copy values from other array. At this, if parameter @var{eq} is specified then the data will be modified by corresponding formula similarly to @ref{fill}. @end deftypefn @@ -118,7 +145,9 @@ Copy constructor. Allocates the memory for data array and copy values from other @deftypefn {MGL command} {} read @sc{dat} 'fname' @ifclear UDAV @deftypefnx {Constructor on @code{mglData}} {} mglData (@code{const char *}fname) +@deftypefnx {Constructor on @code{mglDataC}} {} mglDataC (@code{const char *}fname) @deftypefnx {C function} @code{HMDT} mgl_create_data_file (@code{const char *}fname) +@deftypefnx {C function} @code{HADT} mgl_create_datac_file (@code{const char *}fname) @end ifclear Reads data from tab-separated text file with auto determining sizes of the data. @end deftypefn @@ -127,6 +156,8 @@ Reads data from tab-separated text file with auto determining sizes of the data. @ifclear UDAV @deftypefnx {Destructor on @code{mglData}} {} ~mglData () @deftypefnx {C function} @code{void} mgl_delete_data (@code{HMDT} dat) +@deftypefnx {Destructor on @code{mglDataC}} {} ~mglDataC () +@deftypefnx {C function} @code{void} mgl_delete_datac (@code{HADT} dat) @end ifclear Deletes the instance of class mglData. @end deftypefn @@ -149,7 +180,9 @@ Deletes the instance of class mglData. @deftypefn {MGL command} {} new @sc{dat} [@code{nx=1 ny=1 nz=1}] @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Create (@code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Create (@code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}) @deftypefnx {C function} @code{void} mgl_data_create (@code{HMDT} dat, @code{int} mx, @code{int} my, @code{int} mz) +@deftypefnx {C function} @code{void} mgl_datac_create (@code{HADT} dat, @code{int} mx, @code{int} my, @code{int} mz) @end ifclear Creates or recreates the array with specified size and fills it by zero. This function does nothing if one of parameters @var{mx}, @var{my}, @var{mz} is zero or negative. @end deftypefn @@ -158,7 +191,9 @@ Creates or recreates the array with specified size and fills it by zero. This fu @deftypefn {MGL command} {} rearrange dat @code{mx [my=0 mz=0]} @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Rearrange (@code{int} mx, @code{int} my=@code{0}, @code{int} mz=@code{0}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Rearrange (@code{int} mx, @code{int} my=@code{0}, @code{int} mz=@code{0}) @deftypefnx {C function} @code{void} mgl_data_rearrange (@code{HMDT} dat, @code{int} mx, @code{int} my, @code{int} mz) +@deftypefnx {C function} @code{void} mgl_datac_rearrange (@code{HADT} dat, @code{int} mx, @code{int} my, @code{int} mz) @end ifclear Rearrange dimensions without changing data array so that resulting sizes should be @var{mx}*@var{my}*@var{mz} < nx*ny*nz. If some of parameter @var{my} or @var{mz} are zero then it will be selected to optimal fill of data array. For example, if @var{my}=0 then it will be change to @var{my}=nx*ny*nz/@var{mx} and @var{mz}=1. @end deftypefn @@ -167,7 +202,9 @@ Rearrange dimensions without changing data array so that resulting sizes should @deftypefn {MGL command} {} transpose dat ['dim'='yxz'] @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Transpose (@code{const char *}dim=@code{"yx"}) -@deftypefnx {C function} @code{void} mgl_data_transpose (@code{const char *}dim) +@deftypefnx {Method on @code{mglDataC}} @code{void} Transpose (@code{const char *}dim=@code{"yx"}) +@deftypefnx {C function} @code{void} mgl_data_transpose (@code{HMDT} dat, @code{const char *}dim) +@deftypefnx {C function} @code{void} mgl_datac_transpose (@code{HADT} dat, @code{const char *}dim) @end ifclear Transposes (shift order of) dimensions of the data. New order of dimensions is specified in string @var{dim}. This function can be useful also after reading of one-dimensional data. @end deftypefn @@ -176,7 +213,9 @@ Transposes (shift order of) dimensions of the data. New order of dimensions is s @deftypefn {MGL command} {} extend dat @code{n1 [n2=0]} @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Extend (@code{int} n1, @code{int} n2=@code{0}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Extend (@code{int} n1, @code{int} n2=@code{0}) @deftypefnx {C function} @code{void} mgl_data_extend (@code{HMDT} dat, @code{int} n1, @code{int} n2) +@deftypefnx {C function} @code{void} mgl_datac_extend (@code{HADT} dat, @code{int} n1, @code{int} n2) @end ifclear Increase the dimensions of the data by inserting new (|@var{n1}|+1)-th slices after (for @var{n1}>0) or before (for @var{n1}<0) of existed one. It is possible to insert 2 dimensions simultaneously for 1d data by using parameter @var{n2}. Data to new slices is copy from existed one. For example, for @var{n1}>0 new array will be @iftex @@ -191,7 +230,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Correspondingly, for @var{n1}<0 new arr @deftypefn {MGL command} {} squeeze dat @code{rx [ry=1 rz=1 sm=off]} @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Squeeze (@code{int} rx, @code{int} ry=@code{1}, @code{int} rz=@code{1}, @code{bool} smooth=@code{false}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Squeeze (@code{int} rx, @code{int} ry=@code{1}, @code{int} rz=@code{1}, @code{bool} smooth=@code{false}) @deftypefnx {C function} @code{void} mgl_data_squeeze (@code{HMDT} dat, @code{int} rx, @code{int} ry, @code{int} rz, @code{int} smooth) +@deftypefnx {C function} @code{void} mgl_datac_squeeze (@code{HADT} dat, @code{int} rx, @code{int} ry, @code{int} rz, @code{int} smooth) @end ifclear Reduces the data size by excluding data elements which indexes are not divisible by @var{rx}, @var{ry}, @var{rz} correspondingly. Parameter @var{smooth} set to use smoothing @iftex @@ -206,7 +247,9 @@ Reduces the data size by excluding data elements which indexes are not divisible @deftypefn {MGL command} {} crop dat @code{n1 n2} 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Crop (@code{int} n1, @code{int} n2, @code{char} dir=@code{'x'}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Crop (@code{int} n1, @code{int} n2, @code{char} dir=@code{'x'}) @deftypefnx {C function} @code{void} mgl_data_crop (@code{HMDT} dat, @code{int} n1, @code{int} n2, @code{char} dir) +@deftypefnx {C function} @code{void} mgl_datac_crop (@code{HADT} dat, @code{int} n1, @code{int} n2, @code{char} dir) @end ifclear Cuts off edges of the data @var{i}<@var{n1} and @var{i}>@var{n2} if @var{n2}>0 or @var{i}>@code{n[xyz]}-@var{n2} if @var{n2}<=0 along direction @var{dir}. @end deftypefn @@ -215,7 +258,9 @@ Cuts off edges of the data @var{i}<@var{n1} and @var{i}>@var{n2} if @var{n2}>0 o @deftypefn {MGL command} {} insert dat 'dir' @code{[pos=off num=0]} @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Insert (@code{char} dir, @code{int} pos=@code{0}, @code{int} num=@code{1}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Insert (@code{char} dir, @code{int} pos=@code{0}, @code{int} num=@code{1}) @deftypefnx {C function} @code{void} mgl_data_insert (@code{HMDT} dat, @code{char} dir, @code{int} pos, @code{char} num) +@deftypefnx {C function} @code{void} mgl_datac_insert (@code{HADT} dat, @code{char} dir, @code{int} pos, @code{char} num) @end ifclear Insert @var{num} slices along @var{dir}-direction at position @var{pos} and fill it by zeros. @end deftypefn @@ -224,7 +269,9 @@ Insert @var{num} slices along @var{dir}-direction at position @var{pos} and fill @deftypefn {MGL command} {} delete dat 'dir' @code{[pos=off num=0]} @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Delete (@code{char} dir, @code{int} pos=@code{0}, @code{int} num=@code{1}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Delete (@code{char} dir, @code{int} pos=@code{0}, @code{int} num=@code{1}) @deftypefnx {C function} @code{void} mgl_data_delete (@code{HMDT} dat, @code{char} dir, @code{int} pos, @code{char} num) +@deftypefnx {C function} @code{void} mgl_datac_delete (@code{HADT} dat, @code{char} dir, @code{int} pos, @code{char} num) @end ifclear Delete @var{num} slices along @var{dir}-direction at position @var{pos}. @end deftypefn @@ -238,6 +285,15 @@ Delete @var{num} slices along @var{dir}-direction at position @var{pos}. Sort data rows (or slices in 3D case) by values of specified column @var{idx} (or cell @{@var{idx},@var{idy}@} for 3D case). Note, this function is not thread safe! @end deftypefn +@anchor{clean} +@deftypefn {MGL command} {} clean dat @code{idx} +@ifclear UDAV +@deftypefnx {Method on @code{mglData}} @code{void} Clean (@code{lond} idx) +@deftypefnx {C function} @code{void} mgl_data_clean (@code{HMDT} dat, @code{lond} idx) +@end ifclear +Delete rows which values are equal to next row for given column @var{idx}. +@end deftypefn + @c ------------------------------------------------------------------ @external @@ -258,55 +314,86 @@ Creates new variable with name @var{dat} and fills it by data values of arrays o @end deftypefn @ifclear UDAV -@deftypefn {Method on @code{mglData}} @code{void} Set (@code{const mreal *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefn {Method on @code{mglData}} @code{void} Set (@code{const float *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) @deftypefnx {Method on @code{mglData}} @code{void} Set (@code{const double *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) -@deftypefnx {C function} @code{void} mgl_data_set_mreal (@code{HMDT} dat, @code{const mreal *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {C function} @code{void} mgl_data_set_float (@code{HMDT} dat, @code{const mreal *}A, @code{int} NX, @code{int} NY, @code{int} NZ) @deftypefnx {C function} @code{void} mgl_data_set_double (@code{HMDT} dat, @code{const double *}A, @code{int} NX, @code{int} NY, @code{int} NZ) -Allocates memory and copies the data from the @strong{flat} @code{mreal*} or @code{double*} array. +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{const float *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{const double *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{const dual *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {C function} @code{void} mgl_datac_set_float (@code{HADT} dat, @code{const mreal *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {C function} @code{void} mgl_datac_set_double (@code{HADT} dat, @code{const double *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {C function} @code{void} mgl_datac_set_complex (@code{HADT} dat, @code{const dual *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +Allocates memory and copies the data from the @strong{flat} @code{float*} or @code{double*} array. @end deftypefn -@deftypefn {Method on @code{mglData}} @code{void} Set (@code{const mreal **}A, @code{int} N1, @code{int} N2) +@deftypefn {Method on @code{mglData}} @code{void} Set (@code{const float **}A, @code{int} N1, @code{int} N2) @deftypefnx {Method on @code{mglData}} @code{void} Set (@code{const double **}A, @code{int} N1, @code{int} N2) @deftypefnx {C function} @code{void} mgl_data_set_mreal2 (@code{HMDT} dat, @code{const mreal **}A, @code{int} N1, @code{int} N2) @deftypefnx {C function} @code{void} mgl_data_set_double2 (@code{HMDT} dat, @code{const double **}A, @code{int} N1, @code{int} N2) -Allocates memory and copies the data from the @code{mreal**} or @code{double**} array with dimensions @var{N1}, @var{N2}, i.e. from array defined as @code{mreal a[N1][N2];}. +Allocates memory and copies the data from the @code{float**} or @code{double**} array with dimensions @var{N1}, @var{N2}, i.e. from array defined as @code{mreal a[N1][N2];}. @end deftypefn -@deftypefn {Method on @code{mglData}} @code{void} Set (@code{const mreal ***}A, @code{int} N1, @code{int} N2) +@deftypefn {Method on @code{mglData}} @code{void} Set (@code{const float ***}A, @code{int} N1, @code{int} N2) @deftypefnx {Method on @code{mglData}} @code{void} Set (@code{const double ***}A, @code{int} N1, @code{int} N2) @deftypefnx {C function} @code{void} mgl_data_set_mreal3 (@code{HMDT} dat, @code{const mreal ***}A, @code{int} N1, @code{int} N2) @deftypefnx {C function} @code{void} mgl_data_set_double3 (@code{HMDT} dat, @code{const double ***}A, @code{int} N1, @code{int} N2) -Allocates memory and copies the data from the @code{mreal***} or @code{double***} array with dimensions @var{N1}, @var{N2}, @var{N3}, i.e. from array defined as @code{mreal a[N1][N2][N3];}. +Allocates memory and copies the data from the @code{float***} or @code{double***} array with dimensions @var{N1}, @var{N2}, @var{N3}, i.e. from array defined as @code{mreal a[N1][N2][N3];}. @end deftypefn @deftypefn {Method on @code{mglData}} @code{void} Set (@code{gsl_vector *}v) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{gsl_vector *}v) @deftypefnx {C function} @code{void} mgl_data_set_vector (@code{HMDT} dat, @code{gsl_vector *}v) +@deftypefnx {C function} @code{void} mgl_datac_set_vector (@code{HADT} dat, @code{gsl_vector *}v) Allocates memory and copies the data from the @code{gsl_vector *} structure. @end deftypefn @deftypefn {Method on @code{mglData}} @code{void} Set (@code{gsl_matrix *}m) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{gsl_matrix *}m) @deftypefnx {C function} @code{void} mgl_data_set_matrix (@code{HMDT} dat, @code{gsl_matrix *}m) +@deftypefnx {C function} @code{void} mgl_datac_set_matrix (@code{HADT} dat, @code{gsl_matrix *}m) Allocates memory and copies the data from the @code{gsl_matrix *} structure. @end deftypefn -@deftypefn {Method on @code{mglData}} @code{void} Set (@code{const mglData &}from) + +@deftypefn {Method on @code{mglData}} @code{void} Set (@code{const mglDataA &}from) @deftypefnx {Method on @code{mglData}} @code{void} Set (@code{HCDT} from) @deftypefnx {C function} @code{void} mgl_data_set (@code{HMDT} dat, @code{HCDT} from) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{const mglDataA &}from) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{HCDT} from) +@deftypefnx {C function} @code{void} mgl_datac_set (@code{HADT} dat, @code{HCDT} from) Copies the data from @code{mglData} (or @code{mglDataA}) instance @var{from}. @end deftypefn +@deftypefn {Method on @code{mglDataC}} @code{void} Set (@code{const mglDataA &}re, @code{const mglDataA &}im) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{HCDT} re, @code{HCDT} im) +@deftypefnx {Method on @code{mglDataC}} @code{void} SetAmpl (@code{HCDT} ampl, @code{const mglDataA &}phase) +@deftypefnx {C function} @code{void} mgl_datac_set_ri (@code{HADT} dat, @code{HCDT} re, @code{HCDT} im) +@deftypefnx {C function} @code{void} mgl_datac_set_ap (@code{HADT} dat, @code{HCDT} ampl, @code{HCDT} phase) +Copies the data from @code{mglData} instances for real and imaginary parts of complex data arrays. +@end deftypefn + @deftypefn {Method on @code{mglData}} @code{void} Set (@code{const std::vector &}d) -@deftypefnx {Method on @code{mglData}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Method on @code{mglData}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{const std::vector &}d) @deftypefnx {Method on @code{mglData}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{const std::vector &}d) Allocates memory and copies the data from the @code{std::vector} array. @end deftypefn @deftypefn {Method on @code{mglData}} @code{void} Set (@code{const char *}str, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) @deftypefnx {C function} @code{void} mgl_data_set_values (@code{const char *}str, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {Method on @code{mglDataC}} @code{void} Set (@code{const char *}str, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {C function} @code{void} mgl_datac_set_values (@code{const char *}str, @code{int} NX, @code{int} NY, @code{int} NZ) Allocates memory and scanf the data from the string. @end deftypefn -@deftypefn {Method on @code{mglData}} @code{void} Link (@code{const mglData &}from) -@deftypefnx {Method on @code{mglData}} @code{void} Link (@code{const mreal *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) -@deftypefnx {C function} @code{void} mgl_data_link (@code{HMDT} dat, @code{const mreal *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefn {Method on @code{mglData}} @code{void} Link (@code{mglData &}from) +@deftypefnx {Method on @code{mglData}} @code{void} Link (@code{mreal *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {C function} @code{void} mgl_data_link (@code{HMDT} dat, @code{mreal *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {Method on @code{mglDataC}} @code{void} Link (@code{mglDataC &}from) +@deftypefnx {Method on @code{mglDataC}} @code{void} Link (@code{dual *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {C function} @code{void} mgl_datac_link (@code{HADT} dat, @code{dual *}A, @code{int} NX, @code{int} NY, @code{int} NZ) Links external data array, i.e. don't delete this array at exit. @end deftypefn @end ifclear @@ -320,7 +407,9 @@ Creates new variable with name @var{dat} for one-dimensional array of size @var{ @deftypefn {MGL command} {} fill dat v1 v2 ['dir'='x'] @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Fill (@code{mreal} v1, @code{mreal} v2, @code{char} dir=@code{'x'}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Fill (@code{dual} v1, @code{dual} v2, @code{char} dir=@code{'x'}) @deftypefnx {C function} @code{void} mgl_data_fill (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{char} dir) +@deftypefnx {C function} @code{void} mgl_datac_fill (@code{HADT} dat, @code{dual} v1, @code{dual} v2, @code{char} dir) @end ifclear Equidistantly fills the data values to range [@var{v1}, @var{v2}] in direction @var{dir}=@{@samp{x},@samp{y},@samp{z}@}. @end deftypefn @@ -330,9 +419,13 @@ Equidistantly fills the data values to range [@var{v1}, @var{v2}] in direction @ @deftypefnx {MGL command} {} fill dat 'eq' vdat wdat @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglData &}vdat, @code{const char *}opt=@code{""}) -@deftypefnx {Method on @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglData &}vdat, @code{const mglData &}wdat, @code{const char *}opt=@code{""}) -@deftypefnx {C function} @code{void} mgl_data_fill_eq (@code{HMGL} gr, @code{HMDT} dat, @code{const char *}eq, @code{const HMDT *}vdat, @code{const HMDT *}wdat, @code{const char *}opt) +@deftypefnx {Method on @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglDataA &}vdat, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglDataA &}vdat, @code{const mglDataA &}wdat, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglDataA &}vdat, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglDataA &}vdat, @code{const mglDataA &}wdat, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_data_fill_eq (@code{HMGL} gr, @code{HMDT} dat, @code{const char *}eq, @code{HCDT} vdat, @code{HCDT} wdat, @code{const char *}opt) +@deftypefnx {C function} @code{void} mgl_datac_fill_eq (@code{HMGL} gr, @code{HADT} dat, @code{const char *}eq, @code{HCDT} vdat, @code{HCDT} wdat, @code{const char *}opt) @end ifclear Fills the value of array according to the formula in string @var{eq}. Formula is an arbitrary expression depending on variables @samp{x}, @samp{y}, @samp{z}, @samp{u}, @samp{v}, @samp{w}. Coordinates @samp{x}, @samp{y}, @samp{z} are supposed to be normalized in axis range of canvas @var{gr} (in difference from @code{Modify} functions). Variable @samp{u} is the original value of the array. Variables @samp{v} and @samp{w} are values of @var{vdat}, @var{wdat} which can be @code{NULL} (i.e. can be omitted). @end deftypefn @@ -343,10 +436,15 @@ Fills the value of array according to the formula in string @var{eq}. Formula is @deftypefnx {MGL command} {} modify dat 'eq' vdat wdat @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{int} dim=@code{0}) -@deftypefnx {Method on @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{const mglData &}v) -@deftypefnx {Method on @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{const mglData &}v, @code{const mglData &}w) +@deftypefnx {Method on @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{const mglDataA &}v) +@deftypefnx {Method on @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{const mglDataA &}v, @code{const mglDataA &}w) +@deftypefnx {Method on @code{mglDataC}} @code{void} Modify (@code{const char *}eq, @code{int} dim=@code{0}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Modify (@code{const char *}eq, @code{const mglDataA &}v) +@deftypefnx {Method on @code{mglDataC}} @code{void} Modify (@code{const char *}eq, @code{const mglDataA &}v, @code{const mglDataA &}w) @deftypefnx {C function} @code{void} mgl_data_modify (@code{HMDT} dat, @code{const char *}eq, @code{int} dim) @deftypefnx {C function} @code{void} mgl_data_modify_vw (@code{HMDT} dat, @code{const char *}eq, @code{HCDT} v, @code{HCDT} w) +@deftypefnx {C function} @code{void} mgl_datac_modify (@code{HADT} dat, @code{const char *}eq, @code{int} dim) +@deftypefnx {C function} @code{void} mgl_datac_modify_vw (@code{HADT} dat, @code{const char *}eq, @code{HCDT} v, @code{HCDT} w) @end ifclear The same as previous ones but coordinates @samp{x}, @samp{y}, @samp{z} are supposed to be normalized in range [0,1]. If @var{dim}>0 is specified then modification will be fulfilled only for slices >=@var{dim}. @end deftypefn @@ -364,7 +462,7 @@ Fills data by 'x' or 'k' samples for Hankel ('h') or Fourier ('f') transform. @anchor{datagrid} @deftypefn {MGL command} {} datagrid dat xdat ydat zdat @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{mglData} Grid (@code{HMGL} gr, @code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglData}} @code{mglData} Grid (@code{HMGL} gr, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_data_grid (@code{HMGL} gr, @code{HMDT} u, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}opt) @end ifclear Fills the value of array according to the linear interpolation of triangulated surface, found for arbitrary placed points @samp{x}, @samp{y}, @samp{z}. NAN value is used for grid points placed outside of triangulated surface. @@ -382,7 +480,7 @@ Sets value(s) of array a[@var{i}, @var{j}, @var{k}] = @var{val}. Negative indexe @deftypefn {MGL command} {} put dat vdat [@code{i=: j=: k=:}] @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} Put (@code{const mglData &}v, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1}) +@deftypefnx {Method on @code{mglData}} @code{void} Put (@code{const mglDataA &}v, @code{int} i=@code{-1}, @code{int} j=@code{-1}, @code{int} k=@code{-1}) @deftypefnx mglData @code{void} mgl_data_put_dat (@code{HMDT} a, @code{HCDT} v, @code{int} i, @code{int} j, @code{int} k) @end ifclear Copies value(s) from array @var{v} to the range of original array. Negative indexes @var{i}, @var{j}, @var{k}=-1 set the range in corresponding direction(s). At this minor dimensions of array @var{v} should be large than corresponding dimensions of this array. For example, @code{Put(v,-1,0,-1);} sets a[i,0,j]=v.ny>nz ? v[i,j] : v[i], where i=0...(nx-1), j=0...(nz-1) and condition v.nx>=nx is true. @@ -392,7 +490,9 @@ Copies value(s) from array @var{v} to the range of original array. Negative inde @deftypefn {MGL command} {} idset dat 'ids' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} SetColumnId (@code{const char *}ids) -@deftypefnx mglData @code{void} mgl_data_set_id (@code{const char *}ids) +@deftypefnx mglData @code{void} mgl_data_set_id (@code{HMDT} a, @code{const char *}ids) +@deftypefnx {Method on @code{mglDataC}} @code{void} SetColumnId (@code{const char *}ids) +@deftypefnx mglData @code{void} mgl_datac_set_id (@code{HADT} a, @code{const char *}ids) @end ifclear Sets the symbol @var{ids} for data columns. The string should contain one symbol 'a'...'z' per column. These ids are used in @ref{column}. @end deftypefn @@ -415,16 +515,20 @@ Sets the symbol @var{ids} for data columns. The string should contain one symbol @anchor{read} @deftypefn {MGL command} {} read @sc{dat} 'fname' @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} Read (@code{const char *}fname) -@deftypefnx {C function} @code{void} mgl_data_read (@code{HMDT} dat, @code{const char *}fname) +@deftypefnx {Method on @code{mglData}} @code{bool} Read (@code{const char *}fname) +@deftypefnx {Method on @code{mglDataC}} @code{bool} Read (@code{const char *}fname) +@deftypefnx {C function} @code{int} mgl_data_read (@code{HMDT} dat, @code{const char *}fname) +@deftypefnx {C function} @code{int} mgl_datac_read (@code{HADT} dat, @code{const char *}fname) @end ifclear Reads data from tab-separated text file with auto determining sizes of the data. Double newline means the beginning of new z-slice. @end deftypefn @deftypefn {MGL command} {} read @sc{dat} 'fname' @code{mx [my=1 mz=1]} @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} Read (@code{const char *}fname, @code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}) -@deftypefnx {C function} @code{void} mgl_data_read_dim (@code{HMDT} dat, @code{const char *}fname, @code{int} mx, @code{int} my, @code{int} mz) +@deftypefnx {Method on @code{mglData}} @code{bool} Read (@code{const char *}fname, @code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}) +@deftypefnx {Method on @code{mglDataC}} @code{bool} Read (@code{const char *}fname, @code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}) +@deftypefnx {C function} @code{int} mgl_data_read_dim (@code{HMDT} dat, @code{const char *}fname, @code{int} mx, @code{int} my, @code{int} mz) +@deftypefnx {C function} @code{int} mgl_datac_read_dim (@code{HADT} dat, @code{const char *}fname, @code{int} mx, @code{int} my, @code{int} mz) @end ifclear Reads data from text file with specified data sizes. This function does nothing if one of parameters @var{mx}, @var{my} or @var{mz} is zero or negative. @end deftypefn @@ -432,8 +536,10 @@ Reads data from text file with specified data sizes. This function does nothing @anchor{readmat} @deftypefn {MGL command} {} readmat @sc{dat} 'fname' [@code{dim=2}] @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} ReadMat (@code{const char *}fname, @code{int} dim=@code{2}) -@deftypefnx {C function} @code{void} mgl_data_read_mat (@code{HMDT} dat, @code{const char *}fname, @code{int} dim) +@deftypefnx {Method on @code{mglData}} @code{bool} ReadMat (@code{const char *}fname, @code{int} dim=@code{2}) +@deftypefnx {Method on @code{mglDataC}} @code{bool} ReadMat (@code{const char *}fname, @code{int} dim=@code{2}) +@deftypefnx {C function} @code{int} mgl_data_read_mat (@code{HMDT} dat, @code{const char *}fname, @code{int} dim) +@deftypefnx {C function} @code{int} mgl_datac_read_mat (@code{HADT} dat, @code{const char *}fname, @code{int} dim) @end ifclear Read data from text file with size specified at beginning of the file by first @var{dim} numbers. At this, variable @var{dim} set data dimensions. @end deftypefn @@ -441,7 +547,10 @@ Read data from text file with size specified at beginning of the file by first @ @anchor{readall} @deftypefn {MGL command} {} readall @sc{dat} 'templ' @code{v1 v2 [dv=1 slice=off]} @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} ReadRange (@code{const char *}templ, @code{mreal} from, @code{mreal} to, @code{mreal} step=@code{1.f}, @code{bool} as_slice=@code{false}) +@deftypefnx {Method on @code{mglData}} @code{void} ReadRange (@code{const char *}templ, @code{mreal} from, @code{mreal} to, @code{mreal} step=@code{1}, @code{bool} as_slice=@code{false}) +@deftypefnx {Method on @code{mglDataC}} @code{void} ReadRange (@code{const char *}templ, @code{mreal} from, @code{mreal} to, @code{mreal} step=@code{1}, @code{bool} as_slice=@code{false}) +@deftypefnx {C function} @code{int} mgl_data_read_range (@code{HMDT} dat, @code{const char *}templ, @code{mreal} from, @code{mreal} to, @code{mreal} step, @code{int} as_slice) +@deftypefnx {C function} @code{int} mgl_datac_read_range (@code{HADT} dat, @code{const char *}templ, @code{mreal} from, @code{mreal} to, @code{mreal} step, @code{int} as_slice) @end ifclear Join data arrays from several text files. The file names are determined by function call @code{sprintf(fname,templ,val);}, where @var{val} changes from @var{from} to @var{to} with step @var{step}. The data load one-by-one in the same slice if @var{as_slice}=@code{false} or as slice-by-slice if @var{as_slice}=@code{true}. @end deftypefn @@ -449,6 +558,9 @@ Join data arrays from several text files. The file names are determined by funct @deftypefn {MGL command} {} readall @sc{dat} 'templ' @code{[slice=off]} @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} ReadAll (@code{const char *}templ, @code{bool} as_slice=@code{false}) +@deftypefnx {Method on @code{mglDataC}} @code{void} ReadAll (@code{const char *}templ, @code{bool} as_slice=@code{false}) +@deftypefnx {C function} @code{int} mgl_data_read_all (@code{HMDT} dat, @code{const char *}templ, @code{int} as_slice) +@deftypefnx {C function} @code{int} mgl_datac_read_all (@code{HADT} dat, @code{const char *}templ, @code{int} as_slice) @end ifclear Join data arrays from several text files which filenames satisfied the template @var{templ} (for example, @var{templ}=@code{"t_*.dat"}). The data load one-by-one in the same slice if @var{as_slice}=@code{false} or as slice-by-slice if @var{as_slice}=@code{true}. @end deftypefn @@ -457,7 +569,9 @@ Join data arrays from several text files which filenames satisfied the template @deftypefn {MGL command} {} save dat 'fname' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} @deftypefnx {C function} @code{void} mgl_data_save (@code{HCDT} dat, @code{const char *}fname, @code{int} ns) +@deftypefnx {C function} @code{void} mgl_datac_save (@code{HCDT} dat, @code{const char *}fname, @code{int} ns) @end ifclear Saves the whole data array (for @var{ns}=@code{-1}) or only @var{ns}-th slice to text file. @end deftypefn @@ -466,7 +580,9 @@ Saves the whole data array (for @var{ns}=@code{-1}) or only @var{ns}-th slice to @deftypefn {MGL command} {} readhdf @sc{dat} 'fname' 'dname' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} ReadHDF (@code{const char *}fname, @code{const char *}dname) +@deftypefnx {Method on @code{mglDataC}} @code{void} ReadHDF (@code{const char *}fname, @code{const char *}dname) @deftypefnx {C function} @code{void} mgl_data_read_hdf (@code{HMDT} dat, @code{const char *}fname, @code{const char *}dname) +@deftypefnx {C function} @code{void} mgl_datac_read_hdf (@code{HADT} dat, @code{const char *}fname, @code{const char *}dname) @end ifclear Reads data array named @var{dname} from HDF5 or HDF4 file. This function does nothing if HDF5|HDF4 was disabled during library compilation. @end deftypefn @@ -475,7 +591,9 @@ Reads data array named @var{dname} from HDF5 or HDF4 file. This function does no @deftypefn {MGL command} {} savehdf dat 'fname' 'dname' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} @deftypefnx {C function} @code{void} mgl_data_save_hdf (@code{HCDT} dat, @code{const char *}fname, @code{const char *}dname, @code{int} rewrite) +@deftypefnx {C function} @code{void} mgl_datac_save_hdf (@code{HCDT} dat, @code{const char *}fname, @code{const char *}dname, @code{int} rewrite) @end ifclear Saves data array named @var{dname} to HDF5 file. This function does nothing if HDF5 was disabled during library compilation. @end deftypefn @@ -483,8 +601,9 @@ Saves data array named @var{dname} to HDF5 file. This function does nothing if H @anchor{datas} @deftypefn {MGL command} {} datas 'fname' @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{const} -@deftypefnx {C function} @code{void} mgl_datas_hdf (@code{const char *}fname, @code{char *}buf, @code{long} size) +@deftypefnx {Method on @code{mglData}} @code{int} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} +@deftypefnx {Method on @code{mglDataC}} @code{int} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} +@deftypefnx {C function} @code{int} mgl_datas_hdf (@code{const char *}fname, @code{char *}buf, @code{long} size) @end ifclear Put data names from HDF5 file @var{fname} into @var{buf} as '\t' separated fields. In MGL version the list of data names will be printed as message. This function does nothing if HDF5 was disabled during library compilation. @end deftypefn @@ -527,6 +646,7 @@ Saves data matrix (or @code{ns}-th slice for 3d data) to bitmap file (now suppor @deftypefn {MGL command} {} subdata @sc{res} dat @code{xx [yy=: zz=:]} @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} SubData (@code{mreal} xx, @code{mreal} yy=@code{-1}, @code{mreal} zz=@code{-1}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} SubData (@code{mreal} xx, @code{mreal} yy=@code{-1}, @code{mreal} zz=@code{-1}) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_subdata (@code{HCDT} dat, @code{mreal} xx, @code{mreal} yy, @code{mreal} zz) @end ifclear Extracts sub-array data from the original data array keeping fixed positive index. For example @code{SubData(-1,2)} extracts 3d row (indexes are zero based), @code{SubData(4,-1)} extracts 5th column, @code{SubData(-1,-1,3)} extracts 4th slice and so on. If argument(s) are non-integer then linear interpolation between slices is used. In MGL version this command usually is used as inline one @code{dat(xx,yy,zz)}. @@ -534,7 +654,8 @@ Extracts sub-array data from the original data array keeping fixed positive inde @deftypefn {MGL command} {} subdata @sc{res} dat xdat [ydat=: zdat=:] @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{mglData} SubData (@code{const mglData &}xx, @code{const mglData &}yy, @code{const mglData &}zz) @code{const} +@deftypefnx {Method on @code{mglData}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_subdata_ext (@code{HCDT} dat, @code{HCDT} xx, @code{HCDT} yy, @code{HCDT} zz) @end ifclear Extracts sub-array data from the original data array for indexes specified by arrays @var{xx}, @var{yy}, @var{zz} (indirect access). This function work like previous one for 1D arguments or numbers, and resulting array dimensions are equal dimensions of 1D arrays for corresponding direction. For 2D and 3D arrays in arguments, the resulting array have the same dimensions as input arrays. The dimensions of all argument must be the same (or to be scalar 1*1*1) if they are 2D or 3D arrays. In MGL version this command usually is used as inline one @code{dat(xx,yy,zz)}. @@ -544,6 +665,7 @@ Extracts sub-array data from the original data array for indexes specified by ar @deftypefn {MGL command} {} column @sc{res} dat 'eq' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} Column (@code{const char *}eq) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Column (@code{const char *}eq) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_column (@code{HCDT} dat, @code{const char *}eq) @end ifclear Get column (or slice) of the data filled by formula @var{eq} on column ids. For example, @code{Column("n*w^2/exp(t)");}. The column ids must be defined first by @ref{idset} function or read from files. In MGL version this command usually is used as inline one @code{dat('eq')}. @@ -553,6 +675,7 @@ Get column (or slice) of the data filled by formula @var{eq} on column ids. For @deftypefn {MGL command} {} resize @sc{res} dat @code{mx [my=1 mz=1]} @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} Resize (@code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}, @code{mreal} x1=@code{0}, @code{mreal} x2=@code{1}, @code{mreal} y1=@code{0}, @code{mreal} y2=@code{1}, @code{mreal} z1=@code{0}, @code{mreal} z2=@code{1}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Resize (@code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}, @code{mreal} x1=@code{0}, @code{mreal} x2=@code{1}, @code{mreal} y1=@code{0}, @code{mreal} y2=@code{1}, @code{mreal} z1=@code{0}, @code{mreal} z2=@code{1}) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_resize (@code{HCDT} dat, @code{int} mx, @code{int} my, @code{int} mz) @deftypefnx {C function} @code{HMDT} mgl_data_resize_box (@code{HCDT} dat, @code{int} mx, @code{int} my, @code{int} mz, @code{mreal} x1, @code{mreal} x2, @code{mreal} y1, @code{mreal} y2, @code{mreal} z1, @code{mreal} z2) @end ifclear @@ -564,20 +687,36 @@ Resizes the data to new size @var{mx}, @var{my}, @var{mz} from box (part) [@var{ @deftypefnx {MGL command} {} evaluate @sc{res} dat idat jdat [@code{norm=on}] @deftypefnx {MGL command} {} evaluate @sc{res} dat idat jdat kdat [@code{norm=on}] @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{mglData} Evaluate (@code{const mglData &}idat, @code{bool} norm=@code{true}) @code{const} -@deftypefnx {Method on @code{mglData}} @code{mglData} Evaluate (@code{const mglData &}idat, @code{const mglData &}jdat, @code{bool} norm=@code{true}) @code{const} -@deftypefnx {Method on @code{mglData}} @code{mglData} Evaluate (@code{const mglData &}idat, @code{const mglData &}jdat, @code{const mglData &}kdat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Method on @code{mglData}} @code{mglData} Evaluate (@code{const mglDataA &}idat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Method on @code{mglData}} @code{mglData} Evaluate (@code{const mglDataA &}idat, @code{const mglDataA &}jdat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Method on @code{mglData}} @code{mglData} Evaluate (@code{const mglDataA &}idat, @code{const mglDataA &}jdat, @code{const mglDataA &}kdat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Evaluate (@code{const mglDataA &}idat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Evaluate (@code{const mglDataA &}idat, @code{const mglDataA &}jdat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Evaluate (@code{const mglDataA &}idat, @code{const mglDataA &}jdat, @code{const mglDataA &}kdat, @code{bool} norm=@code{true}) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_evaluate (@code{HCDT} dat, @code{HCDT} idat, @code{HCDT} jdat, @code{HCDT} kdat, @code{int} norm) @end ifclear Gets array which values is result of interpolation of original array for coordinates from other arrays. All dimensions must be the same for data @var{idat}, @var{jdat}, @var{kdat}. Coordinates from @var{idat}, @var{jdat}, @var{kdat} are supposed to be normalized in range [0,1] (if @var{norm}=@code{true}) or in ranges [0,nx], [0,ny], [0,nz] correspondingly. @end deftypefn +@anchor{solve} +@deftypefn {MGL command} {} solve @sc{res} dat @code{val} 'dir' [@code{norm=on}] +@deftypefnx {MGL command} {} solve @sc{res} dat @code{val} 'dir' idat [@code{norm=on}] +@ifclear UDAV +@deftypefnx {Method on @code{mglData}} @code{mglData} Solve (@code{mreal} val, @code{char} dir, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Method on @code{mglData}} @code{mglData} Solve (@code{mreal} val, @code{char} dir, @code{const mglDataA &}idat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {C function} @code{HMDT} mgl_data_solve (@code{HCDT} dat, @code{mreal} val, @code{char} dir, @code{HCDT} idat, @code{int} norm) +@end ifclear +Gets array which values is indexes (roots) along given direction @var{dir}, where interpolated values of data @var{dat} are equal to @var{val}. Output data will have the sizes of @var{dat} in directions transverse to @var{dir}. If data @var{idat} is provided then its values are used as starting points. This allows to find several branches by consequentive calls. Indexes are supposed to be normalized in range [0,1] (if @var{norm}=@code{true}) or in ranges [0,nx], [0,ny], [0,nz] correspondingly. @sref{Solve sample} +@end deftypefn + @anchor{hist} @deftypefn {MGL command} {} hist @sc{res} dat @code{num v1 v2 [nsub=0]} @deftypefnx {MGL command} {} hist @sc{res} dat wdat @code{num v1 v2 [nsub=0]} @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} Hist (@code{int} n, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{int} nsub=@code{0}) @code{const} -@deftypefnx {Method on @code{mglData}} @code{mglData} Hist (@code{const mglData &}w, @code{int} n, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{int} nsub=@code{0}) @code{const} +@deftypefnx {Method on @code{mglData}} @code{mglData} Hist (@code{const mglDataA &}w, @code{int} n, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{int} nsub=@code{0}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Hist (@code{int} n, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{int} nsub=@code{0}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Hist (@code{const mglDataA &}w, @code{int} n, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{int} nsub=@code{0}) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_hist (@code{HCDT} dat, @code{int} n, @code{mreal} v1, @code{mreal} v2, @code{int} nsub) @deftypefnx {C function} @code{HMDT} mgl_data_hist_w (@code{HCDT} dat, @code{HCDT} w, @code{int} n, @code{mreal} v1, @code{mreal} v2, @code{int} nsub) @end ifclear @@ -588,6 +727,7 @@ Creates @var{n}-th points distribution of the data values in range [@var{v1}, @v @deftypefn {MGL command} {} momentum @sc{res} dat 'how' ['dir'='z'] @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} Momentum (@code{char} dir, @code{const char *}how) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Momentum (@code{char} dir, @code{const char *}how) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_momentum (@code{HCDT} dat, @code{char} dir, @code{const char *}how) @end ifclear Gets momentum (1d-array) of the data along direction @var{dir}. String @var{how} contain kind of momentum. The momentum is defined like as @@ -604,6 +744,7 @@ if @var{dir}=@samp{z} and so on. Coordinates @samp{x}, @samp{y}, @samp{z} are da @deftypefn {MGL command} {} sum @sc{res} dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} Sum (@code{const char *}dir) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Sum (@code{const char *}dir) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_sum (@code{HCDT} dat, @code{const char *}dir) @end ifclear Gets array which is the result of summation in given direction or direction(s). @@ -613,6 +754,7 @@ Gets array which is the result of summation in given direction or direction(s). @deftypefn {MGL command} {} max @sc{res} dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} Max (@code{const char *}dir) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Max (@code{const char *}dir) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_max_dir (@code{HCDT} dat, @code{const char *}dir) @end ifclear Gets array which is the maximal data values in given direction or direction(s). @@ -622,6 +764,7 @@ Gets array which is the maximal data values in given direction or direction(s). @deftypefn {MGL command} {} min @sc{res} dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} Min (@code{const char *}dir) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Min (@code{const char *}dir) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_min_dir (@code{HCDT} dat, @code{const char *}dir) @end ifclear Gets array which is the maximal data values in given direction or direction(s). @@ -630,7 +773,8 @@ Gets array which is the maximal data values in given direction or direction(s). @anchor{combine} @deftypefn {MGL command} {} combine @sc{res} adat bdat @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{mglData} Combine (@code{const mglData &}a) @code{const} +@deftypefnx {Method on @code{mglData}} @code{mglData} Combine (@code{const mglDataA &}a) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Combine (@code{const mglDataA &}a) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_combine (@code{HCDT} dat, @code{HCDT} a) @end ifclear Returns direct multiplication of arrays (like, res[i,j] = this[i]*a[j] and so on). @@ -640,10 +784,31 @@ Returns direct multiplication of arrays (like, res[i,j] = this[i]*a[j] and so on @deftypefn {MGL command} {} trace @sc{res} dat @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} Trace () @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} Trace () @code{const} +@deftypefnx {C function} @code{HMDT} mgl_data_trace (@code{HCDT} dat) @end ifclear Gets array of diagonal elements a[i,i] (for 2D case) or a[i,i,i] (for 3D case) where i=0...nx-1. Function return copy of itself for 1D case. Data array must have dimensions ny,nz >= nx or ny,nz = 1. @end deftypefn +@ifclear UDAV +@deftypefn {Method on @code{mglDataC}} @code{mglData} Real () @code{const} +@deftypefnx {C function} @code{HMDT} mgl_datac_real (@code{HCDT} dat) +Gets array of real parts of the data. +@end deftypefn +@deftypefn {Method on @code{mglDataC}} @code{mglData} Imag () @code{const} +@deftypefnx {C function} @code{HMDT} mgl_datac_imag (@code{HCDT} dat) +Gets array of imaginary parts of the data. +@end deftypefn +@deftypefn {Method on @code{mglDataC}} @code{mglData} Abs () @code{const} +@deftypefnx {C function} @code{HMDT} mgl_datac_abs (@code{HCDT} dat) +Gets array of absolute values of the data. +@end deftypefn +@deftypefn {Method on @code{mglDataC}} @code{mglData} Arg () @code{const} +@deftypefnx {C function} @code{HMDT} mgl_datac_arg (@code{HCDT} dat) +Gets array of arguments of the data. +@end deftypefn +@end ifclear + @c ------------------------------------------------------------------ @external @node Data changing, Interpolation, Make another data, Data processing @@ -670,7 +835,9 @@ These functions change the data in some direction like differentiations, integra @deftypefn {MGL command} {} cumsum dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} CumSum (@code{const char *}dir) +@deftypefnx {Method on @code{mglDataC}} @code{void} CumSum (@code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_cumsum (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {C function} @code{void} mgl_datac_cumsum (@code{HADT} dat, @code{const char *}dir) @end ifclear Cumulative summation of the data in given direction or directions. @end deftypefn @@ -679,7 +846,9 @@ Cumulative summation of the data in given direction or directions. @deftypefn {MGL command} {} integrate dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Integral (@code{const char *}dir) +@deftypefnx {Method on @code{mglDataC}} @code{void} Integral (@code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_integral (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {C function} @code{void} mgl_datac_integral (@code{HADT} dat, @code{const char *}dir) @end ifclear Integrates (like cumulative summation) the data in given direction or directions. @end deftypefn @@ -688,15 +857,17 @@ Integrates (like cumulative summation) the data in given direction or directions @deftypefn {MGL command} {} diff dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Diff (@code{const char *}dir) +@deftypefnx {Method on @code{mglDataC}} @code{void} Diff (@code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_diff (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {C function} @code{void} mgl_datac_diff (@code{HADT} dat, @code{const char *}dir) @end ifclear Differentiates the data in given direction or directions. @end deftypefn @deftypefn {MGL command} {} diff dat xdat ydat [zdat=0] @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} Diff (@code{const mglData &}x, @code{const mglData &}y) -@deftypefnx {Method on @code{mglData}} @code{void} Diff (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z) +@deftypefnx {Method on @code{mglData}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y) +@deftypefnx {Method on @code{mglData}} @code{void} Diff (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z) @deftypefnx {C function} @code{void} mgl_data_diff_par (@code{HMDT} dat, @code{HCDT} x, @code{HCDT}y, @code{HCDT}z) @end ifclear Differentiates the data specified parametrically in direction @var{x} with @var{y}, @var{z}=constant. Parametrical differentiation uses the formula (for 2D case): @math{da/dx = (a_j*y_i-a_i*y_j)/(x_j*y_i-x_i*y_j)} where @math{a_i=da/di, a_j=da/dj} denotes usual differentiation along 1st and 2nd dimensions. The similar formula is used for 3D case. Note, that you may change the order of arguments -- for example, if you have 2D data a(i,j) which depend on coordinates @{x(i,j), y(i,j)@} then usual derivative along @samp{x} will be @code{Diff(x,y);} and usual derivative along @samp{y} will be @code{Diff(y,x);}. @@ -706,7 +877,9 @@ Differentiates the data specified parametrically in direction @var{x} with @var{ @deftypefn {MGL command} {} diff2 dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Diff2 (@code{const char *}dir) -@deftypefnx {C function} @code{void} mgl_data_diff2 (@code{const char *}dir) +@deftypefnx {Method on @code{mglDataC}} @code{void} Diff2 (@code{const char *}dir) +@deftypefnx {C function} @code{void} mgl_data_diff2 (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {C function} @code{void} mgl_datac_diff2 (@code{HADT} dat, @code{const char *}dir) @end ifclear Double-differentiates (like Laplace operator) the data in given direction. @end deftypefn @@ -717,7 +890,7 @@ Double-differentiates (like Laplace operator) the data in given direction. @deftypefnx {Method on @code{mglData}} @code{void} SinFFT (@code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_sinfft (@code{HMDT} dat, @code{const char *}dir) @end ifclear -Do Sine transform of the data in given direction or directions. The Sine transform is @math{\sum a_i \sin(k i)}. +Do Sine transform of the data in given direction or directions. The Sine transform is @math{\sum a_j \sin(k j)}. @end deftypefn @anchor{cosfft} @@ -726,23 +899,34 @@ Do Sine transform of the data in given direction or directions. The Sine transfo @deftypefnx {Method on @code{mglData}} @code{void} CosFFT (@code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_cosfft (@code{HMDT} dat, @code{const char *}dir) @end ifclear -Do Cosine transform of the data in given direction or directions. The Cosine transform is @math{\sum a_i \cos(k i)}. +Do Cosine transform of the data in given direction or directions. The Cosine transform is @math{\sum a_j \cos(k j)}. +@end deftypefn + +@ifclear UDAV +@deftypefn {Method on @code{mglDataC}} @code{void} FFT (@code{const char *}dir) +@deftypefnx {C function} @code{void} mgl_datac_fft (@code{HADT} dat, @code{const char *}dir) +Do Fourier transform of the data in given direction or directions. If @var{dir} contain @samp{i} then inverse Fourier is used. The Fourier transform is @math{\sum a_j \exp(i k j)}. @end deftypefn +@end ifclear @anchor{hankel} @deftypefn {MGL command} {} hankel dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Hankel (@code{const char *}dir) +@deftypefnx {Method on @code{mglDataC}} @code{void} Hankel (@code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_hankel (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {C function} @code{void} mgl_datac_hankel (@code{HADT} dat, @code{const char *}dir) @end ifclear -Do Hankel transform of the data in given direction or directions. The Hankel transform is @math{\sum a_i J_0(k i)}. +Do Hankel transform of the data in given direction or directions. The Hankel transform is @math{\sum a_j J_0(k j)}. @end deftypefn @anchor{swap} @deftypefn {MGL command} {} swap dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Swap (@code{const char *}dir) +@deftypefnx {Method on @code{mglDataC}} @code{void} Swap (@code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_swap (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {C function} @code{void} mgl_datac_swap (@code{HADT} dat, @code{const char *}dir) @end ifclear Swaps the left and right part of the data in given direction (useful for Fourier spectrum). @end deftypefn @@ -751,7 +935,9 @@ Swaps the left and right part of the data in given direction (useful for Fourier @deftypefn {MGL command} {} roll dat 'dir' num @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Roll (@code{char} dir, @code{num}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Roll (@code{char} dir, @code{num}) @deftypefnx {C function} @code{void} mgl_data_roll (@code{HMDT} dat, @code{char} dir, @code{num}) +@deftypefnx {C function} @code{void} mgl_datac_roll (@code{HADT} dat, @code{char} dir, @code{num}) @end ifclear Rolls the data along direction @var{dir}. Resulting array will be out[i] = ini[(i+@var{num})%nx] if @code{dir='x'}. @end deftypefn @@ -760,7 +946,9 @@ Rolls the data along direction @var{dir}. Resulting array will be out[i] = ini[( @deftypefn {MGL command} {} mirror dat 'dir' @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Mirror (@code{const char *}dir) +@deftypefnx {Method on @code{mglDataC}} @code{void} Mirror (@code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_mirror (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {C function} @code{void} mgl_datac_mirror (@code{HADT} dat, @code{const char *}dir) @end ifclear Mirror the left-to-right part of the data in given direction. Looks like change the value index @var{i}->@var{n-i}. Note, that the similar effect in graphics you can reach by using options (@pxref{Command options}), for example, @code{surf dat; xrange 1 -1}. @end deftypefn @@ -778,7 +966,9 @@ Remove value steps (like phase jumps after inverse trigonometric functions) with @deftypefn {MGL command} {} smooth data @code{type} ['dir'='xyz'] @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Smooth (@code{const char *}dir=@code{"xyz"}, @code{mreal} delta=@code{0}) +@deftypefnx {Method on @code{mglDataC}} @code{void} Smooth (@code{const char *}dir=@code{"xyz"}, @code{mreal} delta=@code{0}) @deftypefnx {C function} @code{void} mgl_data_smooth (@code{HMDT} dat, @code{const char *}dir, @code{mreal} delta) +@deftypefnx {C function} @code{void} mgl_datac_smooth (@code{HADT} dat, @code{const char *}dir, @code{mreal} delta) @end ifclear Smooths the data on specified direction or directions. String @var{dirs} specifies the dimensions which will be smoothed. It may contain characters: @samp{x} for 1st dimension, @samp{y} for 2nd dimension, @samp{z} for 3d dimension. If string @var{dir} contain: @samp{0} then does nothing, @samp{3} -- linear averaging over 3 points, @samp{5} -- linear averaging over 5 points. By default quadratic averaging over 5 points is used. @end deftypefn @@ -835,16 +1025,41 @@ Interpolates data by cubic spline to the given point @var{x} in [0...nx-1], @var @deftypefn {Method on @code{mglData}} @code{mreal} Spline1 (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} Interpolates data by cubic spline to the given point @var{x}, @var{y}, @var{z} which assumed to be normalized in range [0, 1]. @end deftypefn + +@deftypefn {Method on @code{mglData}} @code{mreal} Spline (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {C function} @code{mreal} mgl_data_spline_ext (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal *}dx, @code{mreal *}dy, @code{mreal *}dz) +Interpolates data by cubic spline to the given point @var{x} in [0...nx-1], @var{y} in [0...ny-1], @var{z} in [0...nz-1]. The values of derivatives at the point are saved in @var{dif}. +@end deftypefn +@cindex Spline1 +@deftypefn {Method on @code{mglData}} @code{mreal} Spline1 (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +Interpolates data by cubic spline to the given point @var{x}, @var{y}, @var{z} which assumed to be normalized in range [0, 1]. The values of derivatives at the point are saved in @var{dif}. +@end deftypefn + @cindex Linear @deftypefn {Method on @code{mglData}} @code{mreal} Linear (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{dual} Linear (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_linear (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z) +@deftypefnx {C function} @code{dual} mgl_datac_linear (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z) Interpolates data by linear function to the given point @var{x} in [0...nx-1], @var{y} in [0...ny-1], @var{z} in [0...nz-1]. @end deftypefn @cindex Linear1 @deftypefn {Method on @code{mglData}} @code{mreal} Linear1 (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{dual} Linear1 (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} Interpolates data by linear function to the given point @var{x}, @var{y}, @var{z} which assumed to be normalized in range [0, 1]. @end deftypefn +@deftypefn {Method on @code{mglData}} @code{mreal} Linear (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{dual} Linear (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {C function} @code{mreal} mgl_data_linear_ext (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal *}dx, @code{mreal *}dy, @code{mreal *}dz) +@deftypefnx {C function} @code{dual} mgl_datac_linear_ext (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{dual *}dx, @code{dual *}dy, @code{dual *}dz) +Interpolates data by linear function to the given point @var{x} in [0...nx-1], @var{y} in [0...ny-1], @var{z} in [0...nz-1]. The values of derivatives at the point are saved in @var{dif}. +@end deftypefn +@cindex Linear1 +@deftypefn {Method on @code{mglData}} @code{mreal} Linear1 (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{dual} Linear1 (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +Interpolates data by linear function to the given point @var{x}, @var{y}, @var{z} which assumed to be normalized in range [0, 1]. The values of derivatives at the point are saved in @var{dif}. +@end deftypefn + @end ifclear @c ------------------------------------------------------------------ @@ -861,6 +1076,8 @@ There are a set of functions for obtaining data properties in MGL language. Howe @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{const char *} PrintInfo () @code{const} @deftypefnx {Method on @code{mglData}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{const char *} PrintInfo () @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} @deftypefnx {C function} @code{const char *} mgl_data_info (@code{HCDT} dat) @end ifclear Gets or prints to file @var{fp} or as message (in MGL) information about the data (sizes, maximum/minimum, momentums and so on). @@ -885,6 +1102,9 @@ Prints value of number @var{val} as message. @deftypefnx {Method on @code{mglData}} @code{long} GetNx () @deftypefnx {Method on @code{mglData}} @code{long} GetNy () @deftypefnx {Method on @code{mglData}} @code{long} GetNz () +@deftypefnx {Method on @code{mglDataC}} @code{long} GetNx () +@deftypefnx {Method on @code{mglDataC}} @code{long} GetNy () +@deftypefnx {Method on @code{mglDataC}} @code{long} GetNz () @deftypefnx {C function} @code{long} mgl_data_get_nx (@code{HCDT} dat) @deftypefnx {C function} @code{long} mgl_data_get_ny (@code{HCDT} dat) @deftypefnx {C function} @code{long} mgl_data_get_nz (@code{HCDT} dat) @@ -899,6 +1119,7 @@ Gets the x-, y-, z-size of the data. @deftypefn {MGL suffix} {(dat)} .max @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mreal} Maximal () @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mreal} Maximal () @code{const} @deftypefnx {C function} @code{mreal} mgl_data_max (@code{HCDT} dat) @end ifclear Gets maximal value of the data. @@ -909,6 +1130,7 @@ Gets maximal value of the data. @deftypefn {MGL suffix} {(dat)} .min @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mreal} Minimal () @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mreal} Minimal () @code{const} @deftypefnx {C function} @code{mreal} mgl_data_min (@code{HMDT} dat) @code{const} @end ifclear Gets minimal value of the data. @@ -916,14 +1138,17 @@ Gets minimal value of the data. @ifclear UDAV @deftypefn {Method on @code{mglData}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_min_int (@code{HCDT} dat, @code{int} *i, @code{int} *j, @code{int} *k) Gets position of minimum to variables @var{i}, @var{j}, @var{k} and returns the minimal value. @end deftypefn @deftypefn {Method on @code{mglData}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_max_int (@code{HCDT} dat, @code{int} *i, @code{int} *j, @code{int} *k) Gets position of maximum to variables @var{i}, @var{j}, @var{k} and returns the maximal value. @end deftypefn @deftypefn {Method on @code{mglData}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_min_real (@code{HCDT} dat, @code{mreal} *x, @code{mreal} *y, @code{mreal} *z) Gets approximated (interpolated) position of minimum to variables @var{x}, @var{y}, @var{z} and returns the minimal value. @end deftypefn @@ -935,6 +1160,7 @@ Gets approximated (interpolated) position of minimum to variables @var{x}, @var{ @deftypefnx {MGL suffix} {(dat)} .mz @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_max_real (@code{HCDT} dat, @code{mreal} *x, @code{mreal} *y, @code{mreal} *z) @end ifclear Gets approximated (interpolated) position of maximum to variables @var{x}, @var{y}, @var{z} and returns the maximal value. @@ -1016,7 +1242,7 @@ Give first (for @code{.a}, i.e. @code{dat->a[0]}). @deftypefn {MGL command} {} copy @sc{dat} dat2 ['eq'=''] @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} operator= (@code{const mglData &}d) +@deftypefnx {Method on @code{mglData}} @code{void} operator= (@code{const mglDataA &}d) @end ifclear Copies data from other variable. @end deftypefn @@ -1032,7 +1258,7 @@ Set all data values equal to @var{val}. @deftypefn {MGL command} {} multo dat dat2 @deftypefnx {MGL command} {} multo dat @code{val} @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} operator*= (@code{const mglData &}d) +@deftypefnx {Method on @code{mglData}} @code{void} operator*= (@code{const mglDataA &}d) @deftypefnx {Method on @code{mglData}} @code{void} operator*= (@code{mreal} d) @deftypefnx {C function} @code{void} mgl_data_mul_dat (@code{HMDT} dat, @code{HCDT} d) @deftypefnx {C function} @code{void} mgl_data_mul_num (@code{HMDT} dat, @code{mreal} d) @@ -1044,7 +1270,7 @@ Multiplies data element by the other one or by value. @deftypefn {MGL command} {} divto dat dat2 @deftypefnx {MGL command} {} divto dat @code{val} @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} operator/= (@code{const mglData &}d) +@deftypefnx {Method on @code{mglData}} @code{void} operator/= (@code{const mglDataA &}d) @deftypefnx {Method on @code{mglData}} @code{void} operator/= (@code{mreal} d) @deftypefnx {C function} @code{void} mgl_data_div_dat (@code{HMDT} dat, @code{HCDT} d) @deftypefnx {C function} @code{void} mgl_data_div_num (@code{HMDT} dat, @code{mreal} d) @@ -1056,7 +1282,7 @@ Divides each data element by the other one or by value. @deftypefn {MGL command} {} addto dat dat2 @deftypefnx {MGL command} {} addto dat @code{val} @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} operator+= (@code{const mglData &}d) +@deftypefnx {Method on @code{mglData}} @code{void} operator+= (@code{const mglDataA &}d) @deftypefnx {Method on @code{mglData}} @code{void} operator+= (@code{mreal} d) @deftypefnx {C function} @code{void} mgl_data_add_dat (@code{HMDT} dat, @code{HCDT} d) @deftypefnx {C function} @code{void} mgl_data_add_num (@code{HMDT} dat, @code{mreal} d) @@ -1068,7 +1294,7 @@ Adds to each data element the other one or the value. @deftypefn {MGL command} {} subto dat dat2 @deftypefnx {MGL command} {} subto dat @code{val} @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} operator-= (@code{const mglData &}d) +@deftypefnx {Method on @code{mglData}} @code{void} operator-= (@code{const mglDataA &}d) @deftypefnx {Method on @code{mglData}} @code{void} operator-= (@code{mreal} d) @deftypefnx {C function} @code{void} mgl_data_sub_dat (@code{HMDT} dat, @code{HCDT} d) @deftypefnx {C function} @code{void} mgl_data_sub_num (@code{HMDT} dat, @code{mreal} d) @@ -1077,26 +1303,26 @@ Subtracts from each data element the other one or the value. @end deftypefn @ifclear UDAV -@deftypefn {Library Function} mglData operator+ (@code{const mglData &}a, @code{const mglData &}b) -@deftypefnx {Library Function} mglData operator+ (@code{mreal} a, @code{const mglData &}b) -@deftypefnx {Library Function} mglData operator+ (@code{const mglData &}a, @code{mreal} b) +@deftypefn {Library Function} mglData operator+ (@code{const mglDataA &}a, @code{const mglDataA &}b) +@deftypefnx {Library Function} mglData operator+ (@code{mreal} a, @code{const mglDataA &}b) +@deftypefnx {Library Function} mglData operator+ (@code{const mglDataA &}a, @code{mreal} b) Adds the other data or the number. @end deftypefn -@deftypefn {Library Function} mglData operator- (@code{const mglData &}a, @code{const mglData &}b) -@deftypefnx {Library Function} mglData operator- (@code{mreal} a, @code{const mglData &}b) -@deftypefnx {Library Function} mglData operator- (@code{const mglData &}a, @code{mreal} b) +@deftypefn {Library Function} mglData operator- (@code{const mglDataA &}a, @code{const mglDataA &}b) +@deftypefnx {Library Function} mglData operator- (@code{mreal} a, @code{const mglDataA &}b) +@deftypefnx {Library Function} mglData operator- (@code{const mglDataA &}a, @code{mreal} b) Subtracts the other data or the number. @end deftypefn -@deftypefn {Library Function} mglData operator* (@code{const mglData &}a, @code{const mglData &}b) -@deftypefnx {Library Function} mglData operator* (@code{mreal} a, @code{const mglData &}b) -@deftypefnx {Library Function} mglData operator* (@code{const mglData &}a, @code{mreal} b) +@deftypefn {Library Function} mglData operator* (@code{const mglDataA &}a, @code{const mglDataA &}b) +@deftypefnx {Library Function} mglData operator* (@code{mreal} a, @code{const mglDataA &}b) +@deftypefnx {Library Function} mglData operator* (@code{const mglDataA &}a, @code{mreal} b) Multiplies by the other data or the number. @end deftypefn -@deftypefn {Library Function} mglData operator/ (@code{const mglData &}a, @code{const mglData &}b) -@deftypefnx {Library Function} mglData operator/ (@code{const mglData &}a, @code{mreal} b) +@deftypefn {Library Function} mglData operator/ (@code{const mglDataA &}a, @code{const mglDataA &}b) +@deftypefnx {Library Function} mglData operator/ (@code{const mglDataA &}a, @code{mreal} b) Divides by the other data or the number. @end deftypefn @end ifclear @@ -1113,7 +1339,7 @@ These functions are not methods of @code{mglData} class. However it provide addi @anchor{transform} @deftypefn {MGL command} {} transform @sc{dat} 'type' real imag @ifclear UDAV -@deftypefnx {Global function} @code{mglData} mglTransform (@code{const mglData &}real, @code{const mglData &}imag, @code{const char *}type) +@deftypefnx {Global function} @code{mglData} mglTransform (@code{const mglDataA &}real, @code{const mglDataA &}imag, @code{const char *}type) @deftypefnx {C function} @code{HMDT} mgl_transform (@code{HCDT} real, @code{HCDT} imag, @code{const char *}type) @end ifclear Does integral transformation of complex data @var{real}, @var{imag} on specified direction. The order of transformations is specified in string @var{type}: first character for x-dimension, second one for y-dimension, third one for z-dimension. The possible character are: @samp{f} is forward Fourier transformation, @samp{i} is inverse Fourier transformation, @samp{s} is Sine transform, @samp{c} is Cosine transform, @samp{h} is Hankel transform, @samp{n} or @samp{ } is no transformation. @@ -1122,7 +1348,7 @@ Does integral transformation of complex data @var{real}, @var{imag} on specified @anchor{transforma} @deftypefn {MGL command} {} transforma @sc{dat} 'type' ampl phase @ifclear UDAV -@deftypefnx {Global function} @code{mglData} mglTransformA @code{const mglData &}ampl, @code{const mglData &}phase, @code{const char *}type) +@deftypefnx {Global function} @code{mglData} mglTransformA @code{const mglDataA &}ampl, @code{const mglDataA &}phase, @code{const char *}type) @deftypefnx {C function} @code{HMDT} mgl_transform_a @code{HCDT} ampl, @code{HCDT} phase, @code{const char *}type) @end ifclear The same as previous but with specified amplitude @var{ampl} and phase @var{phase} of complex numbers. @@ -1131,7 +1357,7 @@ The same as previous but with specified amplitude @var{ampl} and phase @var{phas @anchor{fourier} @deftypefn {MGL command} {} fourier reDat imDat 'dir' @ifclear UDAV -@deftypefnx {Global function} @code{void} mglFourier @code{const mglData &}re, @code{const mglData &}im, @code{const char *}dir) +@deftypefnx {Global function} @code{void} mglFourier @code{const mglDataA &}re, @code{const mglDataA &}im, @code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_fourier @code{HCDT} re, @code{HCDT} im, @code{const char *}dir) @end ifclear Does Fourier transform of complex data @var{re}+i*@var{im} in directions @var{dir}. Result is placed back into @var{re} and @var{im} data arrays. @@ -1140,7 +1366,7 @@ Does Fourier transform of complex data @var{re}+i*@var{im} in directions @var{di @anchor{stfad} @deftypefn {MGL command} {} stfad @sc{res} real imag @code{dn} ['dir'='x'] @ifclear UDAV -@deftypefnx {Global function} @code{mglData} mglSTFA (@code{const mglData &}real, @code{const mglData &}imag, @code{int} dn, @code{char} dir=@code{'x'}) +@deftypefnx {Global function} @code{mglData} mglSTFA (@code{const mglDataA &}real, @code{const mglDataA &}imag, @code{int} dn, @code{char} dir=@code{'x'}) @deftypefnx {C function} @code{HMDT} mgl_data_stfa (@code{HCDT} real, @code{HCDT} imag, @code{int} dn,@code{char} dir) @end ifclear Short time Fourier transformation for real and imaginary parts. Output is amplitude of partial Fourier of length @var{dn}. For example if @var{dir}=@samp{x}, result will have size @{int(nx/dn), dn, ny@} and it will contain @math{res[i,j,k]=|\sum_d^dn exp(I*j*d)*(real[i*dn+d,k]+I*imag[i*dn+d,k])|/dn}. @@ -1149,7 +1375,7 @@ Short time Fourier transformation for real and imaginary parts. Output is ampli @anchor{pde} @deftypefn {MGL command} {} pde @sc{res} 'ham' ini_re ini_im [@code{dz=0.1 k0=100}] @ifclear UDAV -@deftypefnx {Global function} @code{mglData} mglPDE (@code{HMGL} gr, @code{const char *}ham, @code{const mglData &}ini_re, @code{const mglData &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""}) +@deftypefnx {Global function} @code{mglData} mglPDE (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_pde_solve (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt) @end ifclear Solves equation du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators. Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{Min}, @var{Max} set the bounding box for the solution. Note, that really this ranges are increased by factor 3/2 for purpose of reducing reflection from boundaries. Parameter @var{dz} set the step along evolutionary coordinate z. At this moment, simplified form of function @var{ham} is supported -- all ``mixed'' terms (like @samp{x*p}->x*d/dx) are excluded. For example, in 2D case this function is effectively @math{ham = f(p,z) + g(x,z,u)}. However commutable combinations (like @samp{x*q}->x*d/dy) are allowed. Here variable @samp{u} is used for field amplitude |u|. This allow one solve nonlinear problems -- for example, for nonlinear Shrodinger equation you may set @code{ham="p^2 + q^2 - u^2"}. You may specify imaginary part for wave absorption, like @code{ham = "p^2 + i*x*(x>0)"}, but only if dependence on variable @samp{i} is linear (i.e. @math{ham = hre+i*him}). @sref{PDE solving hints} @@ -1167,8 +1393,8 @@ Solves GO ray equation like dr/dt = d @var{ham}/dp, dp/dt = -d @var{ham}/dr. Thi @anchor{qo2d} @deftypefn {MGL command} {} qo2d @sc{res} 'ham' ini_re ini_im ray [@code{r=1 k0=100} xx yy] @ifclear UDAV -@deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglData &}ini_re, @code{const mglData &}ini_im, @code{const mglData &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}, @code{mglData *}xx=@code{0}, @code{mglData *}yy=@code{0}) -@deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglData &}ini_re, @code{const mglData &}ini_im, @code{const mglData &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}, @code{mglData *}xx=@code{0}, @code{mglData *}yy=@code{0}) +@deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) @deftypefnx {C function} @code{HMDT} mgl_qo2d_solve (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy) @end ifclear Solves equation du/dt = i*k0*@var{ham}(p,q,x,y,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators (see @code{mglPDE()} for details). Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{ray} set the reference ray, i.e. the ray around which the accompanied coordinate system will be maked. You may use, for example, the array created by @code{mglRay()} function. Note, that the reference ray @strong{must be} smooth enough to make accompanied coodrinates unambiguity. Otherwise errors in the solution may appear. If @var{xx} and @var{yy} are non-zero then Cartesian coordinates for each point will be written into them. See also @code{mglPDE()}. @sref{PDE solving hints} @@ -1177,8 +1403,8 @@ Solves equation du/dt = i*k0*@var{ham}(p,q,x,y,|u|)[u], where p=-i/k0*d/dx, q=-i @anchor{jacobian} @deftypefn {MGL command} {} jacobian @sc{res} xdat ydat [zdat] @ifclear UDAV -@deftypefnx {Global function} @code{mglData} mglJacobian (@code{const mglData &}x, @code{const mglData &}y) -@deftypefnx {Global function} @code{mglData} mglJacobian (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z) +@deftypefnx {Global function} @code{mglData} mglJacobian (@code{const mglDataA &}x, @code{const mglDataA &}y) +@deftypefnx {Global function} @code{mglData} mglJacobian (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z) @deftypefnx {C function} @code{HMDT} mgl_jacobian_2d (@code{HCDT} x, @code{HCDT} y) @deftypefnx {C function} @code{HMDT} mgl_jacobian_3d (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z) @end ifclear @@ -1189,8 +1415,8 @@ Computes the Jacobian for transformation @{i,j,k@} to @{@var{x},@var{y},@var{z}@ @deftypefn {MGL command} {} triangulation @sc{res} xdat ydat @c @deftypefn {MGL command} {} triangulation @sc{res} xdat ydat [zdat] @ifclear UDAV -@deftypefnx {Global function} @code{mglData} mglTriangulation (@code{const mglData &}x, @code{const mglData &}y) -@c @deftypefnx {Global function} @code{mglData} mglTriangulation (@code{const mglData &}x, @code{const mglData &}y, @code{const mglData &}z) +@deftypefnx {Global function} @code{mglData} mglTriangulation (@code{const mglDataA &}x, @code{const mglDataA &}y) +@c @deftypefnx {Global function} @code{mglData} mglTriangulation (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z) @deftypefnx {C function} @code{HMDT} mgl_triangulation_2d (@code{HCDT} x, @code{HCDT} y) @c @deftypefnx {C function} @code{HMDT} mgl_triangulation_3d (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z) @end ifclear @@ -1200,7 +1426,7 @@ Computes triangulation for arbitrary placed points with coordinates @{@var{x},@v @c ------------------------------------------------------------------ @external -@node Evaluate expression, , Global functions, Data processing +@node Evaluate expression, MGL variables, Global functions, Data processing @section Evaluate expression @ifset UDAV @@ -1243,5 +1469,53 @@ Evaluates the formula derivation respect to @var{dir} for variables in array @va @end ifclear +@c ------------------------------------------------------------------ +@external +@node MGL variables, , Evaluate expression, Data processing +@section MGL variables + +@ifset UDAV +For information about MGL variables see @ref{MGL definition}. +@end ifset + +@ifclear UDAV + +Class mglVar represent MGL variables. It is needed for parsing MGL scripts (see @ref{mglParse class}). This class is derived from @code{mglData} and is defined in @code{#include }. + +@deftypecv {Variable} mglVar @code{std::wstring} s +Name of variable. +@end deftypecv + +@deftypecv {Variable} mglVar @code{mglVar *} next +@deftypecvx {Variable} mglVar @code{mglVar *} prev +Next and previous variable in the list. +@end deftypecv + +@deftypecv {Variable} mglVar @code{bool} temp +Flag of the temporary variable. If @code{true} the this variable will be removed after script execution. +@end deftypecv + +@deftypecv {Variable} mglVar @code{void} (*func)(void *) +Callback function, which will be called at variable destroying. +@end deftypecv + +@deftypecv {Variable} mglVar @code{void *} o +Pointer to external object for callback function. +@end deftypecv + +@deftypefn {Constructor on @code{mglVar}} @code{} mglVar () +Create variable with size 1*1*1. +@end deftypefn + +@deftypefn {Destructor on @code{mglVar}} @code{} ~mglVar () +Deletes the instance of class mglVar. +@end deftypefn + +@deftypefn {Method on @code{mglVar}} @code{void} MoveAfter (@code{mglVar *}var) +Evaluates the formula for @code{'x','r'}=@var{x}, @code{'y','n'}=@var{y}, @code{'z','t'}=@var{z}, @code{'a','u'}=@var{u}. +@end deftypefn + +@end ifclear + @external diff --git a/texinfo/data_ru.texi b/texinfo/data_ru.texi index 085364a..afe69d0 100644 --- a/texinfo/data_ru.texi +++ b/texinfo/data_ru.texi @@ -6,7 +6,7 @@ @end ifset @ifclear UDAV -В данной главе описывается класс @code{mglData} для работы с массивами данных, определённый в @code{#include }. Он содержит функции для выделения памяти и изменения размера данных, чтения данных из файла, численного дифференцирования, интегрирования, интерполяции и пр., заполнения по текстовой формуле и т.д. Класс позволяет работать с данными размерности не более 3 (как функции от трёх переменных -- x,y,z). По умолчанию внутреннее представление данных -- mreal, выбранный в силу меньшего размера занимаемой памяти и достаточной для построения графиков точности. Базовый тип можно сменить на этапе установки указав опцию @code{--enable-double} (см. @ref{Installation}). Однако, в дальнейшем в документации будет использован тип @code{mreal}. Массивы которые могут быть созданы командами MGL отображаются Small Caps шрифтом (например, @sc{dat}). +В данной главе описываются классы @code{mglData} и @code{mglDataC} для работы с массивами действительных и комплексных данных, определённые в @code{#include } и @code{#include } соответственно. Оба класса являются наследниками абстрактного класса @code{mglDataA}, и могут быть использованы в аргументах всех функций рисования (см. @ref{MathGL core}). Классы содержат функции для выделения памяти и изменения размера данных, чтения данных из файла, численного дифференцирования, интегрирования, интерполяции и пр., заполнения по текстовой формуле и т.д. Классы позволяют работать с данными размерности не более 3 (как функции от трёх переменных -- x,y,z). По умолчанию внутреннее представление данных использует тип mreal (и dual=std::complex для @code{mglDataC}), который может быть сконфигурирован как float или double на этапе установки указав опцию @code{--enable-double} (см. @ref{Installation}). Тип float удобен в силу меньшего размера занимаемой памяти и, как правило, достаточной для построения графиков точности. Однако, тип double имеет большую точность, что может быть важно, например, для осей с метками времени. Массивы которые могут быть созданы командами MGL отображаются Small Caps шрифтом (например, @sc{dat}). @end ifclear @menu @@ -22,6 +22,7 @@ * Operators:: * Global functions:: * Evaluate expression:: +* MGL variables:: @end menu @c ------------------------------------------------------------------ @@ -35,32 +36,43 @@ MGL не поддерживает прямой доступ к элемента @ifclear UDAV @deftypecv {Variable} mglData @code{mreal *} a +@deftypecvx {Variable} mglDataC @code{dual *} a Указатель на массив данных. Это одномерный массив. Например, матрица [nx x ny x nz] представляется одномерным массивом длиной nx*ny*nz, где элемент с индексами @{i, j, k@} находится как a[i+nx*j+nx*ny*k] (индексы отсчитываются от нуля). @end deftypecv @deftypecv {Variable} mglData @code{int} nx +@deftypecvx {Variable} mglDataC @code{long} nx Размер массива по 1-ой размерности ('x' размерности). @end deftypecv @deftypecv {Variable} mglData @code{int} ny +@deftypecvx {Variable} mglDataC @code{long} ny Размер массива по 2-ой размерности ('y' размерности). @end deftypecv @deftypecv {Variable} mglData @code{int} nz +@deftypecvx {Variable} mglDataC @code{long} nz Размер массива по 3-ей размерности ('z' размерности). @end deftypecv -@deftypecv {Variable} mglData @code{char *} id +@deftypecv {Variable} mglData @code{std::string} id +@deftypecvx {Variable} mglDataC @code{std::string} id Имена колонки (или среза при nz>1) -- один символ на колонку. @end deftypecv @deftypecv {Variable} mglData @code{bool} link +@deftypecvx {Variable} mglDataC @code{bool} link Флаг использования указателя на внешние данные, включает запрет на удаление массива данных. @end deftypecv @deftypefn {Метод класса @code{mglData}} @code{mreal} GetVal (@code{long} i) +@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} GetVal (@code{long} i) @deftypefnx {Метод класса @code{mglData}} @code{void} SetVal (@code{mreal} val, @code{long} i) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} SetVal (@code{mreal} val, @code{long} i) Присваивает или возвращает значение используя "непрерывную" индексацию без проверки выхода за границы массива. Индекс @var{i} должен быть в диапазоне [0, nx*ny*nz-1]. @end deftypefn @deftypefn {Метод класса @code{mglData}} @code{long} GetNx () +@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNx () @deftypefnx {Метод класса @code{mglData}} @code{long} GetNy () +@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNy () @deftypefnx {Метод класса @code{mglData}} @code{long} GetNz () +@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNz () @deftypefnx {Функция С} @code{long} mgl_data_get_nx (@code{HCDT} dat) @deftypefnx {Функция С} @code{long} mgl_data_get_ny (@code{HCDT} dat) @deftypefnx {Функция С} @code{long} mgl_data_get_nz (@code{HCDT} dat) @@ -68,8 +80,11 @@ MGL не поддерживает прямой доступ к элемента @end deftypefn @deftypefn {Функция С} @code{mreal} mgl_data_get_value (@code{HCDT} dat, @code{int} i, @code{int} j, @code{int} k) +@deftypefnx {Функция С} @code{dual} mgl_datac_get_value (@code{HCDT} dat, @code{int} i, @code{int} j, @code{int} k) @deftypefnx {Функция С} @code{mreal *} mgl_data_value (@code{HMDT} dat, @code{int} i, @code{int} j, @code{int} k) +@deftypefnx {Функция С} @code{dual *} mgl_datac_value (@code{HADT} dat, @code{int} i, @code{int} j, @code{int} k) @deftypefnx {Функция С} @code{void} mgl_data_set_value (@code{HMDT} dat, @code{mreal} v, @code{int} i, @code{int} j, @code{int} k) +@deftypefnx {Функция С} @code{void} mgl_datac_set_value (@code{HADT} dat, @code{dual} v, @code{int} i, @code{int} j, @code{int} k) Присваивает или возвращает значение ячейки данных с проверкой выхода за пределы массива. @end deftypefn @deftypefn {Функция С} @code{const mreal *} mgl_data_data (@code{HCDT} dat) @@ -93,6 +108,7 @@ There are many functions, which can create data for output (see @ref{Data fillin @deftypefnx {Команда MGL} {} new @sc{dat} @code{nx ny nz} ['eq'] @ifclear UDAV @deftypefnx {Конструктор класса @code{mglData}} {} mglData (@code{int} mx=@code{1}, @code{int} my=@code{1}, @code{int} mz=@code{1}) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{int} mx=@code{1}, @code{int} my=@code{1}, @code{int} mz=@code{1}) @deftypefnx {Функция С} @code{HMDT} mgl_create_data () @deftypefnx {Функция С} @code{HMDT} mgl_create_data_size (@code{int} mx, @code{int} my, @code{int} mz) @end ifclear @@ -111,6 +127,14 @@ There are many functions, which can create data for output (see @ref{Data fillin @deftypefnx {Конструктор класса @code{mglData}} {} mglData (@code{int} size, @code{int} cols, @code{const double *}dat2) @deftypefnx {Конструктор класса @code{mglData}} {} mglData (@code{const double *}dat2, @code{int} size) @deftypefnx {Конструктор класса @code{mglData}} {} mglData (@code{const double *}dat2, @code{int} size, @code{int} cols) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{const mglDataA &}dat2) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{const mglDataA *}dat2) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{int} size, @code{const float *}dat2) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{int} size, @code{int} cols, @code{const float *}dat2) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{int} size, @code{const double *}dat2) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{int} size, @code{int} cols, @code{const double *}dat2) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{int} size, @code{const dual *}dat2) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{int} size, @code{int} cols, @code{const dual *}dat2) @end ifclear Копирует данные из другого экземпляра данных. Если указана формула @var{eq}, то данные заполняются также как при использовании @ref{fill}. @end deftypefn @@ -118,7 +142,9 @@ There are many functions, which can create data for output (see @ref{Data fillin @deftypefn {Команда MGL} {} read @sc{dat} 'fname' @ifclear UDAV @deftypefnx {Конструктор класса @code{mglData}} {} mglData (@code{const char *}fname) +@deftypefnx {Конструктор класса @code{mglDataC}} {} mglDataC (@code{const char *}fname) @deftypefnx {Функция С} @code{HMDT} mgl_create_data_file (@code{const char *}fname) +@deftypefnx {Функция С} @code{HADT} mgl_create_datac_file (@code{const char *}fname) @end ifclear Читает данные из текстового файла с автоматическим определением размеров массива. @end deftypefn @@ -127,6 +153,8 @@ There are many functions, which can create data for output (see @ref{Data fillin @ifclear UDAV @deftypefnx {Destructor on @code{mglData}} {} ~mglData () @deftypefnx {Функция С} @code{void} mgl_delete_data (@code{HMDT} dat) +@deftypefnx {Destructor on @code{mglDataC}} {} ~mglDataC () +@deftypefnx {Функция С} @code{void} mgl_delete_datac (@code{HADT} dat) @end ifclear Удаляет массив данных из памяти. @end deftypefn @@ -149,7 +177,9 @@ There are many functions, which can create data for output (see @ref{Data fillin @deftypefn {Команда MGL} {} new @sc{dat} [@code{nx=1 ny=1 nz=1}] @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Create (@code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Create (@code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}) @deftypefnx {Функция С} @code{void} mgl_data_create (@code{HMDT} dat, @code{int} mx, @code{int} my, @code{int} mz) +@deftypefnx {Функция С} @code{void} mgl_datac_create (@code{HADT} dat, @code{int} mx, @code{int} my, @code{int} mz) @end ifclear Создает/пересоздает массив данных указанного размера и заполняет его нулями. Ничего не делает при @var{mx}, @var{my}, @var{mz} отрицательных или равных нулю. @end deftypefn @@ -158,7 +188,9 @@ There are many functions, which can create data for output (see @ref{Data fillin @deftypefn {Команда MGL} {} rearrange dat @code{mx [my=0 mz=0]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Rearrange (@code{int} mx, @code{int} my=@code{0}, @code{int} mz=@code{0}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Rearrange (@code{int} mx, @code{int} my=@code{0}, @code{int} mz=@code{0}) @deftypefnx {Функция С} @code{void} mgl_data_rearrange (@code{HMDT} dat, @code{int} mx, @code{int} my, @code{int} mz) +@deftypefnx {Функция С} @code{void} mgl_datac_rearrange (@code{HADT} dat, @code{int} mx, @code{int} my, @code{int} mz) @end ifclear Изменяет размерность данных без изменения самого массива данных, так что результирующий массив @var{mx}*@var{my}*@var{mz} < nx*ny*nz. Если один из параметров @var{my} или @var{mz} ноль, то он будет выбран оптимальным образом. Например, если @var{my}=0, то будет @var{my}=nx*ny*nz/@var{mx} и @var{mz}=1. @end deftypefn @@ -167,7 +199,9 @@ There are many functions, which can create data for output (see @ref{Data fillin @deftypefn {Команда MGL} {} transpose dat ['dim'='yxz'] @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Transpose (@code{const char *}dim=@code{"yx"}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Transpose (@code{const char *}dim=@code{"yx"}) @deftypefnx {Функция С} @code{void} mgl_data_transpose (@code{const char *}dim) +@deftypefnx {Функция С} @code{void} mgl_datac_transpose (@code{HADT} dat, @code{const char *}dim) @end ifclear Транспонирует (меняет порядок размерностей) массив данных. Новый порядок размерностей задается строкой @var{dim}. Функция может быть полезна для транспонирования одномерных (или квазиодномерных) массивов после чтения их из файла. @end deftypefn @@ -176,7 +210,9 @@ There are many functions, which can create data for output (see @ref{Data fillin @deftypefn {Команда MGL} {} extend dat @code{n1 [n2=0]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Extend (@code{int} n1, @code{int} n2=@code{0}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Extend (@code{int} n1, @code{int} n2=@code{0}) @deftypefnx {Функция С} @code{void} mgl_data_extend (@code{HMDT} dat, @code{int} n1, @code{int} n2) +@deftypefnx {Функция С} @code{void} mgl_datac_extend (@code{HADT} dat, @code{int} n1, @code{int} n2) @end ifclear Увеличивает размер данных путем вставки (|@var{n1}|+1) новых срезов после (для @var{n1}>0) или перед (для @var{n1}<0) существующими данными. Можно добавить сразу 2 размерности для 1d массива, используя второй параметр @var{n2}. Данные в новые срезы будут скопированы из существующих. Например, для @var{n1}>0 новый массив будет @iftex @@ -191,7 +227,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} squeeze dat @code{rx [ry=1 rz=1 sm=off]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Squeeze (@code{int} rx, @code{int} ry=@code{1}, @code{int} rz=@code{1}, @code{bool} smooth=@code{false}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Squeeze (@code{int} rx, @code{int} ry=@code{1}, @code{int} rz=@code{1}, @code{bool} smooth=@code{false}) @deftypefnx {Функция С} @code{void} mgl_data_squeeze (@code{HMDT} dat, @code{int} rx, @code{int} ry, @code{int} rz, @code{int} smooth) +@deftypefnx {Функция С} @code{void} mgl_datac_squeeze (@code{HADT} dat, @code{int} rx, @code{int} ry, @code{int} rz, @code{int} smooth) @end ifclear Уменьшает размер данных путём удаления элементов с индексами не кратными @var{rx}, @var{ry}, @var{rz} соответственно. Параметр @var{smooth} задает использовать сглаживания @iftex @@ -206,7 +244,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} crop dat @code{n1 n2} 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Crop (@code{int} n1, @code{int} n2, @code{char} dir=@code{'x'}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Crop (@code{int} n1, @code{int} n2, @code{char} dir=@code{'x'}) @deftypefnx {Функция С} @code{void} mgl_data_crop (@code{HMDT} dat, @code{int} n1, @code{int} n2, @code{char} dir) +@deftypefnx {Функция С} @code{void} mgl_datac_crop (@code{HADT} dat, @code{int} n1, @code{int} n2, @code{char} dir) @end ifclear Обрезает границы данных при @var{i}<@var{n1} и @var{i}>@var{n2} (при @var{n2}>0) или @var{i}>@code{n[xyz]}-@var{n2} (при @var{n2}<=0) вдоль направления @var{dir}. @end deftypefn @@ -215,7 +255,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} insert dat 'dir' @code{[pos=off num=0]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Insert (@code{char} dir, @code{int} pos=@code{0}, @code{int} num=@code{1}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Insert (@code{char} dir, @code{int} pos=@code{0}, @code{int} num=@code{1}) @deftypefnx {Функция С} @code{void} mgl_data_insert (@code{HMDT} dat, @code{char} dir, @code{int} pos, @code{char} num) +@deftypefnx {Функция С} @code{void} mgl_datac_insert (@code{HADT} dat, @code{char} dir, @code{int} pos, @code{char} num) @end ifclear Вставляет @var{num} срезов вдоль направления @var{dir} с позиции @var{pos} и заполняет их нулями. @end deftypefn @@ -224,7 +266,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} delete dat 'dir' @code{[pos=off num=0]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Delete (@code{char} dir, @code{int} pos=@code{0}, @code{int} num=@code{1}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Delete (@code{char} dir, @code{int} pos=@code{0}, @code{int} num=@code{1}) @deftypefnx {Функция С} @code{void} mgl_data_delete (@code{HMDT} dat, @code{char} dir, @code{int} pos, @code{char} num) +@deftypefnx {Функция С} @code{void} mgl_datac_delete (@code{HADT} dat, @code{char} dir, @code{int} pos, @code{char} num) @end ifclear Удаляет @var{num} срезов вдоль направления @var{dir} с позиции @var{pos}. @end deftypefn @@ -238,6 +282,15 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v Сортирует строки (или срезы в 3D случае) по значениям в указанной колонке @var{idx} (или ячейках @{@var{idx},@var{idy}@} для 3D случая). Не используйте в многопоточных функциях! @end deftypefn +@anchor{clean} +@deftypefn {Команда MGL} {} clean dat @code{idx} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglData}} @code{void} Clean (@code{lond} idx) +@deftypefnx {Функция С} @code{void} mgl_data_clean (@code{HMDT} dat, @code{lond} idx) +@end ifclear +Удаляет строки в которых значения для заданной колонки @var{idx} совпадают со значениями в следующей строке. +@end deftypefn + @c ------------------------------------------------------------------ @external @@ -262,6 +315,12 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefnx {Метод класса @code{mglData}} @code{void} Set (@code{const double *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) @deftypefnx {Функция С} @code{void} mgl_data_set_mreal (@code{HMDT} dat, @code{const mreal *}A, @code{int} NX, @code{int} NY, @code{int} NZ) @deftypefnx {Функция С} @code{void} mgl_data_set_double (@code{HMDT} dat, @code{const double *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{const float *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{const double *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{const dual *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {Функция С} @code{void} mgl_datac_set_float (@code{HADT} dat, @code{const mreal *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {Функция С} @code{void} mgl_datac_set_double (@code{HADT} dat, @code{const double *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {Функция С} @code{void} mgl_datac_set_complex (@code{HADT} dat, @code{const dual *}A, @code{int} NX, @code{int} NY, @code{int} NZ) Выделяет память и копирует данные из массивов типа @code{mreal*} или @code{double*}, т.е. из массивов определённых как @code{mreal a[NX*NY*NZ];}. @end deftypefn @@ -280,33 +339,57 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @end deftypefn @deftypefn {Метод класса @code{mglData}} @code{void} Set (@code{gsl_vector *}v) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{gsl_vector *}v) @deftypefnx {Функция С} @code{void} mgl_data_set_vector (@code{HMDT} dat, @code{gsl_vector *}v) +@deftypefnx {Функция С} @code{void} mgl_datac_set_vector (@code{HADT} dat, @code{gsl_vector *}v) Выделяет память и копирует данные из структуры типа @code{gsl_vector *}. @end deftypefn @deftypefn {Метод класса @code{mglData}} @code{void} Set (@code{gsl_matrix *}m) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{gsl_matrix *}m) @deftypefnx {Функция С} @code{void} mgl_data_set_matrix (@code{HMDT} dat, @code{gsl_matrix *}m) +@deftypefnx {Функция С} @code{void} mgl_datac_set_matrix (@code{HADT} dat, @code{gsl_matrix *}m) Выделяет память и копирует данные из структуры типа @code{gsl_matrix *}. @end deftypefn @deftypefn {Метод класса @code{mglData}} @code{void} Set (@code{const mglData &}from) @deftypefnx {Метод класса @code{mglData}} @code{void} Set (@code{HCDT} from) @deftypefnx {Функция С} @code{void} mgl_data_set (@code{HMDT} dat, @code{HCDT} from) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{const mglDataA &}from) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{HCDT} from) +@deftypefnx {Функция С} @code{void} mgl_datac_set (@code{HADT} dat, @code{HCDT} from) Выделяет память и копирует данные из другого экземпляра данных @var{from}. @end deftypefn +@deftypefn {Метод класса @code{mglDataC}} @code{void} Set (@code{const mglDataA &}re, @code{const mglDataA &}im) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{HCDT} re, @code{HCDT} im) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} SetAmpl (@code{HCDT} ampl, @code{const mglDataA &}phase) +@deftypefnx {Функция С} @code{void} mgl_datac_set_ri (@code{HADT} dat, @code{HCDT} re, @code{HCDT} im) +@deftypefnx {Функция С} @code{void} mgl_datac_set_ap (@code{HADT} dat, @code{HCDT} ampl, @code{HCDT} phase) +Выделяет память и копирует данные из экземпляра данных для действительной @var{re} и мнимой @var{im} частей комплексного массива данных. +@end deftypefn + @deftypefn {Метод класса @code{mglData}} @code{void} Set (@code{const std::vector &}d) -@deftypefnx {Метод класса @code{mglData}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Метод класса @code{mglData}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{const std::vector &}d) @deftypefnx {Метод класса @code{mglData}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{const std::vector &}d) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{const std::vector &}d) Выделяет память и копирует данные из массива типа @code{std::vector}. @end deftypefn @deftypefn {Метод класса @code{mglData}} @code{void} Set (@code{const char *}str, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) @deftypefnx {Функция С} @code{void} mgl_data_set_values (@code{const char *}str, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Set (@code{const char *}str, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {Функция С} @code{void} mgl_datac_set_values (@code{const char *}str, @code{int} NX, @code{int} NY, @code{int} NZ) Выделяет память и сканирует массив данных из строки. @end deftypefn -@deftypefn {Метод класса @code{mglData}} @code{void} Link (@code{const mglData &}from) -@deftypefnx {Метод класса @code{mglData}} @code{void} Link (@code{const mreal *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefn {Метод класса @code{mglData}} @code{void} Link (@code{mglData &}from) +@deftypefnx {Метод класса @code{mglData}} @code{void} Link (@code{mreal *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) @deftypefnx {Функция С} @code{void} mgl_data_link (@code{HMDT} dat, @code{const mreal *}A, @code{int} NX, @code{int} NY, @code{int} NZ) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Link (@code{mglDataC &}from) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Link (@code{dual *}A, @code{int} NX, @code{int} NY=@code{1}, @code{int} NZ=@code{1}) +@deftypefnx {Функция С} @code{void} mgl_datac_link (@code{HADT} dat, @code{const mreal *}A, @code{int} NX, @code{int} NY, @code{int} NZ) Устанавливает флаг использования внешнего массива данных, которые не будут удалены. Флаг может быть возвращён в исходное состояние и создан новый внутренний массив если использовались функции изменяющие размер данных. @end deftypefn @end ifclear @@ -320,7 +403,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} fill dat v1 v2 ['dir'='x'] @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Fill (@code{mreal} v1, @code{mreal} v2, @code{char} dir=@code{'x'}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Fill (@code{dual} v1, @code{dual} v2, @code{char} dir=@code{'x'}) @deftypefnx {Функция С} @code{void} mgl_data_fill (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{char} dir) +@deftypefnx {Функция С} @code{void} mgl_datac_fill (@code{HADT} dat, @code{dual} v1, @code{dual} v2, @code{char} dir) @end ifclear Заполняет значениями равно распределёнными в диапазоне [@var{x1}, @var{x2}] в направлении @var{dir}=@{@samp{x},@samp{y},@samp{z}@}. @end deftypefn @@ -332,7 +417,11 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefnx {Метод класса @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const char *}opt=@code{""}) @deftypefnx {Метод класса @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglData &}vdat, @code{const char *}opt=@code{""}) @deftypefnx {Метод класса @code{mglData}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglData &}vdat, @code{const mglData &}wdat, @code{const char *}opt=@code{""}) -@deftypefnx {Функция С} @code{void} mgl_data_fill_eq (@code{HMGL} gr, @code{HMDT} dat, @code{const char *}eq, @code{const HMDT *}vdat, @code{const HMDT *}wdat, @code{const char *}opt) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglDataA &}vdat, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Fill (@code{HMGL} gr, @code{const char *}eq, @code{const mglDataA &}vdat, @code{const mglDataA &}wdat, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_data_fill_eq (@code{HMGL} gr, @code{HMDT} dat, @code{const char *}eq, @code{HCDT} vdat, @code{HCDT} wdat, @code{const char *}opt) +@deftypefnx {Функция С} @code{void} mgl_datac_fill_eq (@code{HMGL} gr, @code{HADT} dat, @code{const char *}eq, @code{HCDT} vdat, @code{HCDT} wdat, @code{const char *}opt) @end ifclear Заполняет значениями вычисленными по формуле @var{eq}. Формула представляет собой произвольное выражение, зависящее от переменных @samp{x}, @samp{y}, @samp{z}, @samp{u}, @samp{v}, @samp{w}. Координаты @samp{x}, @samp{y}, @samp{z} полагаются меняющимися в диапазоне @var{Min} x @var{Max} (в отличие от функции @code{Modify}). Переменная @samp{u} -- значения исходного массива, переменные @samp{v}, @samp{w} -- значения массивов @var{vdat}, @var{wdat}. Последние могут быть @code{NULL}, т.е. опущены. @end deftypefn @@ -345,8 +434,13 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefnx {Метод класса @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{int} dim=@code{0}) @deftypefnx {Метод класса @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{const mglData &}v) @deftypefnx {Метод класса @code{mglData}} @code{void} Modify (@code{const char *}eq, @code{const mglData &}v, @code{const mglData &}w) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Modify (@code{const char *}eq, @code{int} dim=@code{0}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Modify (@code{const char *}eq, @code{const mglDataA &}v) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Modify (@code{const char *}eq, @code{const mglDataA &}v, @code{const mglDataA &}w) @deftypefnx {Функция С} @code{void} mgl_data_modify (@code{HMDT} dat, @code{const char *}eq, @code{int} dim) @deftypefnx {Функция С} @code{void} mgl_data_modify_vw (@code{HMDT} dat, @code{const char *}eq, @code{HCDT} v, @code{HCDT} w) +@deftypefnx {Функция С} @code{void} mgl_datac_modify (@code{HADT} dat, @code{const char *}eq, @code{int} dim) +@deftypefnx {Функция С} @code{void} mgl_datac_modify_vw (@code{HADT} dat, @code{const char *}eq, @code{HCDT} v, @code{HCDT} w) @end ifclear Аналогично предыдущему с координатами @samp{x}, @samp{y}, @samp{z}, меняющимися в диапазоне [0,1]. Если указан @var{dim}>0, то изменяются только слои >=@var{dim}. @end deftypefn @@ -393,6 +487,8 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} SetColumnId (@code{const char *}ids) @deftypefnx mglData @code{void} mgl_data_set_id (@code{const char *}ids) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} SetColumnId (@code{const char *}ids) +@deftypefnx mglData @code{void} mgl_datac_set_id (@code{HADT} a, @code{const char *}ids) @end ifclear Задает названия @var{ids} для колонок массива данных. Строка должна содержать один символ 'a'...'z' на колонку. Эти названия используются в функции @ref{column}. @end deftypefn @@ -416,7 +512,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} read @sc{dat} 'fname' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Read (@code{const char *}fname) -@deftypefnx {Функция С} @code{void} mgl_data_read (@code{HMDT} dat, @code{const char *}fname) +@deftypefnx {Метод класса @code{mglDataC}} @code{bool} Read (@code{const char *}fname) +@deftypefnx {Функция С} @code{int} mgl_data_read (@code{HMDT} dat, @code{const char *}fname) +@deftypefnx {Функция С} @code{int} mgl_datac_read (@code{HADT} dat, @code{const char *}fname) @end ifclear Читает данные из текстового файла с разделителями символом пробела/табуляции с автоматическим определением размера массива. Двойной перевод строки начинает новый срез данных (по направлению z). @end deftypefn @@ -424,7 +522,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} read @sc{dat} 'fname' @code{mx [my=1 mz=1]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Read (@code{const char *}fname, @code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}) -@deftypefnx {Функция С} @code{void} mgl_data_read_dim (@code{HMDT} dat, @code{const char *}fname, @code{int} mx, @code{int} my, @code{int} mz) +@deftypefnx {Метод класса @code{mglDataC}} @code{bool} Read (@code{const char *}fname, @code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}) +@deftypefnx {Функция С} @code{int} mgl_data_read_dim (@code{HMDT} dat, @code{const char *}fname, @code{int} mx, @code{int} my, @code{int} mz) +@deftypefnx {Функция С} @code{int} mgl_datac_read_dim (@code{HADT} dat, @code{const char *}fname, @code{int} mx, @code{int} my, @code{int} mz) @end ifclear Читает данные из текстового файла с заданными размерами. Ничего не делается если параметры @var{mx}, @var{my} или @var{mz} равны нулю или отрицательны. @end deftypefn @@ -433,7 +533,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} readmat @sc{dat} 'fname' [@code{dim=2}] @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} ReadMat (@code{const char *}fname, @code{int} dim=@code{2}) -@deftypefnx {Функция С} @code{void} mgl_data_read_mat (@code{HMDT} dat, @code{const char *}fname, @code{int} dim) +@deftypefnx {Метод класса @code{mglDataC}} @code{bool} ReadMat (@code{const char *}fname, @code{int} dim=@code{2}) +@deftypefnx {Функция С} @code{int} mgl_data_read_mat (@code{HMDT} dat, @code{const char *}fname, @code{int} dim) +@deftypefnx {Функция С} @code{int} mgl_datac_read_mat (@code{HADT} dat, @code{const char *}fname, @code{int} dim) @end ifclear Читает данные из текстового файла с размерами, указанными в первых @var{dim} числах файла. При этом переменная @var{dim} задает размерность (1d, 2d, 3d) данных. @end deftypefn @@ -442,6 +544,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} readall @sc{dat} 'templ' @code{v1 v2 [dv=1 slice=off]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} ReadRange (@code{const char *}templ, @code{mreal} from, @code{mreal} to, @code{mreal} step=@code{1.f}, @code{bool} as_slice=@code{false}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} ReadRange (@code{const char *}templ, @code{mreal} from, @code{mreal} to, @code{mreal} step=@code{1}, @code{bool} as_slice=@code{false}) +@deftypefnx {Функция С} @code{int} mgl_data_read_range (@code{HMDT} dat, @code{const char *}templ, @code{mreal} from, @code{mreal} to, @code{mreal} step, @code{int} as_slice) +@deftypefnx {Функция С} @code{int} mgl_datac_read_range (@code{HADT} dat, @code{const char *}templ, @code{mreal} from, @code{mreal} to, @code{mreal} step, @code{int} as_slice) @end ifclear Объединяет данные из нескольких текстовых файлов. Имена файлов определяются вызовом функции @code{sprintf(fname,templ,val);}, где @var{val} меняется от @var{from} до @var{to} с шагом @var{step}. Данные загружаются один за другим в один и тот же срез данных (при @var{as_slice}=@code{false}) или срез-за-срезом (при @var{as_slice}=@code{true}). @end deftypefn @@ -449,6 +554,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} readall @sc{dat} 'templ' @code{[slice=off]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} ReadAll (@code{const char *}templ, @code{bool} as_slice=@code{false}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} ReadAll (@code{const char *}templ, @code{bool} as_slice=@code{false}) +@deftypefnx {Функция С} @code{int} mgl_data_read_all (@code{HMDT} dat, @code{const char *}templ, @code{int} as_slice) +@deftypefnx {Функция С} @code{int} mgl_datac_read_all (@code{HADT} dat, @code{const char *}templ, @code{int} as_slice) @end ifclear Объединяет данные из нескольких текстовых файлов, чьи имена удовлетворяют шаблону @var{templ} (например, @var{templ}=@code{"t_*.dat"}). Данные загружаются один за другим в один и тот же срез данных (при @var{as_slice}=@code{false}) или срез-за-срезом (при @var{as_slice}=@code{true}). @end deftypefn @@ -457,7 +565,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} save dat 'fname' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} @deftypefnx {Функция С} @code{void} mgl_data_save (@code{HCDT} dat, @code{const char *}fname, @code{int} ns) +@deftypefnx {Функция С} @code{void} mgl_datac_save (@code{HCDT} dat, @code{const char *}fname, @code{int} ns) @end ifclear Сохраняет весь массив данных при @var{ns}=@code{-1} или только @var{ns}-ый срез в текстовый файл. @end deftypefn @@ -466,7 +576,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} readhdf @sc{dat} 'fname' 'dname' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} ReadHDF (@code{const char *}fname, @code{const char *}dname) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} ReadHDF (@code{const char *}fname, @code{const char *}dname) @deftypefnx {Функция С} @code{void} mgl_data_read_hdf (@code{HMDT} dat, @code{const char *}fname, @code{const char *}dname) +@deftypefnx {Функция С} @code{void} mgl_datac_read_hdf (@code{HADT} dat, @code{const char *}fname, @code{const char *}dname) @end ifclear Читает массив с именем @var{dname} из HDF5 или HDF4 файла @var{fname}. Функция ничего не делает если библиотека была собрана без поддержки HDF5|HDF4. @end deftypefn @@ -475,7 +587,9 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} savehdf dat 'fname' 'dname' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} @deftypefnx {Функция С} @code{void} mgl_data_save_hdf (@code{HCDT} dat, @code{const char *}fname, @code{const char *}dname, @code{int} rewrite) +@deftypefnx {Функция С} @code{void} mgl_datac_save_hdf (@code{HCDT} dat, @code{const char *}fname, @code{const char *}dname, @code{int} rewrite) @end ifclear Сохраняет массив под именем @var{dname} в HDF5 или HDF4 файл @var{fname}. Функция ничего не делает если библиотека была собрана без поддержки HDF5|HDF4. @end deftypefn @@ -483,7 +597,8 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @anchor{datas} @deftypefn {Команда MGL} {} datas 'fname' @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{void} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{const} +@deftypefnx {Метод класса @code{mglData}} @code{void} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} +@deftypefnx {Метод класса @code{mglDataC}} @code{int} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} @deftypefnx {Функция С} @code{void} mgl_datas_hdf (@code{const char *}fname, @code{char *}buf, @code{long} size) @end ifclear Помещает имена массивов данных в HDF5 файле @var{fname} в строку @var{buf} разделёнными символом табуляции '\t'. В версии MGL имена массивов будут выведены как сообщение. Функция ничего не делает если библиотека была собрана без поддержки HDF5. @@ -527,6 +642,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} subdata @sc{res} dat @code{xx [yy=: zz=:]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} SubData (@code{mreal} xx, @code{mreal} yy=@code{-1}, @code{mreal} zz=@code{-1}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} SubData (@code{mreal} xx, @code{mreal} yy=@code{-1}, @code{mreal} zz=@code{-1}) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_subdata (@code{HCDT} dat, @code{mreal} xx, @code{mreal} yy, @code{mreal} zz) @end ifclear Возвращает в @var{res} подмассив массива данных @var{dat} с фиксированными значениями индексов с положительными значениями. Например, @code{SubData(-1,2)} выделяет третью строку (индексы начинаются с нуля), @code{SubData(4,-1)} выделяет 5-ую колонку, @code{SubData(-1,-1,3)} выделяет 4-ый срез и т.д. В MGL скриптах обычно используется упрощенная версия @code{dat(xx,yy,zz)}. @@ -535,6 +651,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} subdata @sc{res} dat xdat [ydat=: zdat=:] @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} SubData (@code{const mglData &}xx, @code{const mglData &}yy, @code{const mglData &}zz) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_subdata_ext (@code{HCDT} dat, @code{HCDT} xx, @code{HCDT} yy, @code{HCDT} zz) @end ifclear Возвращает в @var{res} подмассив массива данных @var{dat} с индексами, заданными в массивах @var{xx}, @var{yy}, @var{zz} (косвенная адресация). Результат будет иметь размерность массивов с индексами. Размеры массивов @var{xx}, @var{yy}, @var{zz} с индексами должна быть одинакова, либо должны быть "скаляром" (т.е. 1*1*1). В MGL скриптах обычно используется упрощенная версия @code{dat(xx,yy,zz)}. @@ -544,6 +661,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} column @sc{res} dat 'eq' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} Column (@code{const char *}eq) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Column (@code{const char *}eq) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_column (@code{HCDT} dat, @code{const char *}eq) @end ifclear Возвращает массив данных заполненный по формуле @var{eq}, вычисленной для именованных колонок (или срезов). Например, @code{Column("n*w^2/exp(t)");}. Имена колонок должны быть предварительно заданы функцией @ref{idset} или при чтении файлов данных. В MGL скриптах обычно используется упрощенная версия @code{dat('eq')}. @@ -553,6 +671,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} resize @sc{res} dat @code{mx [my=1 mz=1]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} Resize (@code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}, @code{mreal} x1=@code{0}, @code{mreal} x2=@code{1}, @code{mreal} y1=@code{0}, @code{mreal} y2=@code{1}, @code{mreal} z1=@code{0}, @code{mreal} z2=@code{1}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Resize (@code{int} mx, @code{int} my=@code{1}, @code{int} mz=@code{1}, @code{mreal} x1=@code{0}, @code{mreal} x2=@code{1}, @code{mreal} y1=@code{0}, @code{mreal} y2=@code{1}, @code{mreal} z1=@code{0}, @code{mreal} z2=@code{1}) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_resize (@code{HCDT} dat, @code{int} mx, @code{int} my, @code{int} mz) @deftypefnx {Функция С} @code{HMDT} mgl_data_resize_box (@code{HCDT} dat, @code{int} mx, @code{int} my, @code{int} mz, @code{mreal} x1, @code{mreal} x2, @code{mreal} y1, @code{mreal} y2, @code{mreal} z1, @code{mreal} z2) @end ifclear @@ -567,17 +686,33 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefnx {Метод класса @code{mglData}} @code{mglData} Evaluate (@code{const mglData &}idat, @code{bool} norm=@code{true}) @code{const} @deftypefnx {Метод класса @code{mglData}} @code{mglData} Evaluate (@code{const mglData &}idat, @code{const mglData &}jdat, @code{bool} norm=@code{true}) @code{const} @deftypefnx {Метод класса @code{mglData}} @code{mglData} Evaluate (@code{const mglData &}idat, @code{const mglData &}jdat, @code{const mglData &}kdat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Evaluate (@code{const mglDataA &}idat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Evaluate (@code{const mglDataA &}idat, @code{const mglDataA &}jdat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Evaluate (@code{const mglDataA &}idat, @code{const mglDataA &}jdat, @code{const mglDataA &}kdat, @code{bool} norm=@code{true}) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_evaluate (@code{HCDT} dat, @code{HCDT} idat, @code{HCDT} jdat, @code{HCDT} kdat, @code{int} norm) @end ifclear Возвращает массив данных, полученный в результате интерполяции исходного массива в точках других массивов (например, res[i,j]=dat[idat[i,j],jdat[i,j]]). Размеры массивов @var{idat}, @var{jdat}, @var{kdat} должны совпадать. Координаты в @var{idat}, @var{jdat}, @var{kdat} полагаются нормированными в диапазон [0,1] (при @var{norm}=@code{true}) или в диапазоны [0,nx], [0,ny], [0,nz] соответственно. @end deftypefn +@anchor{solve} +@deftypefn {Команда MGL} {} solve @sc{res} dat @code{val} 'dir' [@code{norm=on}] +@deftypefnx {Команда MGL} {} solve @sc{res} dat @code{val} 'dir' idat [@code{norm=on}] +@ifclear UDAV +@deftypefnx {Метод класса @code{mglData}} @code{mglData} Solve (@code{mreal} val, @code{char} dir, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Метод класса @code{mglData}} @code{mglData} Solve (@code{mreal} val, @code{char} dir, @code{const mglDataA &}idat, @code{bool} norm=@code{true}) @code{const} +@deftypefnx {Функция С} @code{HMDT} mgl_data_solve (@code{HCDT} dat, @code{mreal} val, @code{char} dir, @code{HCDT} idat, @code{int} norm) +@end ifclear +Возвращает массив индексов (корней) вдоль выбранного направления @var{dir} в которых значения массива @var{dat} равны @var{val}. Выходной массив будет иметь размеры массива @var{dat} в направлениях поперечных @var{dir}. Если предоставлен массив @var{idat}, то его значения используются как стартовые при поиске. Это позволяет найти несколько веток с помощью последовательного вызова функции. Индексы полагаются нормированными в диапазон [0,1] (при @var{norm}=@code{true}) или в диапазоны [0,nx], [0,ny], [0,nz] соответственно. @sref{Solve sample} +@end deftypefn + @anchor{hist} @deftypefn {Команда MGL} {} hist @sc{res} dat @code{num v1 v2 [nsub=0]} @deftypefnx {Команда MGL} {} hist @sc{res} dat wdat @code{num v1 v2 [nsub=0]} @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} Hist (@code{int} n, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{int} nsub=@code{0}) @code{const} @deftypefnx {Метод класса @code{mglData}} @code{mglData} Hist (@code{const mglData &}w, @code{int} n, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{int} nsub=@code{0}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Hist (@code{int} n, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{int} nsub=@code{0}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Hist (@code{const mglDataA &}w, @code{int} n, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{int} nsub=@code{0}) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_hist (@code{HCDT} dat, @code{int} n, @code{mreal} v1, @code{mreal} v2, @code{int} nsub) @deftypefnx {Функция С} @code{HMDT} mgl_data_hist_w (@code{HCDT} dat, @code{HCDT} w, @code{int} n, @code{mreal} v1, @code{mreal} v2, @code{int} nsub) @end ifclear @@ -588,6 +723,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @deftypefn {Команда MGL} {} momentum @sc{res} dat 'how' ['dir'='z'] @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} Momentum (@code{char} dir, @code{const char *}how) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Momentum (@code{char} dir, @code{const char *}how) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_momentum (@code{HCDT} dat, @code{char} dir, @code{const char *}how) @end ifclear Возвращает момент (1d массив) данных вдоль направления @var{dir}. Строка @var{how} определяет тип момента. Момент определяется как @@ -604,6 +740,7 @@ res_k = \sum_ij how(x_i,y_j,z_k) a_ij/ \sum_ij a_ij @deftypefn {Команда MGL} {} sum @sc{res} dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} Sum (@code{const char *}dir) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Sum (@code{const char *}dir) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_sum (@code{HCDT} dat, @code{const char *}dir) @end ifclear Возвращает результат суммирования данных вдоль направления(ий) @var{dir}. @@ -613,6 +750,7 @@ res_k = \sum_ij how(x_i,y_j,z_k) a_ij/ \sum_ij a_ij @deftypefn {Команда MGL} {} max @sc{res} dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} Max (@code{const char *}dir) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Max (@code{const char *}dir) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_max_dir (@code{HCDT} dat, @code{const char *}dir) @end ifclear Возвращает максимальное значение данных вдоль направления(ий) @var{dir}. @@ -622,6 +760,7 @@ res_k = \sum_ij how(x_i,y_j,z_k) a_ij/ \sum_ij a_ij @deftypefn {Команда MGL} {} min @sc{res} dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} Min (@code{const char *}dir) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Min (@code{const char *}dir) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_min_dir (@code{HCDT} dat, @code{const char *}dir) @end ifclear Возвращает минимальное значение данных вдоль направления(ий) @var{dir}. @@ -631,6 +770,7 @@ res_k = \sum_ij how(x_i,y_j,z_k) a_ij/ \sum_ij a_ij @deftypefn {Команда MGL} {} combine @sc{res} adat bdat @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} Combine (@code{const mglData &}a) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Combine (@code{const mglDataA &}a) @code{const} @deftypefnx {Функция С} @code{HMDT} mgl_data_combine (@code{HCDT} dat, @code{HCDT} a) @end ifclear Возвращает прямое произведение массивов (наподобие, res[i,j] = adat[i]*bdat[j] и т.д.). @@ -640,10 +780,31 @@ res_k = \sum_ij how(x_i,y_j,z_k) a_ij/ \sum_ij a_ij @deftypefn {Команда MGL} {} trace @sc{res} dat @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mglData} Trace () @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mglData} Trace () @code{const} +@deftypefnx {Функция С} @code{HMDT} mgl_data_trace (@code{HCDT} dat) @end ifclear Возвращает массив диагональных элементов a[i,i] (для 2D данных) или a[i,i,i] (для 3D данных) где i=0...nx-1. В 1D случае возвращается сам массив данных. Размеры массива данных должен быть ny,nz >= nx или ny,nz = 1. @end deftypefn +@ifclear UDAV +@deftypefn {Метод класса @code{mglDataC}} @code{mglData} Real () @code{const} +@deftypefnx {Функция С} @code{HMDT} mgl_datac_real (@code{HCDT} dat) +Возвращает массив действительных частей массива данных. +@end deftypefn +@deftypefn {Метод класса @code{mglDataC}} @code{mglData} Imag () @code{const} +@deftypefnx {Функция С} @code{HMDT} mgl_datac_imag (@code{HCDT} dat) +Возвращает массив мнимых частей массива данных. +@end deftypefn +@deftypefn {Метод класса @code{mglDataC}} @code{mglData} Abs () @code{const} +@deftypefnx {Функция С} @code{HMDT} mgl_datac_abs (@code{HCDT} dat) +Возвращает массив абсолютных значений массива данных. +@end deftypefn +@deftypefn {Метод класса @code{mglDataC}} @code{mglData} Arg () @code{const} +@deftypefnx {Функция С} @code{HMDT} mgl_datac_arg (@code{HCDT} dat) +Возвращает массив аргументов массива данных. +@end deftypefn +@end ifclear + @c ------------------------------------------------------------------ @external @node Data changing, Interpolation, Make another data, Data processing @@ -670,7 +831,9 @@ These functions change the data in some direction like differentiations, integra @deftypefn {Команда MGL} {} cumsum dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} CumSum (@code{const char *}dir) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} CumSum (@code{const char *}dir) @deftypefnx {Функция С} @code{void} mgl_data_cumsum (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {Функция С} @code{void} mgl_datac_cumsum (@code{HADT} dat, @code{const char *}dir) @end ifclear Суммирует с накоплением в выбранном направлении(ях). @end deftypefn @@ -679,7 +842,9 @@ These functions change the data in some direction like differentiations, integra @deftypefn {Команда MGL} {} integrate dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Integral (@code{const char *}dir) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Integral (@code{const char *}dir) @deftypefnx {Функция С} @code{void} mgl_data_integral (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {Функция С} @code{void} mgl_datac_integral (@code{HADT} dat, @code{const char *}dir) @end ifclear Выполняет интегрирование (методом трапеций) в выбранном направлении(ях). @end deftypefn @@ -688,7 +853,9 @@ These functions change the data in some direction like differentiations, integra @deftypefn {Команда MGL} {} diff dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Diff (@code{const char *}dir) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Diff (@code{const char *}dir) @deftypefnx {Функция С} @code{void} mgl_data_diff (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {Функция С} @code{void} mgl_datac_diff (@code{HADT} dat, @code{const char *}dir) @end ifclear Выполняет дифференцирование в выбранном направлении(ях). @end deftypefn @@ -706,7 +873,9 @@ These functions change the data in some direction like differentiations, integra @deftypefn {Команда MGL} {} diff2 dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Diff2 (@code{const char *}dir) -@deftypefnx {Функция С} @code{void} mgl_data_diff2 (@code{const char *}dir) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Diff2 (@code{const char *}dir) +@deftypefnx {Функция С} @code{void} mgl_data_diff2 (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {Функция С} @code{void} mgl_datac_diff2 (@code{HADT} dat, @code{const char *}dir) @end ifclear Выполняет двойное дифференцирование (как в операторе Лапласа) в выбранном направлении(ях). @end deftypefn @@ -717,7 +886,7 @@ These functions change the data in some direction like differentiations, integra @deftypefnx {Метод класса @code{mglData}} @code{void} SinFFT (@code{const char *}dir) @deftypefnx {Функция С} @code{void} mgl_data_sinfft (@code{HMDT} dat, @code{const char *}dir) @end ifclear -Выполняет синус преобразование в выбранном направлении(ях). Синус преобразование есть @math{\sum a_i \sin(k i)}. +Выполняет синус преобразование в выбранном направлении(ях). Синус преобразование есть @math{\sum a_j \sin(k j)}. @end deftypefn @anchor{cosfft} @@ -726,23 +895,34 @@ These functions change the data in some direction like differentiations, integra @deftypefnx {Метод класса @code{mglData}} @code{void} CosFFT (@code{const char *}dir) @deftypefnx {Функция С} @code{void} mgl_data_cosfft (@code{HMDT} dat, @code{const char *}dir) @end ifclear -Выполняет косинус преобразование в выбранном направлении(ях). Синус преобразование есть @math{\sum a_i \cos(k i)}. +Выполняет косинус преобразование в выбранном направлении(ях). Синус преобразование есть @math{\sum a_j \cos(k j)}. @end deftypefn +@ifclear UDAV +@deftypefn {Метод класса @code{mglDataC}} @code{void} FFT (@code{const char *}dir) +@deftypefnx {Функция С} @code{void} mgl_datac_fft (@code{HADT} dat, @code{const char *}dir) +Выполняет фурье преобразование в выбранном направлении(ях). Если строка @var{dir} содержит @samp{i}, то используется обратное преобразование фурье. Фурье преобразование есть @math{\sum a_j \exp(i k j)}. +@end deftypefn +@end ifclear + @anchor{hankel} @deftypefn {Команда MGL} {} hankel dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Hankel (@code{const char *}dir) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Hankel (@code{const char *}dir) @deftypefnx {Функция С} @code{void} mgl_data_hankel (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {Функция С} @code{void} mgl_datac_hankel (@code{HADT} dat, @code{const char *}dir) @end ifclear -Выполняет преобразование Ханкеля в выбранном направлении(ях). Преобразование Ханкеля есть @math{\sum a_i J_0(k i)}. +Выполняет преобразование Ханкеля в выбранном направлении(ях). Преобразование Ханкеля есть @math{\sum a_j J_0(k j)}. @end deftypefn @anchor{swap} @deftypefn {Команда MGL} {} swap dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Swap (@code{const char *}dir) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Swap (@code{const char *}dir) @deftypefnx {Функция С} @code{void} mgl_data_swap (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {Функция С} @code{void} mgl_datac_swap (@code{HADT} dat, @code{const char *}dir) @end ifclear Меняет местами левую и правую части данных в выбранном направлении(ях). Полезно для отображения результата FFT. @end deftypefn @@ -751,7 +931,9 @@ These functions change the data in some direction like differentiations, integra @deftypefn {Команда MGL} {} roll dat 'dir' num @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Roll (@code{char} dir, @code{num}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Roll (@code{char} dir, @code{num}) @deftypefnx {Функция С} @code{void} mgl_data_roll (@code{HMDT} dat, @code{char} dir, @code{num}) +@deftypefnx {Функция С} @code{void} mgl_datac_roll (@code{HADT} dat, @code{char} dir, @code{num}) @end ifclear Сдвигает данные на @var{num} ячеек в выбранном направлении(ях). Соответствует замене индекса на @var{i}->(i+@var{num})%nx при @code{dir='x'}. @end deftypefn @@ -760,7 +942,9 @@ These functions change the data in some direction like differentiations, integra @deftypefn {Команда MGL} {} mirror dat 'dir' @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Mirror (@code{const char *}dir) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Mirror (@code{const char *}dir) @deftypefnx {Функция С} @code{void} mgl_data_mirror (@code{HMDT} dat, @code{const char *}dir) +@deftypefnx {Функция С} @code{void} mgl_datac_mirror (@code{HADT} dat, @code{const char *}dir) @end ifclear Отражает данные в выбранном направлении(ях). Соответствует замене индекса на @var{i}->@var{n}-@var{i}. Отмечу, что похожего эффекта на графике можно достичь используя опции (@pxref{Command options}), например, @code{surf dat; xrange 1 -1}. @end deftypefn @@ -778,7 +962,9 @@ These functions change the data in some direction like differentiations, integra @deftypefn {Команда MGL} {} smooth data @code{type} ['dir'='xyz'] @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Smooth (@code{const char *}dir=@code{"xyz"}, @code{mreal} delta=@code{0}) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Smooth (@code{const char *}dir=@code{"xyz"}, @code{mreal} delta=@code{0}) @deftypefnx {Функция С} @code{void} mgl_data_smooth (@code{HMDT} dat, @code{const char *}dir, @code{mreal} delta) +@deftypefnx {Функция С} @code{void} mgl_datac_smooth (@code{HADT} dat, @code{const char *}dir, @code{mreal} delta) @end ifclear Сглаживает данные в выбранном направлении(ях) @var{dir}. Строка @var{dirs} задает направления вдоль которых будет производиться сглаживание. Если @var{dirs} содержит: @samp{0} -- ничего не делает, @samp{3} линейное усреднение по 3 точкам, @samp{5} линейное усреднение по 5 точкам. По умолчанию используется квадратичное усреднение по 5 точкам. @end deftypefn @@ -835,16 +1021,42 @@ These functions change the data in some direction like differentiations, integra @deftypefn {Метод класса @code{mglData}} @code{mreal} Spline1 (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} Интерполирует данные кубическим сплайном в точке @var{x}, @var{y}, @var{z}, где координаты полагаются в интервале [0, 1]. @end deftypefn + +@deftypefn {Метод класса @code{mglData}} @code{mreal} Spline (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Функция С} @code{mreal} mgl_data_spline_ext (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal *}dx, @code{mreal *}dy, @code{mreal *}dz) +Интерполирует данные кубическим сплайном в точке @var{x} в [0...nx-1], @var{y} в [0...ny-1], @var{z} в [0...nz-1]. Значения производных в точке записываются в @var{dif}. +@end deftypefn +@cindex Spline1 +@deftypefn {Метод класса @code{mglData}} @code{mreal} Spline1 (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +Интерполирует данные кубическим сплайном в точке @var{x}, @var{y}, @var{z}, где координаты полагаются в интервале [0, 1]. Значения производных в точке записываются в @var{dif}. +@end deftypefn + + @cindex Linear @deftypefn {Метод класса @code{mglData}} @code{mreal} Linear (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{dual} Linear (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_linear (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z) +@deftypefnx {Функция С} @code{dual} mgl_datac_linear (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z) Интерполирует данные линейной функцией в точке @var{x} в [0...nx-1], @var{y} в [0...ny-1], @var{z} в [0...nz-1]. @end deftypefn @cindex Linear1 @deftypefn {Метод класса @code{mglData}} @code{mreal} Linear1 (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{dual} Linear1 (@code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} Интерполирует данные линейной функцией в точке @var{x}, @var{y}, @var{z}, где координаты полагаются в интервале [0, 1]. @end deftypefn +@deftypefn {Метод класса @code{mglData}} @code{mreal} Linear (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{dual} Linear (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Функция С} @code{mreal} mgl_data_linear_ext (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal *}dx, @code{mreal *}dy, @code{mreal *}dz) +@deftypefnx {Функция С} @code{dual} mgl_datac_linear_ext (@code{HCDT} dat, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{dual *}dx, @code{dual *}dy, @code{dual *}dz) +Интерполирует данные линейной функцией в точке @var{x}, @var{y}, @var{z}, где координаты полагаются в интервале [0, 1]. Значения производных в точке записываются в @var{dif}. +@end deftypefn +@cindex Linear1 +@deftypefn {Метод класса @code{mglData}} @code{mreal} Linear1 (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{dual} Linear1 (@code{mglPoint} &dif, @code{mreal} x, @code{mreal} y=@code{0}, @code{mreal} z=@code{0}) @code{const} +Интерполирует данные линейной функцией в точке @var{x}, @var{y}, @var{z}, где координаты полагаются в интервале [0, 1]. Значения производных в точке записываются в @var{dif}. +@end deftypefn + @end ifclear @c ------------------------------------------------------------------ @@ -861,6 +1073,8 @@ These functions change the data in some direction like differentiations, integra @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{const char *} PrintInfo () @code{const} @deftypefnx {Метод класса @code{mglData}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{const char *} PrintInfo () @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} @deftypefnx {Функция С} @code{const char *} mgl_data_info (@code{HCDT} dat) @end ifclear Возвращает строку с информацией о данных (размеры, моменты и пр.) или пишет её в файл. В MGL скрипте печатает её как сообщение. @@ -885,6 +1099,9 @@ These functions change the data in some direction like differentiations, integra @deftypefnx {Метод класса @code{mglData}} @code{long} GetNx () @deftypefnx {Метод класса @code{mglData}} @code{long} GetNy () @deftypefnx {Метод класса @code{mglData}} @code{long} GetNz () +@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNx () +@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNy () +@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNz () @deftypefnx {Функция С} @code{long} mgl_data_get_nx (@code{HCDT} dat) @deftypefnx {Функция С} @code{long} mgl_data_get_ny (@code{HCDT} dat) @deftypefnx {Функция С} @code{long} mgl_data_get_nz (@code{HCDT} dat) @@ -899,6 +1116,7 @@ These functions change the data in some direction like differentiations, integra @deftypefn {MGL suffix} {(dat)} .max @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mreal} Maximal () @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Maximal () @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_max (@code{HCDT} dat) @end ifclear Возвращает максимальное значение массива данных. @@ -909,6 +1127,7 @@ These functions change the data in some direction like differentiations, integra @deftypefn {MGL suffix} {(dat)} .min @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mreal} Minimal () @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Minimal () @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_min (@code{HMDT} dat) @code{const} @end ifclear Возвращает минимальное значение массива данных. @@ -916,14 +1135,17 @@ These functions change the data in some direction like differentiations, integra @ifclear UDAV @deftypefn {Метод класса @code{mglData}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_min_int (@code{HCDT} dat, @code{int} *i, @code{int} *j, @code{int} *k) Возвращает максимальное значение массива данных и сохраняет его положение в переменные @var{i}, @var{j}, @var{k}. @end deftypefn @deftypefn {Метод класса @code{mglData}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_max_int (@code{HCDT} dat, @code{int} *i, @code{int} *j, @code{int} *k) Возвращает минимальное значение массива данных и сохраняет его положение в переменные @var{i}, @var{j}, @var{k}. @end deftypefn @deftypefn {Метод класса @code{mglData}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_min_real (@code{HCDT} dat, @code{mreal} *x, @code{mreal} *y, @code{mreal} *z) Возвращает максимальное значение массива данных и его приближенное (интерполированное) положение в переменные @var{x}, @var{y}, @var{z}. @end deftypefn @@ -935,6 +1157,7 @@ These functions change the data in some direction like differentiations, integra @deftypefnx {MGL suffix} {(dat)} .mz @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} +@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_max_real (@code{HCDT} dat, @code{mreal} *x, @code{mreal} *y, @code{mreal} *z) @end ifclear Возвращает минимальное значение массива данных и его приближенное (интерполированное) положение в переменные @var{x}, @var{y}, @var{z}. @@ -1200,7 +1423,7 @@ These functions change the data in some direction like differentiations, integra @c ------------------------------------------------------------------ @external -@node Evaluate expression, , Global functions, Data processing +@node Evaluate expression, MGL variables, Global functions, Data processing @section Вычисление выражений @ifset UDAV @@ -1243,5 +1466,53 @@ These functions change the data in some direction like differentiations, integra @end ifclear +@c ------------------------------------------------------------------ +@external +@node MGL variables, , Evaluate expression, Data processing +@section MGL variables + +@ifset UDAV +For information about MGL variables see @ref{MGL definition}. +@end ifset + +@ifclear UDAV + +Class mglVar represent MGL variables. It is needed for parsing MGL scripts (see @ref{mglParse class}). This class is derived from @code{mglData} and is defined in @code{#include }. + +@deftypecv {Variable} mglVar @code{std::wstring} s +Name of variable. +@end deftypecv + +@deftypecv {Variable} mglVar @code{mglVar *} next +@deftypecvx {Variable} mglVar @code{mglVar *} prev +Next and previous variable in the list. +@end deftypecv + +@deftypecv {Variable} mglVar @code{bool} temp +Flag of the temporary variable. If @code{true} the this variable will be removed after script execution. +@end deftypecv + +@deftypecv {Variable} mglVar @code{void (*}func@code{)(void *)} +Callback function, which will be called at variable destroying. +@end deftypecv + +@deftypecv {Variable} mglVar @code{void *} o +Pointer to external object for callback function. +@end deftypecv + +@deftypefn {Constructor on @code{mglVar}} @code{} mglVar () +Create variable with size 1*1*1. +@end deftypefn + +@deftypefn {Destructor on @code{mglVar}} @code{} ~mglVar () +Deletes the instance of class mglVar. +@end deftypefn + +@deftypefn {Method on @code{mglVar}} @code{void} MoveAfter (@code{mglVar *}var) +Evaluates the formula for @code{'x','r'}=@var{x}, @code{'y','n'}=@var{y}, @code{'z','t'}=@var{z}, @code{'a','u'}=@var{u}. +@end deftypefn + +@end ifclear + @external diff --git a/texinfo/datadvance.png b/texinfo/datadvance.png new file mode 100644 index 0000000000000000000000000000000000000000..72b95be7bc9794ace7816d51472732b1632b3cf8 GIT binary patch literal 7077 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 mOWk1oHVoLA+DhoXk$6~5xZV +@comment +@comment +@comment
@html +@comment +@comment
@html + diff --git a/texinfo/toc_fr.html b/texinfo/toc_fr.html index 07d0e61..64bf57c 100644 --- a/texinfo/toc_fr.html +++ b/texinfo/toc_fr.html @@ -9,9 +9,11 @@
News

Features

Pictures

+JS samples

MGL scripts

Download

Documentation

+JavaScript

Other projects


@@ -29,4 +31,17 @@

- \ No newline at end of file +
+ + + + diff --git a/texinfo/toc_ru.html b/texinfo/toc_ru.html index d685f57..ad69d01 100644 --- a/texinfo/toc_ru.html +++ b/texinfo/toc_ru.html @@ -9,9 +9,11 @@ Новости

Возможности

Примеры

+JS примеры

Скрипты MGL

Загрузка

Документация

+JavaScript

Другие проекты


@@ -29,4 +31,16 @@

- \ No newline at end of file +
+ + + diff --git a/texinfo/udav/udav_arg.png b/texinfo/udav/udav_arg.png new file mode 100644 index 0000000000000000000000000000000000000000..460bdaca4dc3372d1fc5064c84f4a0a6ba14dbe0 GIT binary patch literal 17770 zcmchCBnS1Bl z`ObWI*8PLUqE=ORRduuW^S=Ap6{aXJfe4Qa4+RB2!STu(c?1pTEcM>5MDO*_x9Cdy)DO~yw}J6ZR$JjYuW zv-mwxpuUgXJv=;Q^19j_n?ONX{C>K>^78if#s}fGQ9ymionBZ7VS)L+k{$Wx7awH1 zfH3SZHk5n-WZTtW+dc!JxMCDg-v3~RS`|Zi4HI>Zb)ViOP(Bvx&5d2u z_lZ*z*_WG7Btn+T{Ex4;!;-G(G_3R#6f@I9s^3wBMTc=W z65*@;&XYUw`9N`oNXL{`YLhRHfN*Bka^o0(YWc7S`|dP?Fop296;0UAdN_FO!$Oc3 z3YC5IHv5gdbOM7!6yLRJM^N8UV{RI~bEVR@wb2$VcRwv-q8#sVxKLmj?Cg2{*k9p2 z=I(qhIt$gtQn)cd7v4;p?n$!8yD*GanKn7kINB)QRT4NVKQW+Pkuq5nWuUvN+ueWm z7%8~hbztORo67ZikU)oy*9`)~rTIAi-oz$Dw_l%{l*3gV&`Qf2+-~Ea0@^H2HECO} zMeCAsWO`%qEb6dE(=73SOdDj(Mpe=jO*#wvoMm&{a9DlJ{A^Xxl_+XK1GjjeCVa{J zQF}xflOAVjsb7}VntNMos%RWLwRK!$-uo7L)7v|vBEN8t!Dr*tNA+@Zy*Q(9g9^IA zu9~Ut%4~tGysd6K_U`EtdBN%2+`p4a*@Px8jYpwfH4w!xTse0i>G!b-8GFOcA)nh& z&2>C7qMC)2eGAo>T>y#XmYdW{KrR4nGcCT3Sys=#yu z)686o(Govur`qofgWChtHv|s~F?>E$M_prV_Z%X~tD!IRgkOC+&OD|oR+_-KoZBRU zC^s+D7g+Q~FD_gjkN)c%#(GMJ&tr>Dk0c}DehPejBCTdyi@Q@(_&}5kw~=!n+VxC6lE4kv@w{>b1=SQwT1 zEu~B3HQuKi>5GF+8f!S=P*WT}K(Y6

NTA&W0Gi^ziIXlrV`zU~&0JS`eN4w9Q^d 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 WTN|rw1^GclC{GmC6}~+(3;JKm>_DLa literal 0 HcmV?d00001 diff --git a/texinfo/udav/udav_cmd.png b/texinfo/udav/udav_cmd.png new file mode 100644 index 0000000000000000000000000000000000000000..d222c3e896c7178f648c1cc6a069b955d4ee7e8f GIT binary patch literal 122968 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

_M(!gNASxJ(yr7saR1<;B7BR0Pra2F3wJc+IyP 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 literal 0 HcmV?d00001 diff --git a/texinfo/udav/udav_data.png b/texinfo/udav/udav_data.png new file mode 100644 index 0000000000000000000000000000000000000000..686b1beefd614460579470df5b6cd326cf126c27 GIT binary patch literal 108821 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%0D39K370noDPXHW!{L;4v&3(47*-dIk@8=gP z0Y$0n3jAM2FmjIg)nLY+->e>Ju{qSJ<#AeXKp> zx^|Kp2uD(L*>V|bWT!71=<(dr7;bzWB4&hq8JL|(BH$s<>e_f(gih$TVMbrw*OLWX zx{u6aZ3L+YzkHEVO=yC?KDvJoQvh0Yob6yS^+H}P9u;ex$k0FfN~8abESR1RsPaCu zQGn&%w-pB@{n+nKM7S>@m(&vtYEh97cjY+Bq~zI2OcCBL_QvZ;+{{c!XPbr1 zS@_P`I2`xZIgpfZo~~&z6=<$l;psri6DMf}rf)Vvn}FyXT2+@%erk^Fq1O$__Wix7 zI2m_ZIsL5nSmJ8G`2b9!Up8D@RE<;3sBrPt;m@|HEA5JPo`@x?F~cC`brjv(6|T5^ zLLjynI>qxCugVzTY%#!g5YE&Ocq^@j6L$n{?*}V_9rB^ykHZA6Y1lS)3~;h0--W{# zim0L8=i|Msuk7Kn{Y~XeD1dy7!D`pj zXbiopHq1a+s*_gQKiRo|h@;9vZ%aK%lkxd39>f^Y^9Yyoh6UDE z*$nUi>bdn-4rv_hC0)S?vD}bx+&) z-%@w;ns(ST9!V#MMv`$xr_I5>tL@Uwxn($|sTq}Uj!N%mNN5}&$Y`8Cj!yRT1+`&@ zT928z;OaO@^=tNU)&QINDoZ6Lr6kDn5L{5bC?Fx(WecX#5+|RaP~d>wIIK9|tc9~M zw&!usn7IWFM8omiNm!))eJBr65FHsd5t$0r)^JWxrG)lRSX5U08HWIX>7J z7OeKq{QrY)!F-|b{}o%8Jo+bFk0$%W*0sA}YZM(OT|ARnTU$GvZ}QyjIQjO?;%dKF zR!d`ZWrh5?M#hH^4x*zs>#(TE@fdu_Kt6J?$n;Wb+{$jL-s!!!^MVJ)DdF+ZzPP(u zPeu%emt?dlzk8bZ`LT%exq-FroX^kiEZrYsrOxSc>WzCG=r5Ti;Hg?y(#`)y&bPS} zX+rKVGi~oHHu`iMm?(wpC@9|1=DrHX3c{zm*+7EH1dqzyfZJmQ2!Ss$?4)R@`{qvK z@F<4w{_65}-qhac{*l-p*+()HD_Z+e8u$BI$v8^K0^2rR+|d7rBS$>KhkMWV=~U{E zP>c-&k&m#n${Fvc@xN9RY*xSqXkzc;QFMCtk1#D?LS*)=BFIcDjop=j;g5RB*uIVM z4HE`QP33Y_90a-$5}1F>Sd=eMc89K-nDky)mAKoEMpvJAHq1ua+GMSpBdLEhJMON{>$FODe{%AL*1+D$lt z$SrB2K zpB)!Au)UWJG3BTEqdU1~bC_f^mA1wa3H`UuDc)=C_M`?Ap3ugV^?HBra~5Z|0)=7+ zizOV`VF~hwnTDaBWP&bRUf}ii*Z5F0zAAlZJTd2W=UDr?l{bp)&ke;5;U8V-m7mu7 z%sqU8Uqr)mxrcf;AJ?&h$Y9$>3f#xzDTvnNr8@KR*xoI?g=<3zseHVAj-Xex3!Uz& z3Rh7=!VURRDbb=JT4y~2m(CyjO*a-m)fEPmMrrOi5!(({VrNUhjXNpKd9Z~G`Rr6Q z9a6Q;p%wlZ*708L@_&a#(b=Jl`(vwxXiI)azo}tLQ8!Zf7iWd1*X6Y8;b|1LpyV5v z+jU2Hr%%zcfx@ge+^a>*eB9TsW)=74-Cq{k1;e9sGx|W1Lq=O=r**JG*mJp}oh`XY z7vzt43721Eaa(`lh`I?X;;Vb{R^%n=_h~XF7K4-YhBj;3rj-7NC}-*f^RPUPmqj+o zFV=M8%U%X_I&4#2PBBAbQ29ph@_y#Rh-0z9q9dQS)6+DiL~ zs>RMl7-2pc1yZ8dxO|?`5Ib|@v3XYG(PX`1XmL8FtUtpF+9nsokoAhSDz%w$o~~|8 zURlhbZuh!Lm)�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 z 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 literal 0 HcmV?d00001 diff --git a/texinfo/udav/udav_light.png b/texinfo/udav/udav_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb1a67d84fbf23611ba2c9285840f503eecc09d GIT binary patch literal 70752 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 literal 0 HcmV?d00001 diff --git a/texinfo/udav/udav_main.png b/texinfo/udav/udav_main.png new file mode 100644 index 0000000000000000000000000000000000000000..c93ae90fdc26e8d4c5b660bfe9334256acd1fa70 GIT binary patch literal 164679 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

$$*^UeN_I};Kr8|4sB?n&&vR5VT=x|N?@(ssXP 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 z�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∨Y-V$4bo61Yf^h3QI9|GaANE* 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»NEA?C+n=4KiU5!D*%J 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�HYpbbj+mDO3mX;PoO=~%p4~$XP>yg$v>vhvUj=lh|NOyzf`lKWn-E;pg zV3zMzP)$gL8HVA*^))1EM&Hhb+Z-2LS39}?iLsbp8je~fx+1SCtccRENy3}(*8~MT z=*;58mvwrTgCDcGw;SA{eCCuwHRttYqm9KLcN zlXrjY(^&?wpw*q}d^rCTARZW9p)1sFl;Y+4FVHwuJbUcY6&cVd61{y(??kRFs5 zn*pvLzjtM4&|A3{G}_o94!yObc~WaWkbYVkIoa7ITw2vX>YHjl*^US z1)-hx^y6g)@+R6e+=4u3fvZr0{U*k%qRqi874+vq1o0v_Uznk#v`GJ&TFD-arDpa7 zj2j78W>?F74VT?Rb;2+tvaPr_sd(j&^MmMsPB!~%dZ%JMH4%NjS@7MXRx2bLn}5nQ zoeizmbgx`h{!%!g+YRM229jqkG@{4&!G z^Tv!EMg8-VwIHURpwVA}(8eN2Ik*6A009k(t3oZrt=j)>L7p>k=wI{an5P5bFFAv* z68s)F53M=rnK)fSA*?>ZWN%OV(U`j(+$ei0sHUGX0Wyhq*PQByU4x(bRvl7QT>{m3 zpY{Qi#Lkmn++Z)xU-5_#Iv;vv5QpFSKM)alidWR&PFwll7AX#nHi&SJQq?;G|`s*;zNR(?+BC$tkw%coxL`T z7V*|Svk=_HIt4T*S#_vA%_GEJ~>Z^tUlEhICA=V|(MHFnOpFcj* zhl5Bsbh;B<6z`F6uA+Yivy(VhcY)Tf7`Uowa7R zLVqk1xo{2{ePlMx%DWT_ag0Cp%xW0u778**g#CV^${w5UH9fIz58@SoanTU6sRV-Y#}x6c@Q~iF3I*szig! zCzcZi{7+fm$7&PluXgWl(Df%?nmBe9jL%lx4O+dK1F$B>A9%w}Qct)OxN-80WyrJ& zIHny6-bU6xx`>;7O~XIz^m$LX&Gj3(soVi7IQ% zCF_lF(rdn+05ai%n=4nnb}OXsxB;OyyeE&SzZ*jD2xUo7N9H-aYSdS!x@-GEnFwYl zt#+$(>WxF(tHU_p;}g-+)0^}LaSG68ps`qPnBp_wY$?GLWN@Z7zv%nf8<;!f3R0_-)?Hgp(2elWApYL=sn~t z?oLPaMvJ%;d;c(_dhJ-tR%HPJ`vs06Phi0^a zE>q^lR*}>Igz8Rx&@eDTLHZwdoRI7fnjARxwWj#30P_9+jX3y!O!fYYa~OvC5-r!* zAeUl^4|_dC0bvc1yAmC`w)5M`#YTZ3>fdF|2l-k|Q~W3_K5@Frf!GX4`{58$EUeF; z3zGh&gW~=gKrrb_7F^tn(q9l6vaql)EiE3T^XX1hP+D622hqpvXzHIrQN?A$efVKF zBO@alJUkB%WERz;b5WdG2Rj`drSZ-rLhx$Ssj0QII0jB@Bz0WW4G!#B!!PLNPZ*`L zIGxXb>M3_=mFbmHspNydC$#(RMr9da^b-by`Q4jO+WN&zhl{NSwqqwX@HmA{SacpSmGFDBk517fr z1tp69cebCruB@!xWR#=w`b)iJ~*O_q?P4Fv)vJ#ZoV--8*qFd|V^ z8!Vg?1NaGHS?1O<+L2!j-JJ6I{maf5666KR;k0 zx<<2jp`Y>Q_wO%vs?}Op$jEYTGYEhvtu7NY$l;3R&CcC#wGx#_hGxtak^D-!HmBe#IsWJALeoQXq>|!u01S5Bf>8oz7$$poL(d-W+5n z%A!f|r=Ggt`X&G22k;>kSYhuh+#hLea7c0&Wa!dTATAf(H~A2?UbEJ z$LklCBbhv02%6543xA&Lsizc?M+gI*z!t1Q%-tkVhO0V!rJdip^^m; z?VoXa7&8by#6f`;O7Bk@978}1RSfv0-2dPOn@jf(w48@&jM4)MNJx4L5=+-YQ-XWJ zOThSN`T6yO@=zQdy-0)t|G&PD8SQHtK;G{c67%qMDKzK*B2Pxunf*|D@%q2~LrNL- zsG4u6-KQsKOv00z2E7g(Sy55U+S;4{j3*}cT3lRIv=fi|hsTyv!>o@Z>!{U#8QY`DF#3->$E(-{!h31K;1ut+Takk9&j) zuGd??I)2Trg&6PKIC5}XpKCgB4g5QGH4T%(5)2z4+>VZp4&N`t7bPJhLn{*oxBi9nMsq`hqlE|ugxfv6gq1~kb(!++ z53}yN)BgVkwC+j}fa?gv?EHLzd5D6QB5C3BB52X$iZCJam;>4Q;nl_Wu)Uz&@FRKd zLTvvz7eeHNF0=9py-iv=_{v z@_p}9s_^}0BC~bhv2}sRgg9>Rj;3=5`AUWk9I!OxlU4uQGkwATP%&wnqXe6aH8piD zH#Q`vudldh*%3BRU=Y)-u_koLaN%Rxt{6Sy3J1@gA{+nA=leLLL4|hok;1cNxnkBk zoSKmp-mjPJ;Mvk4XC$zrxJji_6ck;Bn|RfJPM_{Lk9Fjc5_VQ0H}-kWMj6TiHFNFB zC>KKOnSgzq-|@_qp1LDz8O^gD^Z{SB4b8A);nEd3$wX1k&E@lb{nuwK-fFOH>IRu~ z=RQq;eb1wkx4ou~Bz2+oH9O00%#erHP7}j$@os{n zaAVz*MEbXE@Hx!K$-FvYN2SFw_KJ$#`-1=VK=TE>18f7|C2lKCQ|{7a^9rsbrpmnm z?|9uX5<>mR3$&h=H<$1{>ZstR^KDLG0w-rO?Gq~S_Kpm2Qc%DEfZeR=bi1we^yD&N zD;jhZ#R+->g6_kUdBtdZ-0zyZfGlr5_Ldl zVs;;4uiH#+Cx|DyYJV-&g~m(OHd#Dg5pp{1^9vcQH?Iavl72hZrN-#O1#i}R|utD=NJ^F}7RHj{e47}fuSr6VhVW zgq*(8%4)M*R#vs%_?AxS&OR=^;I#gBKEj37&{j5MJQOIUmvBjYwLUTUM~?72Ox3AV zCdNGjnGZji$VJ9Xb#ZcCo^bSQx3=c$`h6E^N0F&Q?m6Cib90lJ(e6s=bUl?lgdid? zi$O+be2bodl^G)v{Fi)W*9|j3ZrkR|woulZOE527JKM#udHXH>Zbg2sO=eePFIDDJ zY5o^+?Xd%4wN=7^W3HfeF2)Sm)k#BT0`TVb5|4JPt|d*TeY;`n&GNR_8X^*dHC2@ zhganSYYcbQwmZs#Z4$k8VMRt10zHp!Gsbp*SeZRrs*=qri1NUJlH zpaZ>Y%ig_Pp-XR8ks`tq5hWVnhRt@jcZ>BpDIA;4dUKWScDI)gilJagb?u9Y^!QNV zp*5fP!%(nbWX9LC>z`Vhnj#g^KIoV_0%eq&S54&JO}G;?|n&n#P}+ z36!@d$ko|ooTFd~PFe^3_a-6&V2+Io(n&LZMt?jzO}6IO!f@cn+N7_d z?^gIoX&j9YmL?R^$|q@$fhFt4`|*&I<%ZV=uv1j-?j9`?J;};`ZF&_ajklud<4)MI z<{Rl6U)ucC(-m$wNSqfm?DC_g&++*V0+Gc@%HjuaweI*ZhyuapG>jqB_Aekq=lN7s zRG{1At9aSPgR$$dS$4VBk;%?<&u^4q6_tVMbDgr_sHbTk&L#n0b-WNreCfcxkareGrD;TvY& z?F|oNf?PVL9-e0U0a9A0OZ0?OW7eSaE*HEj%8wnQ2=mW|0^@(SBwr(cocf;OFTZj* z6s9tO{JvCMo+sCY|IbF8VNM#z)Io(kbT0?DGjA>wFj1wg^}TnQb36dune7OmhNRZ? zVs1kfWkIVQOY(XcBP%3+@2q@eRSGHQ#)6`925lk8g~ zTjV7HIfH7k0{{R~4bLmfw~6X92tb<8$EWnd>lGg!FrW}H0p0Evr8{%RK@uT;d96o* z`g8nh*%>Xlh7CS!pF;Cpz8Mqi*_Q9_ykT%L>imT|bEj^ay8W>RvtCt4|byV0A^Yix#8n*a&{=Mk&rf z9hs8)Qz@fUw=OCwO1r})8jnkbb-)DEWWHFsKLmk_en91Pbx+}x1*@T;T49hv4W;hsU*_Q&X-2d6-q(1+@Lc}!ZX~58+GkpY8xS99S|0Xu-rc9e4hS3w=030+tdJYt+{@(8D zra%Iew%&ObloH5iS0Wx!d~>^hXl-LL3IG~MYs)?dYhdx=&Z~j?QvDB;!X#t3GRQBv zsqvF+5!&1qYljG44G>MtZ_p{mSmF^u`9=FR8n6@ChkQXmHfE67LWcWh;cDyUo9Lr8 z-ilFP|1pzlD%}{{*9pOiKbr|lUD;tx3sb7m+lDkg<`Grw z^3sB9B`Y&gl$TH9%qk@ydk*WeAmoh2hDX*N2`Tk5cj_}s9l34WP|t_Ljk#FhJ1Evj zj3_AaVPRpwMg`v9U_3k@m6erYVbH)Io9`St@ajEPda7wBM#ro!UnG$g;!;vDo}JFF z2bG5CC2Uq=&|1>d)JrIkjYMAB!P#k?ANt-)G$>Id46afgdZ7U$@Q&VnU?pI(_qxn- zg}X2PagucO$4LCh@rggbhky%ndSot;LP5Qj==TBuS!o9e>gD~cZByUi(|EK5uMHh0 zsL+dH0E9-Y(}FLjTPKMFOLUH`@jsG|_}n*#$Bfgg#(BTDhGaP275@}lbC*@)vkwmK z5&IpQejM8IhHgVMqv7So?}}Y%zblB*CKk)bJ#=#x(S|5;>usU4!3XS4J?UZiRklX6 z>+CG=qHzjUN<-)U!2Pjw1J)8z+TW6;UO5Z}n846Kx<%WFjbUE;bcvDEpf^vHHnVH4 z$uk#J&L+O1S9hHpQ>MCMuV4Zj>`?u(H7k1l{N_b7IVo22Uj5Y+kpkLivGI&9`2zo` zy>S&4d&V4&w`CYrx|q(^K-EeN-+v9dz?(HNj!{4!vHL3c3d3B|`;y>vzpofl=3ft9 z^z-U<6BU^${x?8nUI*{ zJVT;oCBa@PD+m-fPwJa&?IH9yjwY7|LP9Gj037S+Bh<0e>kH2-V}Ra1qiyA6G$jO< zzNhbY#_^fN2jpv|av-wwVcDX34HmPi6>ISNi4XU$PiGbpWlfRg&aAHiSGu`;4`kjtsTGutmDt~laS5Eq5Q4idCABHy$dOW{G}q&S zcY6z(ilbnt&2uDBKrm%VWg)BHOZ$1u z%2}%q4x3;3@x35SewJQe%;mF8xve*0l8 zrnvjiOISOJq-)2z)c`o!Bs>G{3`qa;eP;@M&(0ao%Z{J1K6-J)HYo3qho`Ua-^2G< zXG|TTy6x5vRkpMn!fdhB@9Jyl`ttI#RH}b)KId&fuH?&xA)uhv5nEp9)Zb;* zf}uh(@M=3B+zRx`q9Hf^y(8>qvSfR*JRR(o`%mAM)1(foN^uH?*jZd@PSF-!OUz?D zTaI3$>q<4DZkNX=rAEkt*AVG;JUw8J6O0ru{LV#*tiUdsP}=9*Os}r}ZDit$uQUET>19k#YX^qH zPq7u7R)dZ_424%5y)W-~kspagM|-KwQfR`K;O37Fu~15QADT*DFTf}0wZhS#(3jL1 zp-T3Ez*kR%Hg)~;EM`4$_aPSv3Nu`+vaAdp1?6SYT>!Z-7>QsjGAzuc;R-!s*_W5w z|9546MplxQ%~q~R!5&P{o+jst73&k!W!2XpuwRTt^eHcV|H`Hf>E~B3AZ_Axcytt~ zvxO8|elh%WKBzxA9o_VS1Jm3*B_-u&u711}sq5PZ6?cdb@s6kSq)+aQBq1uyGr?)y z!+QVTjnLdxqXp(M4yKrx#O#aHyAHJ9gZ7 zp>va3NZ<&3H&A(g_{9sM3dMbZF5=sDo@p#umzK?W_s1(3J=c3FTw+VbCE3m^xv z{YC`S?xQD795i6;!O_BfIs1F#_A^{4PtJozSgATLCza}Z4Og&!6AKF+oGu9&X}9lJ z&bT$x0Ou`6?;cD-Lc*cRA?NFB*IgqDrRoS$@;}4-jp}teJ>1!7U4lNy)j3`+dr}T? zwr~$3M4^se#aDqOBFSKlpHh z-J^bJB42iQ2nYuIx;NJ=i?id;C%5P^w7K6U2e6yA=kTeKUA|vB8XAYHrr<9RLW2Y8 zl^%XNZj^Y*RE6rXV`ve}+J7B5y11lh{&cWs>2#2b9KZt0UpNFyzz5s|JWjsdGC4J9 z<+*J_Fk&J6jRbaGs*WS@+jYjUW9LpBeP3+j|70%J`oRYnJgdGjKq4+&-m!N>>|lc; z7dU|R$4>!XE=r*$`FGgNKzu6!58z)ax9qWWJf|fGjctgs@TFDcB2ppY38dyaw7h=R zQrj#7v5zn3=98L|0lksvuG>0iVVDXT9qTbY`lOA$a*g-iPdnSxqf!u!dU*A!zQkow z^rbvb^xJGi2}G5*(=}2yDsK|Vz&ryZCd=jQr}HaQ!GqJQ>!XDl`(Gbk0guzOhi8+_ z_UsCo_VlYHKXlOhQ?`Gkb<}L&;kpx9bTp||WOg*QL8auBDPmYImL$B~-ZNMDy6`6A z>^c5@{uCy?iggDPYr7;CgYWB&n$>{c1qp%5B(Gea_&%nLSNzXSaXj;A^UX33?4R`~ zKe3Z5dWHz@y@=FpY7@0;N+N6@D(ybzc`mzUvjeWGnvt*mQW%(gieCjPe?zJyzt?!& zT+Vum@3y=Qa}UwhHYSaN^4k$a2oB+@x(mm3_sQD7VumEYy=$UX1>)7c&{&4&;mE+n8-li;_Awz+c5Iv^J;k|?)8 zu#cOjzMjuhNUC3roh%p6K)Dgv@~oqby_>J-mz8r>};n$0^t*}}4AHv`v+*B`R` z2-cil{g&-1wM;y-A9>6-zr+P`AkH4J$b_4KHs9)n%w~Ly1R_9uO-%6j{o$%6UAF^B zg}3{e0;i_CUjzU^sp=aLGp4M`w}$_xY@}6{!S12x`Pq&jd3c?4wR&n+!;SJ$zpzJt z3#3N*sawyF2)Yd636|adLdI(Uq{zb^%4DirX$%Bl(udMg=TCr(NZRRf_kMX|eCV8u zQ^45qoK^9W0m{@fv)|YOm2HVA?F>h0_O0&Bu{p|_OUu0D#^Kj(e^?;Z#)LTy-8b+F z*Mn{f8h1sF+hTI_VLg!it+_??U%(9@=iSqI8w`jN+$eEh+-3=;EzbbkjUyRJ7RYm3 zSKBiLhS(+A$jk_kjCgWL_ zKR(rn!%i}pR!H29yH+m%FXk&*k3{r6TLFZ+MIGblkQjA-%3eM@8Dy*-E-~?!=ci4= zZ2?ojTbX0g@p0_sacm`7kTPl^RduHX|8Jt(gtutDk*N4!a6obW^9 zcL|@bP75tKk|xNLft1rat$!MN7*I%QDvi5rEo(G(&UIm2QhzhF~+hL zdpxHT2K-&7XGtJtky1`|*0W3)E8kZxKnnv%G%QPV7<-fME>@CY)8x?Td3(u2?z(`z z;gm*x<5!;q007-RJpp9#K$h@)?i$Spro7v}p@|$AX1gx4W>;Y0bQ-1<(E~=RG@K9L zI}2jLDy@UK)Rk#VIDRwnar+|uLWBxnTa~{76c2eTb1V@(S$ncSjL7NZ+VKrmJ$aTM z;GB^Q`<1JdEvPPo zJRZ|7mXJQ#n6PRqI&pXbxY`y z$ttEf_X&)5xE|xr@2Q5@%7|MQ^0oA{Q*iY#a&uW8pncqxHl(CMaC_^E;w44hrPWJc zuY(G}DOI_vBOMm!WIMOjGSS%QZs<3;%&yRx+~YH-3ZlILfL7;ZXI#XJE;s;UA{cQb zkNq2Ua3&m+yjZ?-EK=6*zRt*#J^XFx9;Twco8-&^n%h^(@^UlApL) zx~-8A6A>I7fBorH5}PcOFGbD9)fAe0Isy&&jY;riXw1{nMgn8FSZC+;^PRnS%&;Zf zdw75qNq+6!I%YHj9vL6w)-ATJGCk+-rzn;&uJ>wjf0$xU`h7~F6?tHe^dUkv@6Ipe z!ue-_+Abq=H*JN~c4`H!M2z`r^tbTuZ^)|B{vk%A^+YM}6?pXw%tsY_GrXl*H{CXT z91nM|cMNa^KXoXkR-0F3BqgNc=Cra2#j(w9(L_X=E^LGfEy`f(f&CNiB$+bAVH4M= z-q<6e%H}s{eu&2|nQ`+q-}R-cP)*Qw*RCAp9iD!AIA; z;rPoM$6>RPknbxS_7kck+yA)5Gc0W*MzPCRS+^1P{#L()EK0AAf$hxX)yB*BH%Lk= z6vp@pPNM2hhKUTqS|*9vg$ZeZ&d-5wt=YJ$=WP0ssiYd!cNe)mqn5rh+DHi(<@<3E zFTZaG=VP}|*&mFBa|P5ilAueqK0r9BRB1jsfgK}-WFq7+QNN!YTPtMZ;vVOQfPew) z3{oUb$`IH0Ic4ef9_u4mA&3K;xUNn8W6h(QVCy$RyuuU2rd154q9Vh}J>RCt+)O%jwIC znVKO41IR0hA9ZN>EJEpn##dGr)Q~M)2VehY@qZLFmBrO;GfN4i{c*LnbAdr+?NZZn za=M1~B3+wSiKv0II*5Tm>&b0q`%c~AQMd08XL8XPbHjpsY|^fsgiG-@xYr`9&NK8; z^_29Z+`Bwyo45XCrQ|cy(KT0Ke&3iKXI9l=IM@da5s)HObWCYm6b7Q!DDexN()M!D((W_4V;~u z&X%ihwrlI^^LP13gMlG*<=erj%Ke3|&tQFwXjL@f9*D7`t zaM=FWdTz~8+F+gPy!h!F{GX1baerQYtIV$I@*eX}kvK>%FE1L;7a}pbW8kdNZZiI@ zzKg_OkK5My@Wsc%6IeU-0S?qpAk^>JiMR;Stu^{bmOPBF*PsNk0i_H#J`a7^eLeoa zv_xP(NU&5{dFA^emVi%Jz|nMJVNvUbj@uC)rK(s1aLj_$2G-B;%90WSSF#XV0afLB z!p5hm-7nDo+V-`z>XJ7EJBG^YYBHpY4^AyaV8xdVDyp6!o%a1>=4MsMQQ?DfEJ{@# zN>y?l*N|U%$ERm-;n2FVQC?4%(5Y{GS6q90M^}SU&IE{lv2&XkV|uM2zFm!G+;Ssb z92>H-=+Q?7_a?DKxQJK4KB9SL>UR&8%ZjcL$rWFX$33n8QWmtS75U}GRaJrgcM9t$ z*q$A(`j|sTjGiQFZ2UkG@h^$hF;rP&njfPjW-E9AdqSbZ*+K*z@IEQmDS`~XgFvnW z{B{jgcPQWjZeaf>HRl#h2>l1=|8ZIfekWgHH%<*#?~dKCKYxyk=z(Ies~YMiW6%hQ zBao1iIx&Oz^B*ryZ`kaYo>JcbbOE+^&{+z6M27EIP)K-Z0|&QSojtXEf#pN6{y3m| zcgWp$%0>o?9F}YertQZ{44se9#Koew(^<$%@6pp8ugX+UNC~W}Y3o+}zA-^jvGOUI zh1c`?j!e>f)x>;7w0r9h1q%NaXX$UUK~A| zwuwfESM;e?G2VQtXU6g0wVQEoT9Ti~x46bX?DSg)=-B)I2ED$3U*r~SF0LQ@)`}_d zsGWB6XghzNq$PRgd74<<30xT3TDLFO89XAHzI+9c>mLy`P7250S1<*aMGthjxh3ohyL4E851=KEuw=8>y| zg9~=@9jKG$$?tNVJocA5JvGS;E)Ezr_|<`~u1uWiW%J%^DH0CTFI{+qr?=EI_3)y& zQNZ;>$1L*u`#UTgoVS-(XJ_Y#5o744azDtOu$Wz5#yF;A$<3JUuW1t&?Sy)rODyuT ztJFm`!#}**_Hl9PxKC~5BMK(HL!g&un<|XVoXIARhcr-tR^-xV*V!gsKwj zp10~eYX~Z&Ce>rUZQJH(){i7ErpcNv!aTEX2R8ASJZ_!JD`OU;yphIN0doJh z-YJTEc#TTTU)!H)u>!VOQhpq5BYLHrJ((+16#%vj4}&s9L2Y-XF)lRGIdM!cKq zG%`5IBO*>R;Wk^#TzumBPHaV&>>c4$XgMu;prQrLjGa4Hnx}D}KxCT7Zh0LYM4L)^ zy=87MEWbgHEqIB>`m1sP=^2Y(N+VlBiHUT#lBx|Sm)libQ{KPkd>P10Z01x@M8UGX zCRlrG2Ne>3bbGR-!RSP(y*l9TyfV%SzqTn&Gdyq56RB}wRsBPnR@W zVbwCq`AhmhB`7MsWVVbsF&fL<68^wiHpSl23%&?g9{2uvJsGHoHpl6=XAiLxm?@0E zm7wWEumJOfI>^mxJBy}^Ir^P2l`=9krBvC>SB#OK+!3!TCVOJLwum-}v}2T|_GvmNJJtLT`^G6bHt9?DXYe z2|68|0DJtRKgOg`dThnI8)AwUdU~k!_wGz(aTr=#Yinu218#0^^78V4ER*BW6a>JF zO@y_4y2Gtbsee&Ng@07P(?NY8{eCKwGQ7SzuT0+&jo)K!a5x=HUHxcS9QijZmtA4B zYrvn4Z%>SgbZ-dMo0r^9quH_uKnzs_S+lb3??Seyyg!%@Ub;RHSqSUH-^m~#6frhU zt%doR0tN_xMZfeBP_-G}Wbc_Oe_wb%fx1h-psTt$EtAmh9l(DQj-;Tqk<)E!H5BxBaMCgzo-=KSGfFMLK}i8B zFJ{3_A492-caOT>*MD!D+hh(C@N_ic*0V;UZkB_2A4R{_GcwiJOso8GO-olP|K^2z z6ml!O=6oSP*Col78pDJ<2nJX_& zFb;A(GO4>d8=N8vc8;`;zZ8+!N_YAkC9+gaq;kmhP#9D)Q^vkQ6mRE zJ-rTTl8drQUW{8A$2`11Xd#l}o3Tu!9EnwSyD+<9M`ZAmIfZ;;ZgDk*kUldrt{SNo zdwN;((Jt#t&hNl#I$SC*D^4d%o20vx) zmFAuq1JUPST-f;h`X?H1^WS2Iy)mySCrfyqW=>0g@P6T|+O>C)Ztsl5qd0*A7L4&$ zG79S{-51Rue)`RwJ1YXKwTHX0SjM|eEHUYxBW-W7M}$BDX21cxoMusf?&OV)1}NNq z5x`(U3f5Lkc=;v_oo;o#f+~oBy`7Xl^aa+N>^&)qcOV`-ZKkz)W^khbFNFYDE)$q1 z6$59&b;4Z9t+K^P1@1g-FBlaB!rXMPyej+lVjZnz%p_fH9dE{gvFMf1;okrC&=lN2 z3m+~gXLMEe-(uRJl8p#U@<2>9!v5CTMy&_e}J&JR2HC0ZH0u&hg4Ls&hRGgfO)d zUZ2jv65}Z!tWtR>o9IiI4h+nF|{=_kFBm(xH^{a|W%9PyBOd9?L2A2|%v^ z*v)x$rA2lEn-t@pH}R3{IimEKueO51Yd0zw6DbDRF)@xa1d@(i)bc58QwC(kXzWVY z-bP?a@L*AqZO=lW30_IX<&oQ(oUG+k*0<5KH>4f9c8AmSj5qnBrG8o_T|TLrN}8N9 zDlQx-fM1=umDGVW2~OcCze=w22;bNr*K?xP6V(`X#T%e`RNp9SyUIcJI$C9(7WgkO z1y;t}_!qwD{C3uBKSFc1$stbGvs^C3#|E2*r4HsH>t?_AuAH>|Pr#kEg-cVwIN{0H z46SrR6LvN9@SMb1$ta8yi@o>FMc}&3fDs0IDtcN_H<6%}n{aJ(_)3V^45SyeabIjd^l_{VDFkdg3NAFAeMVVCh*M8f(ce#@@80)@aZ zP@_UYf$7L;0jBjG>Ge`bkCv!jj~|U}f|l=}0S0wylRt1m``tY}e7>j>7gy2Lluu7A z53=aSqe)VI-|Fw(yxJzoHTFtuc+BQM_t-b9_P_vVi}B*kmfh`F+Z{Gxj0mVDr|mAQ zhPZq5t5P=B73hGex9jwNQ(mmPj~NOm8ko66+0O=C@#8UtfPBMS^NBE-1>MNzZo+3Ui22Kp7Z&6G^K*M=dhwRqmJXebfQTF zC*ZdQ^;>#fw#5CoHOeK4C#wIQu1l%42@U8eMMmQ*za>6Y{t+fkqC8a-Uv41%Brd&Ukf{7In&fIL#WLf^P-eL>4dCJ6Ne^#BMmPMwoE4Z>$RHG`%C22 zt4CCvx#v+XaTQ(cS60%sdeW>^2YLyR^=mBen)>m=X<(fQrn9 zrO%0NgBWb0oe>t8`uS>f5E4x@Eu!d8J!jqSX2*y@6fy8;ULU87bd_sR3G~F2^X?Sv z194xkYyMYNLh)0|_y~htiBG{$PnFS&5e%a$0g3O&R%{^r);cSbv5*zb?g%P*kIjJyoSim~ENP{)Yn;uqI>Asx1WFwi4;;-=F>l z{*Ivt+>n2S&Ohbc&DtoPh#-J%GgAMCwvj05y7hSotS9i5Z~F0K=f)km>NWwamVw9N zQ23%sny9WWFF@$DvIqT^WXGMt<&?M1uWgN&9m2;W`P2rsGaJ5s#V*ty5A)%;p8_Ty z+rWfcjkoH-TvE1zDy(cAUc^SXJvur)IpRGHKI;!xLWO3P-hOXoAYd*pG7yr^8=hdp z>yogkh12QR*x6g68A?}-j&ZcH(WSR)Z4x?eAtLXZZLNaGI63&_q@^N%5;>7Xmdn9k zOcBnI7$7rIY4wuuH#XXu4pd1%=4A8wjDg_^uH2uPTB1@6F*YhZdi-+(nVBM^ zTG5E0TEp($@#|#i-o+uN1VNKKUI*CoknIc3zO1c{f+4SDitlv<1mJQr7(9-TwASss z^ao6{QU_vcEnOY#zc~`g=X>#PGMf^kqvFjjheszV7`QO_(3i&~&$}!P{Py(6@+^Xwy*V&h(0Ky2W*|s*a*n#~X_jKe=o4y$*|Z zR)-YgO=?}^H;d^FU?--5OmCk(Er9H5WJR4LkMGs$1*~ zR6UC>S&E5Ol|xfVW0kuBdb&NC%gZ>2)~H?V z{h7jR?e7l&mM4&H(dHFo@|~VIsi5Po*nv%_OSgSJ*zcs+8qR!si~l}6MPKSAS(~9x zv2|(F8;P)r@9Ey8{E)2t1y8{3RezOtrcRKKSsO9++3|DULbDf|)1UmT)3ReS6EA07 zp~nCKDnex=VvR2u4rkZWg3W0^TRoG+_Mim_C^VeO-g7i!a+$7WVZb|SIxvvnz!}MK zM6|B0;o|DoFWp=~Sf+Zo$mGg^!=!o4B}8X&O&cst=i23~=bDhRd=PGFo_4`zoUyuo zR%Qz}&F<_}i-h<4hSkV%m=LQ!8~#EBg^7^a{J8(ovU%EZ{o^w%_71QoaOnyAY8}(o zR$oI{9k~h4uX4xTJ&!dd&A^7q`h{v*`J@+rs3COr%HqG%xV8R1`DmXaNcsxiQwc>_ z;SoG=@f0_;a>g;{F_YE?(svWA+c6tAZ-KEl7@{Y_~f*u_znN6l6u{xW;K0ElWJ_ke*)6oJ*8@5IAI+aOYVNIp z?Wz2BpT_Gl?MOfH^wID!EnIqUm-eDVHmyj7d>mWyZJ+-75QXR`qoMK9vH9XmWuCoV z-o&;W1O%|mov|N?x4^b4G#nqJJo1g|KI%kmLpS{0%~N`9<^Q1ND)}Mi3KYj|HAj&a z=5uYqNHW!$XmqS60bR@|?9>d>Z&kdrU0{li@ph-vAGX?~7j_)J?HyiH%r+fE*I_gL zukPY+3~&Y`z6*hFlLm}H&II+_H_i+{e!}}RQyVr1C1+)0+kFH9Wbl__)4hx0LgE)& zXu?E_3mG|OTfKe{U_vVV1RI;QyDSE zCtlw(6{UrTu(*CIk-r5?9a21x35x|*?|i^5L|){^4Jl|SfO1_mBdTG(&*h-t|8(G7 zpn90@T+<}6tEMmVjbR1i_+*eyfd<_2Y}(|Z6Gw7wy}!LKCq6*WuSh)?w<|a=cFc6m znUCm8RS1Sjv_v=ipH{UwOEnZm4rDzEqeh4wrYy#|@xOi`zlGg4O+meBFIbp5BB%qg zfMg{cdiS%g*sP)4G+SU#b(}R-=>*a$hMCo;S0F+FXrX-D-$3zBwvLN${+}$sv6FeU zKP|{CiIf?X$`j*+Yhzmov9!eMfVr@mfb@K}yo&m69*0ZFSb~zdG*ig~Mb;2O`ISs^ z(Ryf->hQFZN*1Q}v^TqYx=hjRA_nO)06-sEz}BIGH8y|Dm;ok2*Ku8#u};62Dkd6o z(>TEmdk!lOPkdBc#DuV_BEXWLRb(GVFxZ47Be{kMC| znnbWb(VW$E%K=cE@m`xe71(HWqQuc9khr8xRcSfltvv)w)D*uJnI)BE&fFf=9DVdT zaGQb!B!g7%Yx#6bl1;h0HOuPGEYhu1vj05Yo&94b=+$$}{aU1+{X8=SEyuS!1w|A`Q2Be0#q`n>W^b}!kR zC&;-&g-K^&pzneN)Rqq{_KQ}HE~$I{WF`5WQ<0S{Te^cyvk@0t;R}QIb{#Y|GB(-J zwH!gpdQ#MK!Ln zjhORhg56&3DO_T5WK4?7h~oZ3N=SWqW}&tXmXPOScW)x9vhr?^7`jq*m<;g|e$RE4 zAUnmyaGd;*;;9cmb(^`Vq_)Rse|Gap+Y=L``z)8YWtpAx$~$6B0XYcc;WtlVixKtZ zxZ1|GZfEJz2uo^9Y)Y@7`*=9C(w+F_A;Q=4GWt|IJ@L=7Adb%I^_gC=xkf57)d!3} zAb!O_H2pv7`0$~pWw43VBUTX@PhqH5AQ!VxT&?ZYzFpnW#yjL)Q2-{Jf>|lK$}JoZ z4j8+4bqFG&>F0_0NlGHPNA|ak84I#t=lu^Qd(Q**_~XD$(IYdrU%+yA0Yow48=|qy zy2%(4007z0RkG5=f#qBu;DO4B`U{*}T`8kauW^$DT%f%%i5x~2H6=-(9tayan}@oR zgtcn(u$$@;0OIa=>&bwr^^bRS!_@M&YM$nBB`Aj)-vJ2PJmD=LLwM|IoR-r7|I2eK zZ~-5p9zvb7%5ZLWB_%)7{y1b(Hf7Frmz8R|Zg0Ew@U-(kyK}na!jDuBjT&q^Zzx8UE>cs&F z55X|gYPZ$sjD;uqtgbOM$+Wp4A%!UTAphGS)oCAl2YH|>EVhw#XR_g?zI?HLK6GXN}NEp$p>&7iK` zqI)MeD4`|lC#aY1>l z_e@$DR(4PrBwQ0mSuWne&xklzo&&`_8jNFkZw2NO0CBd2-Fvteh~=u4Hv8N7L2xYXNO2IT zrq@X5e@}Ox8OJGi{n{-Bsc^k|=xl6nj*Uu@(KY?>1^Dq3xRXB$_0IXx*c^@d6`P)! zkq&=#OXE|V&a+N*GT8Su&7jbxvc{I*tEa?`8aLc~5}hm7W8wJ6aB%7Q zJe|X6kt`u9=OF6N6$2sl-DS6ODsqL}(o}{)@|S1raNC6^k`y1r&a;grizf=V_cx;Go1LX}jM-a9u4 zfss`<|5G;d|FQ$S>Hb=9gJm;DyMF%rq}1I!NZ@i}xM5>-}JeiYdP&OFZ6 zgLTVBLL%WS1i;w#QP*5iUjBHost=3}L&cQ_W#-cE-Io(fVeWNo!pfrXOIXw0@7?#w zXSbwVUoVv=ZwOotv|WpLJ=lzO?!hz*NbS4(N~Nxb>vCYt=!w8zWIfPXIdEk}`>+9G z#B;eAbI*;Y1kf5bqzi)?_Iz5Hw0WFdJC;yA%e;?E#hQ3jCQlxaUp4J*EWn5q%R}y< zZ>ODCV%189t$3H@zr(liZOAoj=v%mlN+0PTiCizqQlyS6l>}puDv1QmbMA2|)Y+6J zY-V%qmch;lE!1a@PoD5h3Q2{E=1%I~Z-af)7MYjE^<$_=lXXl=DTNZ285~uzJB_}H z-zuou>t?OP@?fJ$^Gf+fIOrRiPeN5ymt|_1{|9ep8QezOtZA8JW~RiBnVId_iJ4+% zW@hG?nVFfH*^Zf+nb|Tktlsn0Zk=!UoFDsRw@Ou#rbacYXQY|#yRW|ccS6qCv3jee z`%@tNd0tNMO%i|lA;O&AZ!>dirbG~{KRSEybCk*V)MIX*O)F`ti6a42*Sirx3YRfa zvIEytUe@YX@Bgx>FwpspUasQ;z@}L-9Ego6Xg-hI#j6vZ0bNBA~-p3A{!C*_0ULs@~8DM&yCwcY)doJE}zR(6PV zXm`WHoP61P!+!;g{sI7$XHI;erK7j;>n}CW{g3l$idD<+dqGy^Y_gKcok5@V$tz<(ZO7 zf9fyl=mdU#A0cR#>5rK137{=}3H|F;6(nkNIm{8lIRwCdQ}n?QUv|U$;~<6X6hjyW zd0_D5ZsD{lBioyy+qjnd+Q4yp1kK-xD!rI84)7!OLng{LU`1xPBAQ|J$GWwy4}_B) zIAu95tEblI-ST8Gvm}s6twIOQ~utGxKrbo8Y74f}2{L zn%#D@-mH2(JVWYOl|@8wLdhPJe(Tfy(li1gt|}xV6yi$}F2RC>Kmq_fYRwgFOLQ> zX?3Jw{hD*eTfq`?eTu@9h$Cq9-BzH$u}3|73T)?bb4uQDdz46X91H)%W*J6Z^Y8Z4 zLSsR$Xq{2ataxbMr6u-JrLjJX-jOB59W|<7sp!w2(|{i-Y7tj%AflB^Pkw0XjGyFi6|@864W8)Dxjg91Xp>FOU@Isv`sd+f zLS}mkvIN@!7q{NWxM)_X?lctA+D!Docn!_hqT_n3;xG4aJ3?*l!f9QTKv$=rwd6M9 z^cfB8pTc?E>l+K?t}+;u{!RbI>nV1O&c~HsVSPra`y%uhU!T~{n>To1AjO8*L?tv$ zqq&ROugdw(XB_b74a%LMTCHMIy(BgBW3?-&*kYBvVcQN+p(0AYLLZvn4xJV4eaFhN z9JJ0zIH+d_$ia_3*oH(r)RLO&aB~eZzAimkT=iF3{~U*k=reRUEkAALo4j}wk01Wk zgZ@Rp-oMdbG|b(;KB>>pe?22cv@}{lp18Q6$QYDAW)V~P!F(NEm7ekPAS)|59k^G0 z1Nrup^*((xGI3}tc13htw*u#LB860-FY^3Ia4r2YXXFdn=U#C>H#U;Z z&)1eBNO+Mqw)Ji)*lw}35_LI%@O7BD+~hh9bkpLzSjVscnS}fknM3_aN&42w&qrO{ zMio0%%5n2!Kqxg^;bGf8Z90I?Vi0#Y4F1~dj9x63Eh#v!<%wg1n{OM`<0<3N9Pph_ zJ^%V`c@jp4@lQxu(Q$G>`jmHp^?Jzdj2@(MON}MaD9vjZ8mX0RWI@YgFzwe@TI&zZ`-hXL5XF zW+3Ck(w8m+MZK9bjTgL+Tm-#TVEhVh?P{@a6}6z{ufMCU&7i3zU-oN?6>~|?TWjc8 zV~fxJ2z(=BYRajakj*?l*8b-dx4NTL+i?;gMVm0Kb?ch^E4~-vVQW?{gLkN7PCw|V z_qA$V*ew%D4Wtn_a-Rkp2zrM>TBHPXGL-d5Ewc&Je zH9RZ_dtW9sAUU`BZVE*GVX{~xqmjb-)dvxSDZ&}DuG4%7=Ctk_dC5+&(@%@lGTO1Z z$8O>?zt{1$9xxmdF%_xd-`z*J5e~Za3#d$8a+q73K|@#Al;|r^CIHK4G2n=aqFFeA zTSg>q8sw@r&kr-_!}Vt}|8+e59T4)59B()or_?k^L*^(dmCiysCIGSk|8f@_tS<{m zi@3b&T!moj-V|kQ{{~#6NBA$vS^yyXqt1e(q+A825~saf=tr+>$xzh0gHxL&Qn0L9 z?}xRw>=r6cP@h*-#yx?URfspZNccNNK~)M5t)k+B_r}3j>}M=9R2-SJPEuoQVv|;d z+2uXOCwKH~Jsy3Ak=Kexe2;B91*DmTZ!*rQwLA~al3fOp001B}?-{3eF+SACj)VccdI^^G$RoYK@(wLbLW2YV z!ovE#)Dpf@Dh!o6H!mXlq7&6zKY+?+AHgOom6g~E%|sh2^|F035Mk<~JZ;!4zF&Q4 zHEnHcE^O1SrNjDQVL6mOSDU)oy?PCq&d%Cg=`d`{x;Ugw&d=^wW)uwDy25^dkQC{E zr0nzeZ~qdqLCJ;~g}48Q=RYqvK<%dg$jRQpNBC~S*}W8DqdrdLpqSYL)c*9JTlxO` zjN$*58U6SCBo_wQT~%FevgpFZXwZifZ3W}<3#9-*g*dAlTQL#+ZO0u$`LSs`zN8Gn zCpe#)l(*u)gG05ObR7r3`WEFV7d$(QA#_$`lQ<-xbL z|G)~cj2e6fpRd43YLMjW*G(s$(dl!=uvU$7~N;EcyE>!Mnh{ z{mORIz$H>OUd@M|o z?Y|S{d_R?XYg*0@=C|Oa|=)E4QN^EhZehc(Cm|CoV#lx^SiPSe_PVKuq-HmxB`QGw-!YHC} z&h>yJ*QDMYuiK<^o#nUuR`tm!=Bwj?ppdcs`cd9j$y6|W_?BuHjge^(2RV`2OaRzc zHq6pIUY7kCB%#9Ikk#~l*&ft{S;0H6o%`w8y~4hVKrKDlqbKZYJgcTdK?=pKB=2yX zC&_RI1~~mc(?TZQ=K6|ix+=HS|5NK{)PZ6kFv}ws25ILAk-1sHv(#;EXh#1cRxj6t zxgYzCD4_VV=T{dM?D_fl*?r~#($JaI`DXeY0u>1xa)-53&FdJ){zx6>t6<~B>C&Zb zU8RkHp2|^vE|*_AWZYWn204;H9K~M|WX@{T_#u8Sx=9Hk3tzR~dwbRDG&B9)s;bn}Kn>O6}(oxGtx_1Tia*_}t z>1{YIAD)*c9=p1KaWh98S*h=vQpy&OMssQWHFJ>^lD^TWYkRH&SH9iEr4wGbk+ELq zTOKM$H#8g!Oj=+~jy!EwP`WR!zI7tbtNxWgV-z_Av;I14w(6{NOAngfQz|CO%qkVk zy=pPGqVqKEOh>~)!n~Y@;N|!$ldtT z5sod%rg>oml|V2^lPsJeUVZ84o>yUEYQC%q6_e$BZD%Z^y!dQ~23azJL}0d;nZx+l z-#NZN<_#g)3^H%GKT`Pl+~0-Ok7Ys6>2xHgxb3SVYOFdHnk&uc%Chso-+sdaj~&!` z0PxNE6WFdZow#PlFV~)c_ZmG2()P;zpx&tkLA4wlK8FcV^W!t3>6#?I%aN~#Mt|N9OX zLu`y1I>emCFVP^3UvEGA&MYOUJr&gD?R!OVIDyr!NFNj>=KVz$rDnA-#UUFh9ER(; zhk<(ko=X$!E`*kgwrOEx*fWy9+bvU1xB_9j>@EURt*3^mx%b!&MHnMi@M2>K2=`f( zC68YnPyfBxVtZjNjxy~)NOw;{+ZF%?@b!}E%J7Tj-)K$JK?c2Z^ZW)YV0x-+9zLu6 zcqjvB9pf^+@XB=5sU+V#u^MxS3GjUP8$+%JKsK!;EPtz9lils zu~(Twekj@#RChdYmnK9)1b=big%OOQrz4a28y`SsgcA|;&^8)C2y>f|w7zy&^%D%B z)@_g&EuCx~c|&+kjR@fU=(?OElzIhF(%mdOoRkc#bLC4vgUw@2YF^{4cw$n=U^S5oo6W@B67}lBhb{Z zw6E)D>ReMQdq%{sio=O))*m%?P+LJ(+$t>Wu0ynvdVm;>#?$d<(3D9S)wKpXl#TS6 zn}wN+M<`99Xm<^`J%FztZdm2mD?g$C%BI43T0FM7kK}0!r+79(s2ht#5%|v7Uib>$ z*ism%Pw3vhunVh@`TmVG7jTD>9KpREllI`p_5*fIfY4QA zl&9CD1PvCD5E*d*bv?C4g+7k_Z1h7ZugUbywP{k(UF(+O-3pgU0T;3-99i4zlvPw! zGeuEFIRO{5!6Dc~>gDpuA^rgWkUW$sq%V2N$O-35j2G63Kn5z*@P$NsbccJ<{`t^$0!+n0dy^sRCB zBZVsR;$L8MAGHhM!3yENkQ`Iwppv^rwb^>zW=KOb^)gG$7^Qbezm z78nYIz(yj$`Xsm)Uk1obhI&P>8v~uq+2{LXWHk9+ul^?HY70bXy}wx0Q{3B?o#^0? zbck5Q?xM(em?bHfP4K-LwSv61jW|VCscY_5vFaegKQL+ zZ0mumjx>^dL)zK)WJ=lb%>8Y(pawgiczmvDp_U$s1i7MA@1?t(G zC`j2x9x|BK>W-!x|8mt&=pzXvNPQS~P}<)vO1jZ>{9^K1{|n=}H3klmA1`A{4o)v~ z3=2m&ke}{$*!!(gCxom454t->ZbxPTYk4dJXqxPIQqvWBEQ@3L=VK zOB<)1#l(m2j`fzqIC>X4R&6tbSJPVf^udcWM(>ej;U4-f8o0#)9Qg zG(a-C+qAz}Z57K!SW{cyGcyQ-<<3F;{+>&byEb(6AnVG_`)e;u>U5GH?-D8OPmw6! z_*2%m2KO2r&;4b5`uoBmRdBnrK64S}{?W!4)F1?esqDD z5H1C;8=n?+lpVJx8_Vs-Tq{DO#o+~a`K?nh0$)AyUBM{L4a$DJ?#*Qs1!mm>nu;mP z1@Id4CUvF40V!ckj0zpr3;b?l=2XZT`JssK;`wu8C8O;gQ#9b40(KWKk!Nh5T3k0( z$%lioDiUHnrc!vNv?_RFg!waOY`OXD*zA5p8FA?loTHYR4H)|~LQCrw%UD^Oy0*Ts1>c<&Dw$jI6YNN?x$OYYoXCOF5*7gnBn zW{(-Pd(IS|n;$e=+^&A>O=qAs4SK7yIz$WBt9;r%e|*5sCtkcNu+bS3EpN_|ubF(< zU5$UBlX+K1*5yM0w6+fh=g2fC4wl7E)lwUo@8c+2y}m&d2+CvWYL<2*7HCNnsqsno zto{iF1L&&u>DLnW5qvwC@;GoJZCDULGMHcFYr`ciunIh1Tq~%> zH1mA4PWrXms;Z_D^-8z!eeNL9%sI3>yW9CGYTzjs4VoSydpFDB?(hB2B|Y0;w(t5Yc;W?D8B@pqg3#mStQV>HZW?HvPiABkOdKOLv_-^4&LLMfL z`fN3e7wT4^@%|{6E0rs%vifb>NU0WaE9IwPurqR3o?k z>2_bnql`)sq|tbN?C)SzuzqtZKoFLMU`$5zYCj=Nw}6gdJyz&Vmh>7S%-5}P|Kb>q z2<%*)%2Y|Mj&*)ChR>vJ=mxI3%vr=yzE%VId4Ef^f&->oz=>jAE}pVG;R2&_z50zk z+h|XpP9)7~$}hdV=u82$Q@Hi#FP>M6RwU=If+Rn=mW;EPpRsq)_sym#Zh)F0@jLpZ zT$O?25H;%*(k?H?W3R0dIn}{y^XKq$S&~Pb*{l36X#*6W=@^!hG?J2|Y$pO?q>y~o_tj7C!ujsgUy%E z@ZneCm!3uAol^Pei|$;sWpxckHcT!ipO3fqQp2+qQ4$aUT|m1df<&X6i66Gakns>1 z?CSAqx%wn7jh#NA&vq_RuWCs!B=oZ{qCz5RwU?a({r(y<@J;HF00}FN#!S$pvC9Qoclzu zhDks-8AmKMg0{oU635^1TK1@7-8a8z7?OyR+Ti?I!lH(oAh`kTWjH~uiEYA&F2&720)MZu*o~M z)HIRp;e7f?(WfP(LVw0&G&ZZ29Bjk8xwiBNnr-ga8%Kp0-o25IWFHKkM6A8#Su(Le z?3tg{!NOFIol1?)^0J5a{Ds!d!cQip4qt zTu6H{pYMilGaTK-KaT`jdwVPwp`o}1NUu8?Ot?}QnA|z8jRL^P+Y4$eR z-y#v*@3bUUlQwjajF}vabdPW9)LRUs&?%84c?~|?)>AUZiNS+BOK^}3w4F2_{p>%) zV8{W04db3)M=k=CS%j!P7Gy4@h@H24 z{PcbXH<-yGu&|Z$pjz_3*IzqmZE(*lw}g+ z9^S2PD=5!C-X57Ohrbx%78wwYP7h!fu-?g_i&s*EXw#^0Ti%0%=Qto8c-o+(L7v(i z6BL=J!GG?o!tt4Xq!4#_6oyMJD6Bk^w`Kim97#yS2z+QKJL%r(Bg7fKJ; zIZbIaxfRTQ(Hg5m-4C+ZH$T za|E65UQ2#_d}HOWZ`JNtZa+WvD6Q-~6~Rw7 zD8$Ck=YNQsg%NFf_J27(pb$aDck^omdbM+Lsrd&X70;MTcgdG3QjLUev^{UOdeM9x zc13&Hg;B{HJLBHM$?RicV#1arEYP=>j$3{6P(fGig?L|m7b3OV*%%WaC-Q;_lwO)Y z+-gtiM@I{c>#};fzx@pomvNNf2N-&JcNQ_e_TKJlo zU!d=jovxEgEr}%Xwb<#Lv3;FSdzOv+R?cFxIf?mjyk})yQ)zk&)QU8LM1(VaNhdFh zs}@bSybuPUc)J=tt3Ng}ld z@PVNhIh`Lh7hZ|am_P2|4emi<07Hjp3k>fjw!Q(r&qmHAQ}7MP!LEb93-fXZ*0#Ti z2@ImSL)xZ7>r8B*zKm8-P%BWFP1sxzt6-~TVm`Zcaq^CDG(adxv$!-I9UdNz5_HfZ zG!W%clad!koXu7i_eThV!QcN~Q`nhE>X*)FdyY5$ydsNDC@aWGqk6FVoFY6DYkLlJ zrA0ts;}uGBeD^MtbWMS1pRpz{gAZ%qg+VQb2fjHgas}a17OPi&>`jBER@8m^`pK8F za?p%T%STSDk{1~lar)xwP&Os5t`!Q48ub^4{C)q0kYQkE^|Ueb$sRUcBHlJVB4hZp zyahGmCWODqA}P%?VPun*l||#wTw}ReLRBddoXW+ic8!}E(~ONY zScjtVIrocF$u9Q~)eXCakAE+Yv9fYwDXWcZz)s>9VZGWQ3zLD9QNHR2LXs0lZosjl zI&}WSujA2!@Wez+ua|ouDw>2GhIrh?IAE~G_92EhYI2J95kpPT{~AT2no>-9jJ_

0|VR-!yX9dAkKe0z^{XSdR(&{?Cbu44a=qR^ggfSD&#z7)?2f0|9xC^p*W9D6@OlZDs1ALPgu!Ay8`_OW z=YoigiMdsUi_9eV{qwzMbu~y$O;f&f)_}IFGq^jsrHMnRENqUrkdMB4ac-HHC_U!v zTk`z!lS|$CqQz!}OiGh5)-JA0*p&u5LVW?0v^)u3^vU_l>BupeNpS2bNjrvR_ zijjtvaZid7+5+R==ipW6^hjgL)am;;Rc?VX$Ysi+X2P(;GR z^=@aDC?R`v6DTk1LY3{efG|x~=MVF;h%kLJwp%S++6e=_R>#<9MFgPqTG$gE0a<=i z$C>Gy0e4Plt)1cKI(l2uwhP+6@5!yk+qb6a-;7sk@vd7+A1}{woBiHtY6v@Qk0@lS zDR6QcpSwme7^tYE^gtJu6E|v%(ob1+eQ{k|c!#ER64z!^IG3xhN5JYRV#6vND8^14 zRfOE=A6=Ll>&?&>AVQ-aZ(nKI34Do1wgEX6emyx1{0@+s_Oi_hK>`>$3D%}rkRI*= zUUo|?n2Zq5qRfb~E+>i`YnIfX$}XgLi7kLsh!0mg{v|xk#WLAu*4A0+@tFxJU!82v zS6C1t9DCN{V9;x+k|-Ed(3IDUv(YfcXRgUSk-K$Kv6spd%`^PK073On>{ZJ2n(S4{ z*oEW;gN);^j^%t!b%76AO@{=(6O9EVTD@d9%8Na2FNq52qS}*lP&{DV)R~>gqV@MK z_15{V5wZIxG(8@VM6_i0pn_jjX90`^LwAlkZV+uA~ z6DHg(ukNY!OqKFu`a4#uaDd;daRC~&1H3T6ZEH`gQd*CU7}c9Q3waH7p*D{vuDLsP zZuCAef1{(7<(t`T49fNK2|GX@b@!j1kuc9zZA)>OuVrwO_r~3G>PcCz_d^ zgzYo;m@9Unq2ftzKP<>aPDbPM_NayV`Cda>Q;Nzc@4X8bd-(HNF%#9>N}=#=Oq~3h z7<%n#^Rv36XnMWz(ksXn@g-m+KRc1oWm;^Fd4mn0e6Yfm;G3`8(to;T!u!< zQu>Z)?akG`pw%p;E(5tcIJ)#TaI=GEfgY)*O*7L_Hzug%vuH=`p)mWRd+-I_5u#8U z19Wka5}1$l4CNcA>osI8=#`XW@UXF|fQvlCMeOsZ)ZvO%RbcYuxqilk%n~X}MfKOm zJAY@A3;D&oP}E4SZDA3P;*3t1#6zPYcRom!Ec2S?8|SsdXa?evANNmUB;CGs%Z++p17#N4dqJ%!?0zp9S*0(|9@4{477 zu5LEg{(*VcZR0MeqaPaznLu8{U}422pBa~4hV8X5aJNBub}_x5WjfZuzpSim3;8lxX|zha zD`4-bW`~p;uk?&r&|vq+afnDg05(z{hL%MV9-S!KgdRmrjgbk^vn=Eh8oB&;eO&Xa z-E~c#1$B8tBh9X6u9)uNK^klU|3?-1Xhs9GR()jb=vxCxn}2t3|DU0q>kGb2DJ3Y` zvb2m}dYn;uzIv{R2!Lbb#Rq3)A$S%R_*nnse5yi9mAD^flC!st${TGS;sKuM=nj&# zA)*#%%9KjlB4AXG*^ z7=Z@}rOBAu+LROk-`^MsrxRqm#zQVuk@@+NfvKgXg_-e$$uTM=;s6P)gd~`UuBt_H z1cG9R@o~2xSvfK3Ml2ix^3BOp@agh-$VsMVR*nNZ>1S}7S}F*Lh(W{J6V9Ny6-)N? z3FBGDoOxkfw}8gz=+2&mKDK7N+nQ-i-l~dfA(qnc&f!^kQ!68(A<(!X@?bFT#HtlT z`3iPP&Ps9@9F&`k2)MS+>gssV2bt>aZ*I{A#g(<4-kBl|4oDhNZ=jTw!6CFrlX?V6 zn2%Dwe4k{O+E(Y{3K^Gn#d?@TYtmNE{pL4|VZu9;;^FL4zvHmN3*T<-UBzo;?Jj%^ zz2Y0oE<0R5N7G8gZ_RG3i6nb`Y&;Zqgjs@+HOg+um_s{EnfI%!i(a{iAS$${Hocqg zXHueuFiwSSU;FrWoRc~ox#a%2DGe(N+re53XUak&7-+rZzZSz=TF3@QU=RRo9Yi^J zY70|S0~^EJ$&|I|mpE1$Bk_quOlngd3Hoqp|5+jyb9G8JEzJ^r4Go9u7c9R$PNcG- z5!{6&?XD&^7}UK1v(AD_wosG2jbsFH@HU8^Lii(}m1faOWf*Aa>ow=pTBrb-pMXxe zp8(x28wAhD%+@;eD64DYh3rD{tHXkd*hYm%$sJsz+BMXHI(xiE=*NV-HR^A;108?nMDNFVKpd@lY7ACGach7d00Rf zQhAXS!)i^O&|!AKW(?-&y%=-2uv)kV-IUVO%GVAoMox)|30tq{n@esnYRGK-&Y9U& zJzi6nH;~>%J z*hJuoCliQ8aBd!C5vEVNhpErdeMy3jMK2o_QO1~6*Ng8W76y*~$mo+^%!E+RV_}}u zGv|Y*WcCO&V$lNc=%nLx%sbv(5M>LG`7V4a4woYbZ?UFq&b&P6C5}tSGl(TAMa)O9 zEG`^a`1N6jsg)he&^~q+lYwe6tvw{g%4{C+Bi21GfPMWkU`CBKhK^ zx}l+j5h!l1D3dl^Z{pH^Xz~Es7sIwd@Y^i()-J-{5GWi+`(c0!`)PHJK!Jo)DpWB5 z717`pmItW6yEs|<%B<_CJVbwv$B;jxwfILl+{~3uTFo0%`q=v6&eg1B+e)@^p-)22 zFV4zpql8#U`KaHRGH}zcNme#Tol<5<;-#X|hBrW@PdpCb>+5^zAB|P&dqqEfdNjC9*)d>V?F5P?2${AeI|YV5~&`!S4kmeT2^M5 zSa%bb*Kr=vlFpIuz>0MVMkIY1lgnDT!sSMms03Ho(NWMM1TTdIx~Gg7#Uye?(%HnAwkRAjM94IZoshL>|S(as(?U5Mj`?BDq$SA9-Dyvg3$^BqybYLtVMb}5G z3#Tc=P%;{DYZV?fwyJfeV1EjASk4*u(fqDbP94s?J8RUKU0<0Y?5Za3=xJRmRjNEn zW26qZ+Jd?MYgbn=k&It#j3Hiy#;_2ounf!j2fWcx3W*1clJTlRXJI2O5&)qqGL`#L zE^1N8eC0vor)^eccnWn`r1V(z?-IqEI(gC|w1|=BeH0}lCt-67C$Li5;gJ!B@&wQ% z6(tPpv3s0w1$6!tP4*)C$$yShwvUI#7!{cxQY6-ioh|oUn=Dxc1Dkg;8DGGMRLRIb zj)IXxb(K7OMv5?FydioIy>1MXy0L?khrSD^-nq%kIDU>PDX|{$XA)Yx@>hk@a+=$? zUFI@r0<9-U0NzxbsFI-}hLYk4P1r4SJ+=AI_*iyi$F6t?6%~}vuP5T-ftvI*44xS( zdFJmp(YKZv!oLZUW7KF>O3TOW_8?HAF1eQcy*i+{k05W(g>afA-?iw~D94>i5ryF7vb zOzJvt@hX%?SI;+{T!F?s=h9AyP5nL*>q+62eDwuTC=m3llT9n2XA`} zho36v*wNO^CU}h4(+x5=IwIXTqB1c8+5+R_g{4F^ElZb4Rdq*uT9Ll-fuf+))X?V< z$V@B!zs>B44M`ReMteu3(bAFKsloLVm4t*=`)Y<4*!+5`#`fyYnugQ^yK1WKFKMBw zR%>vBjc1$iveKh6t;ywmYMwNx*+zGuNGLZIx9LLRTdhstVOzgXL79 zS%lFAafPhRWJvgA9!PoO+7RPFISLD?IFFNWOi#`IYSPdKxC{FeQ6Wmr2gNz2xQ%yi zro!SrT;uqNGEguma>y)g)#>l0D%BL}W20_tzZf3?bK;H{ZlZ5}p}*m{U5W%E4;E{L zg$(8_@T&uE3EG31X5(1)NaLM2*A%x=rpF2gM=tBTUMl^UllNMf(d zjxexX>&bFm&5sE1IKk6RyRrfo+ORw|o?@-E%>`ZW9Y>0>E7U2Am=c;us?nMe7;Tp6 z5wX^%`wQ56R2Q`;1DVtwZH#NjFTjP)sc*|u^{b(G)OE7b$cn|>JogKqR->gl|Mn4Z z(P0!rkXfnQdO4YiQ%wlT3I^lj{kv?8uVBv4toi7tT)a@C;YN!wD~zH<#c`R)6?AWJ zPLv@2oWB+uxY+s9;0V zd4aEH{H@b#^_e&9GwT+cz6tpJO^I3UZ0s8Yg1nYo(I98g(cKRD!-KJ!nwpWkj-1KX zmNY1E&o-r7|9+9a;rI5+SS0=Ujs0`?p=DOPukds8A&X(YBUXemv!W$OwWy>j3G?Xt zx~#(0c_vhls3K!kWiX-kOH18CdHfW9VdZeO?y}pm8w|Vl1CjSL?8n5nm)FXUBp^kEkI7m%H6Y2dE$U|C0sa;v%sD zPWMdo9_4XB*{!C=%LwiR@$s%=Z)^LBJ(@dXKIxstPl@`h8KS#bm%1_;a&kwbqV7C3 z963*tKPJ)xxs9Eozj0vw($YA!e9DabazkRV6&?CDu4<3IIZpa{Ws^!bw2^SX^vGL<^ z3MD_~;hlUL|2fKdheQ8wcN#wAGqTy%8wwT(bO(*$z0a=DYG>!+@mMHRvgx>njvx7c z*M?*$WOu=)(%pKdGDWm~^c^GYyiIn~wKD+#m^LO<<)>brP^U!uLPi9Eed+m?)Iue1 zw>xdKJ-zeC{yvB4=F$>e!=U`qq0W<|yNylgkK<#Gx6001rGi>AFaV{}Xf*mpr^)5i zJdT!Da#v-v(&N3|J+{usZXY^Zw%wnY}360UDzON*1wo;VL@)!j&VtjE`TLjc>`!-;&+=!eS|RN?PQe#2R)(Z5ZOyO6#gZsp>41MF00P`H5Oilo?wL=SK!vW-vs$IFP8DU{(H5` z<<@dH_jixm0zn%cY7UeTs)0;oQDK7JiB&tQ!;e~IUYjl!qx%K8d{mA2TA$4)23!l7 z%dC@e<~Ht$>qIv&Q2U8w$poC7t=<&hPC_cb@#LOKOY)l&i4r0JuwWLULhj#pijkcya-hI~T|As#Gc%rTN2BmA-kGMbm*tbf0ukX}HTBhI?|8;P zy`wrCCSjyRE~7vjaXybou#Np8HAXsm4+FkxX^4`X$5Y6XOQ$8Ir?*>gaFfTkn$3~> z|0E0IQ{Upe#mrY8m=jmu;9YIDQO z|3y~g{o1rXuOyi4B@NT^uPD;_<>5XizgJ%uU8i9%zd&rUO&eR@)woGFmCp0S7}R@5 zLDU9?&y}F+!N|rVW{|yznLQE%-e;-t!F9Gtd##3MrZtbfp6f!W4iV@#b)22?&NXR0 zsOW;lNH92YN6GEMtpx!n>o;ho#jeO6?(m|Og9ViB8(^2cnIJY7p4A~)bLHbVT@<^B zzHlvjAiD0YZPe4{cW*p5m{@N5oYa~5_x%m-W*(0%9eX#}vpdMKdGO}t8Xp^}eD&4K zRldipqM4uslgz$i^l>ra_`E{hdl65IWFG-~ce2nO&uw+9apswD$aY`t{CuZ1{f+s2 z5QR~kDB#1?o}8YkFim6e=!qr&@tWii$mS(C?)CCl#oev_Ia=*Q*+mzMUX#BvIyxOV z+^ih5YsN8~;1sF>8HK;Lwv?}Ne0e!to2LYlSC z-+Xud?tM{QKETRSTe+MN#PZCJ7Wzw{RF}_6j8j9`!eZpF8M(d&XcG;)m1@-@vrWx^ z{HHHn2~kmN?e+#i#?d={!4za<(&_9IGc&b>XKPch2XBQm$rc~&_KvA0b7RQ>R&+3I ziaSUsKmzkc|DbTZ=mT))?2!FK74vxESN$fw^twe0e4;ar< z?Wo^a0z^4#Xo|fjA=_w>LdQ+Z8sJm7+k!rJ^fl?r8@fhfwDT9rQ3I+h#fDbZS z?)(iz>|QukKO1N`b0?K^^!%897AI}GT<2Jo92a}}YABVkLq-MnCDTtwAa}w4eV24- z)3$W$`yg5fA|!v%ZMntw$0MJXL&q(xy~>lyim2;8tO%p=WpuU8v7O-$%WN`(0yfF% zi=e3+wa32J46?qDjtJz919ICmf+BS%b_2|_yOpqyMSaV4pQUmuVAg_^6DH>7_h5SlGy{>0vhMDET0C%h%Gl+(cX{yy@eK z^5l6`-RsdV2MdT(6DfVEt`t~Z)0$4ite=Od``uMu?-u0o;wX^w_jUe%{tyrl;L-nx zGvpZ*Q7?3Ly()9wHp%W>oD(!1)WaL2m9u{pf)?{HaLTNFA!eDQpC%&G37>%@ySEIq z^oO1K)yFSzRdt^_;NVw0a9LTD}#y4r~m=dHaW9Tpt5`XK+}*A`)6y zbdxqfcX=SCipG3)IQLs1^f3}FnOXRJLq$au_;@mSZ&t5tk|58YL4eMHPIw-%tG(Yv zbHJpNTGE9B(Pu6$7wxH;kH@Q7kIF=pR*ZBcuhj-BL`6jdT3eqV6)x5@F!bsB!+;3A z!Q!#JsO&DsXLC=e-k7eNMHKB>3WY;&yEkC4xSh)+@v6u7s?p(6ra^eu*QM$gavxTM z_eu#gfVyVp0hdA2MkVs*ODT!vWe)V?#dHPC6w>gs^~F>e7&`9?0H=HC&i5^o7)XVb zx}g#R0btB5?&J&MZnpebyuEI9i?)7ivHXxt)EmQo!9!xFZ9WO_8y*`ou6%z7w#+9S zOAgWVR?&c~;Wm1#bveW$E6m0NwK<(gk)M$Co#V6Gg}00pD$y1@>$cD0UFL4=t$XrcF*}V*d*}|_2~3I-G&bjdE1!4 zfHd$)^sA6@2hqHkK2qB!I$;9fAxA&=(hJ==no;p((-@U$6>vI-(kLSA) z8|@+*#5#ohuXr!Zjj+XUc`)gu?7y&MgqE`Eowc=j{@JpHGGH9;*7yQ*VQ*@35VP3%F6$ z)pn*s@0*>mw<{$69*+CkM)=BiKb&t>nc#)2GWFCpOWx%f`zbC{fO}N1RkJ_#)s;TDR#s-Lh1?fnWrU;0jAT0ud zAWeFaE(nMi_y{0fK~brK^cF-q0@6Ygf*;a*D4_?5B#_WTNg$Bq9{s=Ehx>5Xy6Zlj zwa%I|Gv~}%Grv9a+k0p4bxz)9U&sV4DeUL=F{XQGuoL71BdUE=(z;$%rk`&O-$q-zkg^`AHoo|cy)I)ao>m)iDjs=Rul^!O8)WSu<9yG zaB)v9{dc#Nby_A~q3Pesr&5{MkgMDkuJoMp|y>*po96 zki7(k@lglyKY=!RdWvc=NO}ZKzaFXT_$RLmy{lF3T8m51mU-7p-<>1m$Vo&x4m-sQ z^&(i}N&XpksH4LkV?S-eOT9h-_fB*X5=^@{4(|>*Q=rBQ!Y4F7Mw|&AwRzwhr6`dC z4G>r6>GbTYM2h9+o;w|6lTQQ4o4TmKc8ve8m(c{Aqn842WpOH({M2_$&Ede6r1U(v zQp0=Pvl00zt^A2IYb&8vkJ*Bs$V76F{Y|VA>{e~^lR!?NRN$2s6@?y@$}tB`*7fr3 zERW&PvvLBOCKGKTfhh0kCg0t3 z26_l&X!d8}Y0Mu~O}=nClpj@?=-}^MkXlM6&nSbs8c^%^uO_B6OsHAeg$x-f9FtvY zJxKs0{`QakWgF_AaT0Xuwl-sO@Y&T{@VDpM(6N?02S!wpJffso;y{5WrzgG|U-GDBp&;Zb+>*+{2bHr?%RH@WHCc4-@Jt4H=*`wC$U zB|kGfd&}+7(xlC$IgY+%^t%|C4xN7EaD@lHOvL4_9kO)#&Q942o@WpIZSTvltCeO) z!!~_KJs!8WT~!|6=$00IXn#O@eq!wPhDh%~{uP8Cio5~rS+1-i`g`{VE)b|Uxgw;>tSykt)iABnaiHeN*PZL@}>Bc&I*Y=XiZJ>%RO$TfWk&<@2v9$Ej^1o0jV7aUc-JGH$n13 z%xSedB_7${_a6J~$D$Y+nr+T{tNtrdNvpe8JuuJtVxv*^`o%$9!V4lph-oXii%NNzA$763IJFU@`_3S)5&}T6%wsb-625absGfcNf>dh zATVZ^F3U^loK}g|z9Zm_u@Zckf=akw`UJe!fG2Au2y|Gdu}t0T_U}9_3x2utdC?Dg z0YTC=D)So-=am!c(3ZTcLfOx(zXlI5@BSHB4^~?nIpXlpJ*~mwi3@G#R2flPjGmB8 z9#wQ(#p$Iv+N(YN5p)!2EUw-cbGO;8+#+?^(_CiYD+%yA`W%ZR$t2CsC`4eWPhXb{ zhtX;jyJ=g_z1{j{#Q$zU2l$npPC$g2hCq5;$Ud6ZwcGH_n*FLD4?BJGZ zp8_mcUqZ--*;e6?!R~Kh`71KQMF#3T5b##^)e;gUYt2^v;TNg)P#d-FPRHTn8ZT|| zMb^Eh8vCB-0qY>E&)}g)}Xim^m@1-8;;)p*Qs;OXIR%{#XiXOzisKwhxgK}m?;-`-j%ut zHfKHB^KqT1{G>8<{|&QO1)Dq(kI@yi*RyD}PG#DurJzPsb^}-frpJz-REtLtc8y-B zp00-3C=N%R0-4gC6y~t7mDV+C$eYzPRm(jMho{}hc`5==)qOc+Hle28vZjF9XAc20$#;P|#?OKBQ_arp z()7~}2^O#{Hc&@ccTDq_4X?mR$`A76&6dy$`#+Qzm0yh)?AMW4Df_Ndk-)ac-L@Ul zzr5 zI~A3Qu~G&cGqGx}*3~cgK_x|CCgxx^G|6y}fR6U{VjB=W1HvnH+Ssn;KuQ@p9);I; zd5Q`7T)K&8cE~b0nbz6adAuO)xwMX@D|E7)W7IDllr}Nz&>p8;C@hOmb2#U4_+sm1 zWAwr#US+F&$9J5_U`VQjW|8T3Sy1lmFU0$*cGXwojIVvZocIEp$@p&iW}FOist{i~ zP9Jvir%&T-?6@mSWP^NK@4>!_|D=7%5|H^kZuYM#&xv^Xgxwp>N}nNW*{<5lR87kz zNkoetPm^}yn8UaAfHdBmtQ!OS{G5YFL}!B3**~t^}Ox$h_~6+7%tr2kY^s2{Km3c%pzLi7WBYD zSW_SLg$%DilWtdxoLw*EJ>veuA+qO+ zlFOqbwdB~hU~1t9jSGH^VOaQ5?+k00v=1m>!NS6J(EO+N4_*xx5A?xpU`z9TTKE@H zJ-8dM9>E%!XSzVuO4`Vc_gWf$n6tGeD~b3=#Aqx*H|7r#s1NQ$*RG!wr5u=zahPNL zGZaj1s@9i66sgqv5IpaG3h5$!IRL{50s5WkqFjpGUp>guF}3a41B{ zpArw~=eDONXQ%pLj@yuF7@_W)m~l6g9%ILr(A(_=ziRpEVgn&58<}eK3Ntd&PhQZW zIYZKGhb-TluUNk*UPya(~#MkHiY1W(aocredL17fUV^#OcZ?~U|`sG5eWSChv zEpir*sm({k^H)cXo7@65TPd@}YU#tiRjTTNvv`>7Vytnf&&E%hql}v8;hVR@q(PK!HaD`JcmV=|8S;V4)?DhWzed}8a>mAEtUWxY<@>pZ zg6GL4Zd=v!-=D7ss11kld+!j_?DIN%-L@bxHSW3Mn^mdv;E% z(gP$48k!g|4m#MViA72^U!rRW=FQeCHIbf4T1FJODCp}v17@nG#V4IFC5+J5atTiH zrx;rP%~pXwHg>E`p*k9VYF zoQt3OTT!#Y$g=;?F&cNQOG#!u;nRNGlV?n<(v=zlX1-a(5d7LCxWaQou^cCuSr|N) zQDpu-lvffey_JS(sS-xiNP0ZOhnV1SvwT}Z|DB!Tfe_M_|I5yxXBCuQ&s;xTDHfak z&WGCJ36S9&5qc$QCJQcwugYr3cgN+|Ka~DvkTFsfZlJ|El)^Gk>+D?Pi)_|O8x!4H z3>^PiwPBoLs+#+_A4*>m(a1spu*DRC z+87VM$gJTI478%)ac+x$4!+@{Sra4n&(>WMVW6V;Xjge^zaZsqgy3vFPRBMg%^frD zMM*?0^59TIzHb$ShZ98YJd*O{cIc+WPRRRNx1ZUj51| z7*wzR>j_H&&v$nvZa^};ZnT}~^}Fbme9-FK6HGg>J@gd>;5?|otNF(zzR>HhCguO` zLLLy(br;z?t#`q^$5DSG)rmWL+=sWa=v&nF!ZU!8p>D~Tmw(WiptD3G$I41>ZaR*w z$Jfu#PZk0R3Aq;Kc_40UE-bADw5!ahcOmF7XpCIIz#<^x?^8JLxGng_sAQn8|9im3 zb-m=_;o+BcMq=e3EvtMqQ8=96 zVf@|g0%lKt4rtp&pnC1s29|3}tMfBFhgQVH&`6>EXotD@>xCA7yD6-`p}-SC6(<-4NL zSB{2Z(|c`w;P3eUvTVDX0n8nUn|xIPr>^uVf$E!#9!M2R_bz|Zcc9A5>@HNG6!+kz zJT}~SXp?7EmYJ$(COr{@uVcCdqtQ_}q zLjGNF$wXqF$F5Aca#2ZkM(5Hrg*D>nejbozZ$a6Du&zBFa{i_*pk;ZSXG^^y!l?)C z){UVNKS=ku-hr&!nQ?tR0lJxhio8Myecw74{?Js>K_lJIY53c1o+lA^5uW)=%?$l; ztG^?gsT=v6tQ>QIA)o!xJ0pyZF4=HV?V+7hKiXf;E#)h@bN>2_8U(MH2;jNLV(DE#LvKUc2=m1KS-a@oe>Q6WRSbmGJ_7Kf9a z>pE@fbtLpc4(bX;Y}r(^>tTqrhVz}ybeY^sKTm+tQy~!a{$grMdGnpGgH%Go7%rFU z?F}(w0og5p?p5f{?*7oLQ>=yrPr_K2_GTrv)_3MwRDv52u!O=_NJ2fY_mNhGQMH%< zYm%kzu9r2X>08 zaeo8e@lThF9=4|aV4GcXM@mXf>TwCK)qOg$g;d`?C*iLgbFFOD%<$4PSlX7;y7k-o zGu`kdc_H~my9XwQ*A1 zE3x5&fY;v#EFeDsF$R=3M~Be6A#As0((Xh1cSLdEh^5X$;2|_qMVuwn@hL-sHgJV2y69HNB)hP@@Z8t~*VS#Z-*P-2+ z`>?<6Xa2?htu_Xjj><|&o!&i_nJ(809Xe`?me-M68Eo;O&?7B>bF@P?gxjg6h3-VyG{w@MKSRN}z!KFyYJOc*y z-k<5#;PPZUkNxd~Q;Kx>E${iME{&QV>`?A>WA@LuD~ww+ ztj=Qm3p0j9#*Cc$BtyyLpkk9Rt{p1?P= za`*6Q!k^Eh?F8gH#tm|>_`CF^zhgIi5OFlF>K+_cST!V}?Tl>$E7u(PqJyf98WEw( z(t?|Q++2Tt+SFe&5J8QPcfKf3!F~>Qsw;8%?d+l!&KY~#Dflf<*T|=bQ+lq>ry!HD zryAEoP+Pz78toeF;E+`+_M}8WSV}SP^KapKa@v78fd~D8<2LD2##E%w(S$gsNtEiEzMw)pQoEj7%!-3>%n(VEv zT9~E2(CsQ?-4#y|5F{>+B=X}Rh|s_-14bPT%M?9ZCi8&W=YQfnm>2QeI&bsvcg05K z85N(Uj&Gl}XnIjv7Ya|++io2Cx%b4uUSVWS8ucnB1=NmvwtsaF9dZsKG&zuwKn7F+ z5fH&sP*BbleUDQ*TmqMNZHktEO#2LI+U4R84IGa~3dYwe?@I!)!Hr|PI$-B?pfr8M zcLbztuOIjxSYl87SvoUI)7SmqRswaN1k92P<@>Hn9fpRxogEn9KvV1L(#B##qvY>BdRx!@w}4VSc72)GU-7zvf`R1aU-eTFHNkCp z&v)zQZHva&@@9HZX*Vb{>7Vdu01Wp`!o$O%(XV@f0OxPyfXg3SH7!dK?RzJ89uPjO zX^L{@j+#kQ%pUbru&s08d+S^|tmAY`W#=0Uf6rRn)G*=N_AZ(0v5l|NcdR22pK$zn z6;E!1;@H@_`yyimnEgl!9%bZsXNh+#o`+D7-QG@T;<3*8?} AJpcdz literal 0 HcmV?d00001 diff --git a/texinfo/udav/udav_sch.png b/texinfo/udav/udav_sch.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5984a10f57d4a6750f58eb965c46f83af18443 GIT binary patch literal 43512 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 literal 0 HcmV?d00001 diff --git a/texinfo/udav/udav_txt.png b/texinfo/udav/udav_txt.png new file mode 100644 index 0000000000000000000000000000000000000000..7276dd6845d5197b76e2f2dc5bacac1d4bdd2702 GIT binary patch literal 31314 zcmbTd1yo#3+b!6H1POr4-5r89&^W=R@y6Yy3GOice*b^x z&Ye4JX018vtUi70sj5>|Pu1Sft_WpCDb$bn9{~UWs*JR_DgXd?4FJ3|MtTRk!hJXY z8+L$q5tUI#LPA>EQrd)_;<-v_yQ(>uyLuQqn*l8B9qh~)TuhwJ%D(dR$?>~Tk3Y?Z7K2%sh8tDTou6-cu`exUEKTfBoSvT2H`}dn3L}xI*Z+2N zbv=gE87<7iPK!BNSXgWc2?;Yx$J!~8NJ8c$rKAvp`9zU4*l}0Ch?c*bnVvR=2OxNa zpjZB2ZY2v*{t(hjND@N({Sy>s4X&O71NlEUrO7dn^+*$#KdCKni2Q5#zh3X#j71m4 ziWevSe>1Z6K?7#q(y{3iEL~xYh>%oiax(+e5OmSwDDedg(^o3nHPC0p=M{RAGrG_KWC2Nf$i+>*Hv5E z3-cmas0beF=C|TP*O!h5D4%8;kperatJDx&@4XFk?GMhodpBd}6z4Z{)6@T+UhE_% z%ep?w&o=lI2^~lui=|!|snE5BJ9+6akv@sp6E_QDg1c zrQ1y_*!xs$U$9s5fPU8*W2ydkmA3AkxA=;E+ zU)9k9H>|LH^ns#!e8sRG$#}Yl`IB(TIxqws`}Vd#HUId-{OGqe+N+kd+|_(Z+7~DV zyT-^JfEEjPwY!eh!RKfM6^f}2U6cEgZ*`g~ava|K^7QZ1MDIc*RC<_GeD5&6FVY3e z!Xw%wJU|- zkTa!$ff~}t9Q`3dQ1QRcgVpL?o1b=>4f70{0`0j}}#E%^8du5Q_f;U$OI5hyG$pvuj&P zPG|!RQre%<)5|=@&Wc4JuG;yGb)9n~y&rrd<}<;4HPYb^{2RexVE10$x^MRB+|{#s zdttm*BY{xsG1>QLH@?IyJ$|4uW{Vy&I$(_!nmdnrCDlb-<1(omf?g_q^7T6)1aOt} z(}lC(&jUPw@oDGfDUgmMp-b%L&0PL{*`v0 zJlg^Ob$Czz;eoA?i|P$;sxS!HDW>tcJDw;CYLOT{CT8P#El6fuds_!JJ=ok8xHVTj zz2?=>s|z3-Gf;Z8wi~ma&=gF=Tmz(xPOP+VZzu7ySZ_h!zuclw0-L6l(-TKL{VjFl z;+O3e-J$*yPm=<#x__wGokrCniN`PNmaJ}9|Jl@yMN>qjTpy*^kGYoeDZ4|eIN#sg zJzOgv$jiz#+p|CF7YOjMfu6wfu(h!dp8w3+$aSPPURiIDIp^x?=xj4*aj{3P1MTwn zvb2VjHh&|`?!*sQ5V$4{CJFiHXBp?^5s%-`bK%cYR6ghNA~tpFd^a1L*jC4gdQ(wz$ zOHQY|xn3)@zP=NCAYw^V0Bu8v^$+%V|J|C;^WjL+u=3aTA1#GGY?dlcq>$OK}?k84fG-A_o; zFZp>M%+xMVH-^{wCrThCbgmGtdrhL8ZxJX;5@&9xHf@372#lmZ9+3IB79RwnS}6?H z3HVE3e zQN0w}Uv9m(zrnl5N<;{v!r`<&sVL&kxSn5FX9y==u;ublx?Va<`qki$X3MkNgQzpz z5v3r5l;kaN9PIPw7Xv|B^e0vm9D0hECtQ=8hNc$=p7dkfINVese@}>ZNZ)CstApR*N@NlbT;=JRr zxyd}CqfX{F@9=h8CykJ@E^l>mWwKp2sh7<=^G|J@Z*GaB98LT41V)^G{Ijzar)vN4YkAto-9`Nsc1ev z>{(2?+*Ta@v``yp*4#07lh=9A?MwF6k0@$kij9Q>wrw{Csg)>jl>tGY1;C^s=ohmu zK7y^TD9lADh?ZDmFD+ODwjlj$3L2F6rAzfq)YHK+bahu^I1^__2bShrtDaN8G8DE> zXNJ=f`}k@Xlive+NXs3-o4g!;@W1?GP~7jC3;%G@{5aiL>(s@vLA>LIgEK^6Cm}!E zk3ecMCMU#_z z^=fa_Ke<|Je(>ds;>DA@&^UPrKv^@$*zQ=pN_D;)A}oaJ`0)%<-xZZ((g}qpI3i!~ z$Rnq-cMIi9MaM?PR9UnIuX8be{hR|rcX<^Ze?VbjNlU#y0(|N2x|cSGbOh1xQQ<*a ztjLnaTM5nw+HCgrdlsf4#e1qe52*zW4NcZ@-&WKwjeghYH3}V^cji#j=qGi&HCC@k z&dIK}?1@kc557$B3C*K9*el{FQp$BW9d({UrIpA83UYIm!PUJp9^`ul4f0N7IRlRm zOst}z72YBmv?;VY-z@S!x@tcHxIeDy)XUIlR=-P?+yfwjci5h5-@o~w7vY7Rq@NR>H2AlQF zgiCLOfK#VbTOuOpGldswO&wUegq4S+XV}@AT1mM^AFG8BpuOyi#vhQ8PSdP0_4qT9 zXjO5}(QbEmVnS@Cxt>hi$R`8ap438G@g`$iP4`6B%=z60X8{u7Mvz};7^AJ0gVBq- z0k4PcnFZJaPI|{dVEDJKnp$3h?3F>|_^aimAPbLHxy0BXj0pCd>4$?$4<$a&8Zcu> z!U)pPZk0Celcq-E3$iLQX}vhD85}ddsDf-FBdxhxMPINyZBqT=c3xbu-aw~!FG}So zqy5|NxL&g2O~DgUh#_Bt#lc|8+KG}=B)6w`YE;g~yFDdQ+n**gupb;9vCQuxu64g2<4*xX zhkll8*IGAyBhU)IV)3yry=Olc@bR=N@#> z!(fBZ+JGC8onUI}XMyf!Ul5WYhgZ()J2tZ)=A|H`t7fFv9MPFvSBptk<|8ih`Y?!r zp0B(4@($U#ySXXX1dCy*NbUk(lG5u_v(85! z&(^_Q5rM%vUQf&PwWzbI+G6Gq^n4xHNgO7ooP14S*ySvUQGeACw>$y6VESK$(+wECeioV zs~6#;?y`#J1GTl<_R4g}{vI+uYDvDa7=vTdF2J?6co##}WsJd6b2~U^q9bYW zdWSy-ygXcoDnN1P8|`;2RXC72-@aOW-Cy5d zOCu7B?R=pRg?lIL>i5`ua7N6!3#jtS<9!GC-ZR5KmD!>G69VxU&IDHZQ%2vu??z?DU+z!z$hrZ6TCR*4B0>g)XVWLBVx#6_?2$Jc@qN4u55`6?$A6EXphq zOmTgiI|JuiQ2h9^34yN7l%Mx?6%~{9WqM`~V{{#Ax^OT&HfCKVo-ERg+norh^-&e0 zS{>L;$OT;OmW+cG;@w_9U#w82gN&RT)!N%GE$JwIUT`fz^2 z`JwvSzthJ0Ya{?*Hsk9nbYLIl?JhLqHm@RtXi$UyRVl9_n|Z6-YHfjhBxHe+2=(#N zjYNIgBzkPC!I7Sv_Cuw|7$(kUE<@a5)AP#Mu?v_UXSYTo@|o(Oq;w@uk28x=`?uSO z5vXhQ9y?aU#;tO?QdtBu!LPl=YT#1Kh$3X6`P!D#Zo+7u0~z3WCMxCD$!)AyrMfaX8pW zd28eJV`lq{lLjBtojM^Kd>#fG}_&osdr6 zf?-*pen>T8YH+Ok;2PQPQJ5@u3&NxBdzm4aqj^uBR=fCMZxi!07M(ie$76&FNdcC#cQ39K&4@ z-#IFMlPsF-CYRO5giL582>@W5wCQDG2&QYoF0muu)BzqsC&&E4IX|U)@E99*nbHUA zZoTCoX~kO@bLa8VV$HSKt^9hIg`Ib}xD}i`Z}Xh_@rC{2$v{A_rmoHF4gG-lM3Ra6 z_O@ojVkLmexsCsECMU?RU4|mDp;ivrOdwkW;-EDYr6r~H^pIgsu6mRkOvT&uQC(~R zebjB+R6R6{TmI7dEj7HfhHAxSUUP55d?kQx<8d_rC>SxmIDcZONw_+lTa}ur7Ko#+ zVpVS0Yk&!Kxzhs?P1GzNS6!SpoORwk^6B>|Y_cnq4jvl`}uj8d$^qwJLSGi4Vy4_4x%xwL3CTZ;;_6Zx{m<^*8u&VS* zo7DI1m;~PIL6;U=KP%Jpq(0qgz^-U`UMX^}elBPK@!xa`;>zigHa8VHEg{zFFYAi( z@s(Iv0)?GDb#+>GRA}5bQL?qbXd{exImC${*&9M5ra#fmzl<%l>JnCN&WwtvsGyw{ zufksi-5kESV2MfBSJOM`Xca`eovl|@R|WdR|4cZXuR8EJU%mZ%Im5;LZ2yQcevq4* zdHEGf42dRegT9y)9$w5s3!=qjREe>waeUryV+5lf_gnQD!^cv_%qqz>X<8eX%^FIRUeljXnxE^oxeS9tn(!p$KI2!J0)nqQKi#Wh_0(k*6B$j)<6fqiwDw8Vd< z#Z$gWZS;x}0|3KiRPC60;NJc*IbbwhXgsem@RO(niR2JEVA43rQ zU3MB|jRW#G{v}&KCUvf@()>LybE70~bvy4nR-O(pHqhix0YGXGBE4>i6p)Q>h2M{t z?G(Lv%-G#lcGcz<6*}0W%!gO*6ha06i2?yjjkjC?iQZPO!TA;7&ai53=ZDL#55X(* zEPDVM9-$c_&quX9WFLFM)(*S$ofwuNh0^tLdfkHa;$-q{UJA7Ij+@2xW-7X=`Y&pN9Bv0q|OoYjEZAF0hbeXm8SMWAH*^=lp>Ug z+z>qKwSBp6CrjjTk|}=FYj<_I!Doe=Ms!~h1S)436SQ+%%Yh}jr%z|b^BwQayTs$p zyURvf@i@}r&IOtW_ITVLFagT+XsFTZBkU{sC`@z>Pk%#03=PJ+B|K0GjC{PGMo^IZ zvm5x-8w@4#l&0LP%qrk80)2rQIB6K_naczkqQ{@0A@NmOOiCGoQDgJeP1HO*UT?22 zXDdLX$Mau3`y{fg!yT-P0*-2`P&rvhso}x&Rhe5&sfO=YiAUcAqZ*D0@LKxmpxSS4 zI{Pq(96N@|jqLpj%M0-LJP$gwn*l7=5Duf)?KXgd)t;zS^A3oVQC zf0g?Fn?V=Nj->?B(-PdRcsx6SA7iooXk3XW2`9JJ?~Jjp-y8ppYBL&ZHO3icw{W%f3xyA zxBF??hXwvJgp3T4$T_{8eLPi+fHS9!Hd+Tq@YNLqzNf)b$i+41-mB(>{gByt?5fXT zi++~V2JG-Wd%4iJuF%nu846x@I&1u7`BEAMK6@EEecq_y&++49^4tb(o<^_`Wdic` zJm%t;M@|sj3ECgcS=IDmWl^>m%Tb*}OixUlDUnNq#i5kanR_9SyS}!=^J~nRZ@CC@ zLt7c3d$->uMVc+`cf2_l^L=#Pdhg;`QPCAw=)2>*}qmOvJXq?5;Jz6hK75oA^V*n4JHHy+7W9$uMilQ4o|-JXDC6I35aM{RQvNx|?xNaToV6n< zZF!k2*{ey#Ujs$jEsmIeSi-ot5-8H0YnsKu)%I%s)_GuMo&i?>gB>7gV$-l{i(?wO1 z;HMnYeSNG~5>C{B}GU^vl4Hcf8}~1e5|B zQVlAu-8+2lYQ@6Q9M(HBSj|4BjpeXe#P$&p44j4$cH#NF^{%bp#5v@Ak>y0ST(o+j zvx544YvckW-PAX_Rzr63CQQEN)@26>wn?LHBhnq@&K|ee_m^unS1$8F(2%ZYwDdbp zPomz38O;L?Q7sUq?%G9avUn|3d$ta`sRsJS1EmPqqmhiI>Ui_S0f7&`<~Lq7nw`Fp zucp$u4!Q0jLXJ1t%tlmn;q9GeF^+zXezOAK2tv>w2j+-Z`}_LLCo-{!i8rcs8e3ai zCv*5#mX}k1_|;C0_w~)pEU!-h_wwY>>`$t{vRTMfOW!l)a)4w&m=R9oJ?c?LKvbeab z)Wa-~+-@0Iye{w6SZveC7Y;v$-@eq`J~Yv&bv?WH$w}p#A?S3O{s9( z@+*p5RJIVC0BT1PI>~iZg%>rs#H?yW$j}a)u(r0g@)Qs+o*W}WoBU_J_9zjNyKN;!k!boUYYG({;)pXJX*teq@bm2|bfY3p)T=lE^azrm)Tm2>=Y*;!db z**dcg1n2xjOaTNrV|&x=8bJHbbJGiV4IpI|06VIefz8y7OI{Ha{y;G4=LLQ7Z z6fAzoRwrCRuzT*j7Nn+^f4$is#Jd_IH)YK?QR#d*?Z5hkN+reRkf=sfd zhgJtBsOGNX^44l#g%$mu$V&hEsAm&hves7J3#|{GA;-aEi|&X5u}z*brSke3>P+=A zlQ+-Tk>g@v#Anh`@ex+VU;4-?DAu~X`n#QkFKCpqqg8EypA;fk>HenMC%U>H2`0Q* z2arXdA{98JmECD&JilyFlxYX?Jtu$4lH~ zTA9edQGZR_J)f}5{ncpTJ9fnO#?VH$$GM#9%$*vUdZuM2Hq!e^M#hB&&P?5p_5}}c zxT_iiZutHJUY^6h`~Ca(Cej@G>c!0W%4j5# zkrAUByUJuY3G~M>CQRl}2_tiCMlhX(x(v&ws~5dvblNsKoJp4PIQ^0`noRUUTXZiO z*!;b6Ztg}xv^<`eyQx7-1@a{V7Jii3l2BI{tgtEPAlfKTETopDOxiooFs_$fSV$Oi z3goBlW^OGSJuQ3Ws+U8=+L1#09GS>w?ehrlKK32vU@rH@(wL08sP#s-9C6#0bw9yi z&!d%<%9$I_O$+(6EmzE??~J0`rVTq!`eo9G{Dy1T3;F-qer|*CVOoe342dmn>1#SO zsoUNEY(`%<>cNB>s+bZlyXo5wC+2Sl2jSFoV5*J8JQ~0Y?}Jcfol!T!hYw!f-i$_F z-vFefq`!XsQq1NqC@a&lB;?Qp=s}SxK1AfKjgDo4w~kllp}Ys`z7a&&`ZKW1gnnel zm)Pfg6$eVHZ?#W&k-`DK7h3RzvAc21@BWRh|v5E zK|Oqpwfr)1v{*i9WL56gEnd38nJtl3IOBoi>W;m%x8?}MR#M{_z9`uoBLds|mz|3luDxPR?^^S=`l?RSA&0JAp(X-kX|i~ZS^nM@PY!VpW>y4N zCXR1=m*tiqiFIRAnD@_zp`n_Hc97L{?MrxDRb=3SUG6Enp*yjnaA^Q8sS&Nw&KBZDLuTz)s&Z;M6qmpwcBt zbV7&XC6g8$z9;y@b91_$?6p;3mPN_I^IlR-bglbz?{wb0X&|g;D2bvSDtvE&<_vOWF4zGQk%{kfGP9{ z^!laSh%Lh!muxwRG+^Maa9ln?THO~vvM@wcAW{?3FNyx>w0jUHN~#`B%-2+`+PpSY zJh{n;9d$mq-sXDrtKmI8_80_c|Klp2{=&l_9{uqHlDlM)s@i^dDsM0!$?oy|m|7`# z+ZiPeB&(>n-W?F|bbFTe3i|%r>z^5VQwOaFA9)YHOG}A0j8z5(zpmlBh0Of}dwKVr zy^iX(j;$j;7aL1|4+9SL4g9_N-I>22i~gG5X(zzM#O!RpAQTb~=gQ+}iV9N$-z6mD zIqt8`nMDczCrGQ&1L80lF2ZJ&<$Pf>i$uzH(Juw9^Zv^e+A(%BzK^<6JG85b$t5i_ z)8~QjHl4XiRZ4}w-}_sK_(v#3gJDl}$|0tIYjJ7GsMEQ`KF1p&EUf#K6uqCBHDh_-l|hR|=nn0My6`BI0gKS5? zprzT^nUGne>jCYHi;J0$3Fd}>HjbUK)tLs4)@$;e)wpAk^;-vcOk*EYG< zFg@I*sNR-12?`GuW=a=*O;Blj=gO{HH!p6nbt^uTmVLsT)i`vq=!(0H`CgGG$%VB3 zbH-sIGNYOP=nsw&y*y9oOtI0oFZ|yt*P~O0;Hw;G*98OWXiRBn*FuP$&SJ1)XIydtVnGNgMqbw&|&)5uU88L=lKa1%60`>ye3tplfPNB9cil5hHW!2=y zrbnjx`a~(8uoN0ui~lC$r*L6PIJN2%5*oOfY10Zxov(MEOcnG)*Fa_R8GU=s2jdx6 z@ZmT$R+jem`67)?G4%8d&Xe%;@a=b_I?%0g!OpgU`IS6VLG#heAA&jAoiseAHyKMc zF_r*FhUGy7(#OBFc=A1?hih<^*kqP_9FQ%#YP{RAMkmg-JMk{+2y*hry z#^$tHsJ_3yhrzRffdMz@>e9l3ra?y1I2BC1WJ7SMwYId-GLWktA89tw)Yf2V;7jge zuQBvHeWLi&yFt{d7js>)@JvEU2BBAK9k1>$b-F-7cc+uv&eV4@Z5_AV$e-%Uw05=V zPTa<8)TcAn=jA_rih=F6%TNUq823hJu0$tV?yDN$m?m4YbRodOky2O=^OXlik7`;5 zyToKZT+p^)YaTbbx%qH#>>c~#iM|!1FB@#&ECRf`C9^OpLk?x1i}dkwSGhFl{uU=zGD$ox-cQT;mmF=O z$F=z@$u?VN5=6vZ@qasqFlKZ$jy>?2uNT+Kk@`=@QddWnm3aYxF@Eww#lG7boY=b9 zX*)=xcNa^d*MQ3ezujS78k0YkuCDg(a|VIU&W$>30txfFiYk~AvootLUfSA=FxPOE zDodU?mz<1YP+itk{Vnte2T0g{v#WBt2F&;-=HoY#f^`D!jt+1&zxk&?PtXieJ+&pM zh5uE4cdI-J7Gph#y0DE(71MJBquKJ^cNcLP{ps%T*;D+vmE~hbT=@FrF%~iAK`hi6 zaB;X*74gHeY)Dg?7Y>jgga6q&yWRWmBJR$laV1$Gnqr zWr=;OGf9hBDRkg(4Pdaod#p(ltT?L&B9UDCS=%eMw|R|ca4>)_CU-6_fzxgJL<(wd zCku2U?z$Y3is!y2*MPS*(V=*}rvX5?$0L!BNokyOx z`f`srG6PMbT8AeF_*AQ`=7XaQG7E;&PP^#UKW+9a$aJf^=~%1Q7gZ)#`|^G%q;RnX zCY^A43#cB`%Ie-+HfR8fYQFrE$yZd(Bwn7q)tZ6k6V}R|1rasShSTQ_6);#;tZt;x z<>}jyk{(yfPNC`Y)Z~2C(NvG3P=gRGb}^*9(qf15(N@>D&}F&|K3EL*!2>@pghZEj zgO@fLl__b=)H?gy0c6aZxv}M~{uKfiU;L?sB6pwL8T72XU~nSB3sL3?Bde1O^X2I_Rf=@*jOSTT2tlVE`u(6odU+>> zO`OJ|zwrk*0PBnB9v;FShOtfvq0&dX6I~eexcdQ*`9F2y|6j`N|C^Y*oVA^GF_#IQ z_Q9s<;w5gPOG(wCE|16RvEeX|BB1o=a>T8qZ;%deL$ldet!f+hU|cvPgVgI&8q6u4K@quzK@T}czR&T zM%&|Hf1gE$;CRx@WYEfB(?yLrE&3%xhnPj)8$BZ6p={?1+B=es$`$AxD*&)RcGRo! z@UGzM4UPCyqca{h3gA4IogEwL;oT4kMEnC=N*5n@jmJNAMQw0K-{%^gFYMm#py7B+ zPMtsc4Ia(asPdMZ`5Xe$*80g_T;0}&IXP@mAKnQNY@|+PhxnF#;SvW_4C$Sq*zqai zZcq(RsOB;KcC?yvxaoA|NBLI|Py5SMKM#Ksr=IlDxH2I;Jm&NvLZ>EEsWU-DTT;XY zh~^YBM;82O=Sz|hAjre$tM;xnc3qIKXOgNo2p$K}vs&gfTdI)t!Rr|7(SKTfbbw52 zee~vZb+s~cWPK<{ce(7Wm~N>++Y1=Yzct+BEh46s<0olb<)bz0PvAmRApDDoDwTf8 zg(IP+3>oj-{tSQJzE9({vhEsI|LV9`M~BHJN^tT%XCPt%m)F}fj)~^2i-roRuXy>c zHgPNbjo4D(*czVxJOtcsTDB*?X9H-r;<~~86PiS^u}zkW&3W7 z+=N&z=CAIQI9vAN$qoPUqEb0w6zL|0EqB18^mpIy`qV>S?xwLnb^sn(J+2Y3ieKls z6^Ci@MTwu?fwAwtS>i!LKfc$Dw@fIFueRy4HZtdxDu?U^v zKBLA0gBWfYAW)uM(=3ouL2bY+jP~=t-W zFelZ41rE^m3u%(`y4vc~9Y&D_WA`yvdkX;Ek|6t6Sfrde*6!efFdC5SK(x-#1evN& zqKw67b(~5BB6!;ZE|N4l$^S0x`6^n;GJ|c3} zXmx`Vil0#}bvMck6tH{F-ZVUFzT#?ESqEn*bu;WDbHI_8d2?A|E_!VRKX?As%`Uy2?>Jd-zKw3ZsB-`C=m+yk?-rGp=?*2*%yNNdM*I6z!myqbB;QmwrOgKyLI6V&59+5nMkEi1z(@63X>{gAG z6Yd{Fy?BH++P{SaTfMoKcw3c*Xxqk`{KC*KW)X*dZ|()A85e<*^+#PVm$4Ui{Nsxe zO2mE(O^q7$al{(t{~OcxYI0{v7BWXeXRmq2>teY0>~`@e?h$idCWVDSBCo1CbC$*R zOn``)cll?8+O~~M{dI&*O@ha+sv3fLQ0E7izo)YDk>Ia1kDH+~mYI2^c;WV}GA0G) zvC4Ja#9ENDnRu6ED9BxqoUN&OLDBEwG3ry`?Y)h>7>R#OyfX}&{j9&YKh2R#W2Bbr z`C0GlcY?tAc?2WifD1s9EX8Qv7Cz_Wdi*$BmghyO*xc~~ip5>&uQ~Mm7Sg3+;Ybyt z-|6i&daa{hyB*up)YMe+#)xD~RA^anJ&=fCI9t;qu(~8F1QhA>T_xI{5#lrj_fG`< zS`BFcR%LlkxbpcrjDlLw-q_afTy4k*IqW5nBOGEbt(~pz*BZApxvMc#&{}k6S*o&P zX-=&3H=;71R`;CS8ivsT-_WEUyvTWlqr+wM%WH8eJM)fFvrUMZyQPdnj<{OxYv{YP+g*Z}f-vZY|DU&UrFFo-lyWY$yu8i}YPz zQ%}Fz&D;&{rG&zly)iA$%MWwe)F0)11MJGA;kY{-+EVUjY2KVXoQHxVBh6=sZHZ?~ zYa26Qp`jg>?x#^Iop@hn?L$nbV3{SnpS?Ip5Azm76yi6(Ic++*SRDG$rgJW8ODBM| z-llP~d!!-CR;n(JOkEd>vjaF~#v7F}69-8?#F21-850jfQ!dK`DDGmL?o5P$6Dc6@ z8sx($+sXHEj71}Ly}wDZ7JKDRymn<20u20B9e$@zt475 z$o6#<*)PP?h2!?!`JMnDA#TKmwg|FaC@MJFVrvy5%Jxte~R}C0P}d|#6o$$RprMjMo8TW zV#EEjeVa4!_fUO9S*5cRAqI+fs>Su&?w=~gl>b5{C|YO^P-C03g`eY1*w+~_SQ1(~ zN>=!}F0r?%J+BUw)Y%9Oh)QjaSrWFv&&(pQoT9fQLy<#4LHTNcX8AAb@pYL*Z4Q+i z`^)!+h$-mKMYc3f7KRw@*Sa98-)YhyL{vdrH<7tQ<=Tv*NGXgrMls2c{0pUG9!w2qwVMPHcH)a?$NxMelJK5%imKpLQsM88z{)t*NK<_qZ78F}dxA z_tyO}?wY$m)qzi@^ZMx$1r5&2ByO0D68Qe|;pE^?aWPniW`qW&i}*ELUgRv6qY_?7 z9a&m}fgD%%6#@z|fz%pDwm3jd73pzB&|qn_`(6ke_Y`g-ceZ;N`Q1pI8I@Lr5h zfD@pss~OvOU2Yd{pW#*iXE_$Csf#%!8H30{gvaS=o9c8g4>`3f{vT*YbHD(+v;kIa zcAh?GkRyM6ESo(igADvq*c6GT*XS30D z-^m%;*>fmzY2(i*Q||;6p?LLfNfXxQ*^mz!i2VR{>hX!MZ#Z?z0#*5Yy>4 zzu29!8iExk6;?aTgX4Ku%O7Q=M}O*KC$iXXG$P+~hsE9?*y?btO27kzs|JUUavY+G zHoNr>aam0^+U*y<0c5p3gynKx2&yUFoJSubwwB%S=ABORE7s0i!_UhPEGi0qwjBZ~ zup@*z-f*$p=7xt`HL~1OH5UMXp=VhrEC-}_r=P5*muE&Jjgxb`6Tu+(9LYtZXuY$t z8hQo$nep(fFsX4t$CFO^jf#ipVUD%x3k&!P*&MZ3j4;b1Up~W>oWfBv)(UmqnaI?y zI-kuKZiN=!9y5^iPOU4VVeR1g{%EsT`aHAwnShI?iT!bI#ODrrOMp(2Hj+a4R*C3w z)Hra{QTF?hDGO2+izgk57VB-)f~Zbl5+EH)jG+D{#d6fB*?nv(nVL;41}{|z52)o3 zeTTn+agb0^&C13~EZE^-X{yfN057}~*aLLfSncrdUm23Ron^pXO4Bm3gs23BJ?b2M zbKow-uBgpM4W-{0PP>x3Exr#!%rHUpHlvtG?DBl*5b2j3#kik$z$NfGd4i-~CUpq0 zG#Aw+AshYJ!uWg8&Q~FSs{m1eP_f=gwi3VuX2w-J4pFPzFU%)TUPZDf!Jy;a^Ei4z zMjPDqKe%_gB@`Cv#o#;!`kG{l-%SmQ_xA~<8fZ}Rm&?{3#+7EDT3(;G$=--bmj30q z$k$QW7Yp#){VcX@H#u?tCnS#e?!7K%o6|BJaeqj1KlHx`cokL2=6bv^wCh+^@4|X%-+;@yPfc#R;N8+ zD69PaqHRl1&=v^jaC%CJN$Gia8xv81S9BTZaS_FKCoY4tyeQE?4FHg)jP~-eB*6(P zV**G5O%A5xdNyN~ksUc&(a;oG4#2c1P}r|#-Il@XX;~<2QNiz5m$#rGG%p~F8vl#0 zK>+T`^yl7nlMva!p`EriAK%w&8d&ug$`vW)$jd3z9H~8l#LO;9IUx;U934C^azB$j zOAYCsd_U zE?ikjFl82$$3zv%rASu%uX0W{tbb2iSLcQR-D&6XW@iYEijrIz)6CX(TcFzK@E{dz{CiuQzKg);V5S6R6yvuxz0pQ{(1cjSpU?pKMf&z%ANv36!KnWw zq`-kmDJ>_b_g}&@37lzmRPpB@_LlcGXe(TIzaMT*rI&`*{FZAP^t>HaQ590E68)W| z8>eTEhF-5A3?ta40{T-d{4GAa%eR!L*=c?b?yGGDS!N@7>N0A{>S3QL#gS4_IqurV z_MEfL=579m7Qifl5WxLSkp*m>CT;d!8frvTcsOzX*rJK7Nvn@N#&3GR%d7c#N_@m; zQBONZ@m?LNpBXmZMQHaif0BUDn%H-2%gp4Dq}|7rI)uQc=30BdQ%813Ra3gF;^_V7 zA2+-{F;pfuh;P>!sSyeI{(T;pEiNXHd~aZfSE}&>*hZlRp2KRs&n6v zV-q0Qg<3htVT~05IMkBUYrm%KeYQG5mB-pVT_Bih5u_=Of$jmnV z{RrjyDIACzM;qR)AuaHS^dkI@xTr7|9}f>`Jv%uwiVs-t^m8HE*Wb;}Az{$f)74@5 zbUR$YTDtE99pGAzY7>blR3{LbEFLoOcED#n&1)t|i*rc!vV~rgotpv3$=sdpdnlB? zd5`M@UB-TG5!&GI*NC#3yb&@Vr<+$r*pPX=tbm~ltKHa!3T6#ykwV#>HH6%@uMH17 ze7q;h1DFi2u6v9cjYG+11dz!SGc2I{%&7Jk^dDV=@+WLBVP?RktULSvqrI<;YU}&9 zO-qXux8hRV3dP;p;O;KP-66%Lr8pFKDDE0ONQ+Bxmte(%I|RA;{oi|E?znHf@y7js zyk}(O!_LUa$v*q6z2=&8&6B+>he%&GDySmSj8&_CBKESU3_Qdh3bCp>?zmrA6n1Gf zWKXrXKAGsSrm8vMjinO*2ri{M$ig+E+M&BNc+|Fq%P7&Q?99%9GW|>phqr&$YZ*J4 zZPx2apnmRzqab%0wISbWg25o{z12~s zC+r3@CK|C-<3<4g4#eG@{&NtE2eix5*^%Qg5xhaz9sD*+O%;|^Ez&X$5eDD@1bdR! z#Z*%mOcJfOFpv^%g=-3n8!O1bgbgigM!pHjehxM+kI0xXejDActHNc)xp@w=9Y!a~ zqK0pzJhaL9G(Mi&$q$byVoLSg&MV%N?g=Sr3`o=fE9)Bx zdt9Ea9BKpZtjg*jy)!XgxCYwA^QJez4ZerYcyZyMk3t_I&%XS=z`Cu+h%yTQY{lD` z=&3>C^H4cUfW*C@ni1J^d?GDEHpq*2esy$!x$vO-s(zmJfOIzFI>{S6F|JF!g-+_| z$DxyfCUO4T6#pi8`kCm^4gnGy7cQ|NnE_-6&L*-&>R2-SujwNS(}d5_Q~_Ld4H6(; zTIG?KZz4UGC4yH;%P@k5_=V_AjlVJ( z+LSBIO`Qg?4bSgFx))O8Dr3)Uhfaasq6;$?nwOYsXTe4%Sm8_1(GVqjQUc08R-X@D zdSAV#Vl{}AOPx#79}d1&6A}d#notrgY=@8k(X#&P$i?w~58Cy}1S5NXy$2Z7aLV?Z zbvRrZ6zos%h0)w&N1Qsj)PokDbW{7P^resw1%+196V=N$Hsg{rF?WADt_ zKRvzOz*Hsot3U7A*a-bNrmG(=))F(o&g@6#qsRc4>sNpuUE(~BQKda&eMqF|FMio= z_Qn{XRJHT*|KtRyT1h^WO|^b!0BDkNdi1q%?wUmQI7W{ug&Jmz^7A&=4(5P0Z5br} z0Dx0co;K?bU33t%WF$MvH*%8=nlu|{1b^IF<7E*RAg(19zqlOnv;(0@+qgZQ-$11> z(?Ml_Z_AU6QS25^hF58>fI@j49y^>lo4Z?j^BvbG2ZJ60F{s$Z_jgtRz%M>@)C!2x z@cHM!5oFKH#@SK%FHc<1PTQY}%99+_Rb?f8?JHom+E3g$goUJZ;y}2gnh%-*Vi%0__p4^!NNig0y(dx zrDbsTJvCW(h}LNFY{yUXWj@6$zijz)*{F~iFEBAT9b z@bsL$!vhG~x%gGb(hbv*Jc|s=<_}InHvN_*%C9Dyxq|(Tbk=@x4+sAFinbso)mqc; zx`PIn4wtKhQ3D1FgRCM;gr&sWJpx74Jf>d}JuH;f$n(E{Gw(d;AttEn`H2jGMIrPG z@ZO;5PXLMglfxD1Y9HpEk{DbkQCX&3#h}Yc4%58~r0@W9Qq42%mPOE;cG?@I?^6eV z-H$(_APa5f9KP(E<}co`L~D|_W!U2{Mo2SoP&30CY$&H_;6?Ql42di@!P5j%s4sr< zus!yaz{6M#6U}EGVWCcI#xOp^x9$wP&q?2lo^zufo*$Y#ZkwOa*~qSQmumwz9y}gX zjoLKVDVl62wnQZp-A#m^J=e{ypY2A4+|LZSs{j7#AVS{JHd@ZRo9G)2dt1e!EUtQX z`bC5v6ekJ+0ds{G1*l#6qY+Z>KZ6FO{s$KNc6Lg+O9^a6e=(%6Z^$3Fcx^X+N$;=$ zhQgdNsU!RHg5z19^wvosS{vSJ}Lc-O*qdb0Kaovjlecgc#>V}!OcCmqXvdZ8@Tkeoqa}EWI}Jl}c3jx~ z@fh#t+%%$DdkVi1NMR$6{h`?VU+1$#HEb$Mf8w4Aq~2|&OBron4L!SwPe zD~%U5wuy{>!j_xI*~<#a?9+i0s`xR|H7X|`=#(Fi9KqZTW=;8O~}{ z-JIb^d!#o34tfR35H;3n`u0bm-^F8baQ@f|KlhFG{#llpBe8(VU=$&mWP`AxFzo=f zjqA;gcan{yR~faYCq+d2si&_Y_iKs{#U?9dUPnKEUyQYD*Vp3=-h9)l(B^d_$OY%Q zYSaXIdbtFqNZ?Cz#gr=_BOi0GAne|>^TS2(G^5I^+41#C9mvh$D96AgZ<(Ieu6TR} zh+OXZ4AQ)Msfhs8nOhYZ2=3AX`y1jt4CfdCAph8c1aLv!zykbw_um`LdvK#?2nvx> zOIlbEaBSCBBaoy^mM@yK`SV9Hw1J}&^+zV+2h&qq z50q%$y$R6P*0zfgsu4yFs>hIE=o{!;>w0#9&0(r>E@YVio@veBzTWL45K5mz_G-TG6z(O3eg}-&)*LHq-7vh34_)1F67}&7_0m&qn z&$ith{59&9DVVh3Aw9tpgZf^V>6V>W8!b!84H~*iZ?AY9bmu|{<}IpJmPW+2->U~q z-Q8ApkP9SdTc)=xEVQ(EAX5Q>A=C(M78=b#f+}@if3LK34#>p=qkL`s(Hh3@;ITV) zlsKTGiH14>^XO;StYxEEDfaO4!lyRq5fu}AI!r$ed=|~pMv_Z-iDb`bcklYq4|y37 z^dOh|6B6)Oe?;4H%1#wt&<62((t7{l!;wqe9i-VL_m;8>zp3&~$6KAxD|tqaH$0_6 z%}%*5?(rWI5M2nKH*Xj#BJT>0z}$0V(P8Xkjw#`}`bT!J-G&8RPUd z<}I0uI@UPnGOL?|195cUCefUSt)9$}YvX}b$IOO$qUCF8DkHBbC=JS&cep#jA3yT( z7gQF?8U~A71Jk zg+h5QPEfxjXKy(DQKsuKR<6-{2sQDE#?s0d6Rj^);Ovpk514ME$cQeVx01f8IiSon znrDDlT$O$anbc%S?&#=&3O9Es+!ijaBf{Pod-WT0J^l74x!WP8X6@udZc_h>_eZ0> zIzs6r;CI0vnKNa&85nG_mLp^fCI{=qvXMDUb{<{TFtVIv!?*w62b91lBJU5x@8{<-Q*llK)hKK#||md=iUHCet~ra0A-Bd1^UEZ_S>A~TlA&TbtXJ^cwdnZV?yaJau!Scx!h0ne@eDueb?QF0sl4rYj zQ}2)#$&dH3SEV=~XX#g#0&kh`Jnh!c$6BOn(e^Z#c{aAjqFhN&_(X@LPK2Y!E ztiw_%%^Kl69tjJu=YHOU%Mz*aHS8?xHKDx2yz%9LR*qqu69SMgtV^3Bz_8i;F)LVW zitG`VL;fT@-1Yq2L@Cs8w5;E}b3@j8QT7oyJWcTk!xqssyDg{PjjJZH05_>XoK^a) z9wGoHib_f&I;Xz(TSJ`_q9@`I4v+DQy}j}mv)r6oJMZmMBP|u39To#b-{EuM(KP}i z+3hp&*R?w{cB|V1&NDQxtF=!88D|%KmnLBYHJ0kWp_k>vV9@>~QM9c0{Y^s8N7Xf- z*!&063kFUhg^3^UP7BF_u3LV8Vdkv41a5-(ZfQ%jbX&x!u26Th2k zrVye3Bg}(rc3SxOunUA2-Y}n{vgjmg^ZN$+Qo;Lv=1_Dy%B}g?&814nj|z z(QNaNSdJc@$PnTqRWWPVxMZ(W!)AO7553rJyE=Ri^JI&%B>Bz0Hxf+Gp>!nhWvqI7 z-pNR;&HcpFNIFV=@$O6M$+026*YWw?^e&Z^6$C&&qEkYJ^Pb|p-1FfRYkK9{5D0qV z%P}}Lq)wyW$`3R0{IgIbV~or{_0+K?u2ity7==pU>;K%^VjX7S?fl~v4NdX%kmj~) z<;OX_qc{s&XZB&A^l&qd??zK=k(Iko;yvFbC->9(kLZyVLVxHNT%TSZ@|&(l{2c%t zJ;2TiWJ0I~1O?$b<>adGRp(%r_t>``A1VaAM(obOH6>n^{L&4~TGRXtJ*lW(S6%4~ zl^0vejYL98un(Z+8g_;|y9s1(T6m99$#mJQZH~dGirL~v^~8M1M)H7L_oJr)(YCf? zMbKM+x1$XKrS1Nr(QsKe`xQukX}rRdzc#1UkQ%ty{-xt9nuJE5bJBY65$fD6TaFN0 z+!BX7Uh7EX64kpQU!7)mW#gX~$EN8N=wUBq)GYeHA(l`%${dbVysT;TP`z;`j&pAs zG=D5#c#@e)HTCw;X2x3XhUXaJ4Q9`k6CS>Bp`;{_!Ka26@(JF-u~ecfeH04HVT9uT z8Nt@~_fq9+=UkWNbKXE)RJM_Q9t3rt-PSI({UqwY71(v}_IO0F47ghiw#}`Ib+Zv~ z&nu7x(h2eIX&8vr+Klw~4OHo0zNw|5nfju6oxcoMv88}QMe&|n1=ETykh#xB^**rb zPsXsH#NcEn5*;7gS%-A!hrTseteK|o9T@2A??>#91APY#OO@K@Q-(uPiOaNvL?+gX z)1itZJ7qsYm<}5BHKsL-ml133wnacr9u%9ZcgK;UEVg9RT{25{^lT8<@GP2MQjc6f0 zTCVQsx`Lyz=?mx%&o|XT_1Z&>7JnW{xATL~{ZX{;9$_0*C^9O0#v{uj_xE=SZ5hy| zBw1%K9Ely{Mm{bMqnB#1tC(Fc)(Dp{#HrUS-kk@mspOgww`XQ#6q6U& z^AzVZ%~a~KLSLiqY==1tZFKFG=tb?s-MYK6aWijHOk8I279jH|dw(l8)q$wg&WntdrR%L*}t1?P`?qBhMN<+Ui24SpJLl^njE^zY57f<_>2i*flb$Y z6Q*%~jrJICP(RO>YsHYgE?L`K@2r&`71N%oYR19UNNX+X%Y@kaNhKrl(6@{T%AUYD znt41&RM`Iv@+PNvk68Mh&twtBZZ-BB`@x{LJnKlf;%JfS{0<7b`CS zU+7Rn@|pS@fQbJU$`|9H5M zk0Qf}kB|RO18$GbMT?E}HRQFpHap>WDpqqgF){WX&*;XO7|x@ZH#cT|QMs7dH}5$R z6f04Z!}Dp(596AWkEdkjB4SOj`h4P6aTcP}v-lkpMKudO2E1^XN)q$%oxAnp11rh& zLa7VL%k`>)$*`07?tDAy;UX+vtWjUd?>WmoTfb^}MZ{n*T)#-V)0!h$o<5vBurMSy zklvbz$UK&Xmu1CM$OzXL{!716yu}((XO)Z=F#%YOAe=$|OZ+}qx`+@BGZWT<24U<3 zcH_CCqqUgQ|8LBH7fx+)>U^>q;%c@e66S&uTEzT6Ks)T+ttKhfDN&x^!#!o0~I?D)N()<;Tzn zS*L{$zSX(hp5Ji=tit_3bMfb?NBA%&0Jn;^`d!)FUh? zQIqdLv8A|&r>JO&N?dEI+im@#D`V%WCx-qPncOcXwdH&}H_w>oyraK8?P?y#_Y7@^ zLp@gYojj0!sa~(FsWTx>ads~(6U-9 znJ%oO*A%T)&DQKx^>7}wxtZVGG}mm;h(Ed6C*SHe{0+@w;mhTI;{6Z59mPJV(cP6! zu|x}B)Q%Ky*|DF;^K8Kx=|UHD-=i2VNFLahrgntY7hH$ zgygV4UFiap^UySnf#0CZp_XQyco!!#shWO;9H!j?O%K-wkc(p%|GknZ5cD`NB!)Sl zNHWDzTbNnU;lAJYRmV71#jlLq({7{IiZH5Gz&p8OwZ*e1VKuwQxZ{RWeLwSQ?!lPO$FDxjaP3kGaCk%N3aCTUcmD3TodhtSj ze`>hV{^M}rQeDrF!x zC*tvSGf1cBmds`BbUVwQA5`CKS>Q|^t^JDb zO06UvUbri4d(U)$_wrp13pyoHfs<*+&@< zmstgbX~(m5g7+zvLhNyT_yr#f?)mWK!G`#x3DbsmN3|{({f1odZQBF<_o%!+affsw z7wrwX-f9zSGAa1N;&zd{WM{U{ry}^_{Bku@N?64N-^Ubw_#=&%_IqV}6(h~j>}%+f z-*d~|N}%&fm!IikYVeub(hX6r-I^w)5ntAdKnqjrwZ8kN;_V_hu*ow419tBWhsx9L zI4`zXd_>3Ay7oi@sOxtK)qON-X7_}p5W~2w3M>0@aB0lulQpGUT6A2=F-y8=#V@f zZ&UU0@i7Yx&Gj6+;_sr#A9)lk>3C}U<6)1TTNOS0oA57aB>|bv2%BHeuXbWb zymEp~WNP=|99KZQnkIAKFH~eCx=qG4athe1;X`#DZxTW~TA5%3()WxTCB`jt<+^lV zPb3AWn*V^100|U==R00^=fH@sHs!{moHTKiMIh--*c`(CA^!Yq00~fX?ukj&)s~5Po_JWGFWu6FfAOGC=&;g~_hIi@ zB4cc>i0e6`-aG9M)5VJ)uIh_^jDN1onbCE3QHPX2Wxq96U{|U=Os~CXrxz14PVv0Q zAS<44HatWI(2n!Ldr=YXA02&(E~i z$auK^H`(vllGu$(J#0TOH*Fo_gxhR<43(u$=xA@yD4F^d>^60-w>x%Tu2mLT@pL9b z->R3%$Ho?&k3UcsQc|)|UnKCQwjIO~`aPkl>U8t;l`+IISD?ihs-%#a*6Jq0FOTkrP;2>E=`^bF#oc{sgJj^Z*G;Q9A7`PyKQ#lZ=Z|-{3&A45)${^Ke=Xfpm+?A6{ z{S5|Pk4XAR>T5|;_Z`(%x65VcO(+D25YB)_eeuE$X3Lp@Nk4w1RSd*MWecHo_-re= zGDO)Y8yfhFx9%LJf7+F1z_Im1u3UTWTCLsy!<%hR)hd2Z>riysGJOWm6Y(n_L1~z3 zrN54?QE&+QjGkBLu;3kjEg9cGao^0uLJ)S(4!>JzB&h^#!^8hP+{ZXDIgvo!Pb<5q zhJbXf%{k{%>yIRkuo;+u)vV`VtaPpms*caw;R)8oAS^6Y8zBcN3&rwL^%JsqQzD+v ze)!(D^FM#`^#q7tuv8cr(IPfoAUhE8^6Ai9*SaaMkVwrO&AGMSUq6_(5;X`3}BXgU*H?HAfM-a!_~pfJ>?g@X+LJ^Z?O8i>MSm zNq%}35h)CoIqsVDo5BPzCEeDvB1trjVDsK|WAK6iK_B1zCz`Mu(ZD^}fC1W*%;_1V z00e#d7g&3TfMEjP5D0D^2Lb7VK1q+Kd{(TO-EYtj-Coox007>+S0m7}YmA79h(C%! z2la27nb)kfyB-e4%fwMKM{?=_Ujl*--$f>X!S1G4zuW=>BF$z{mrGsd?L6n548?23 zD{aAV5kyi#(tRV!1+h6>SamDr9bpf4$0>7`xQAZK$!aUb+qQx3rQs3_X2*~HsYTof z^wjq4uS^`D?UKk({VVKaIs}r;(3#Blk~(}6bNSV5=xyE&Eu|=r?4}g;**ZA5{tZO} z1hLgOvgXgyZgD(g0?C)YP~0f5)v z>o(X?^R+8RC#wMf39lib9)tIN{Q3FeP7!PO@qt^hg6$-9x!G)ghnvF%hY&y@pHDsP zWB!$&l^1lUwxII2Q{RJG487(NaF+TukoS0CLgs$O=siH<$<)j&KQ%`5`(=+;X{Xpi z$v2s(D-|wcMQ{n(Cy{nviZ54B8uw)G2i}^LR5@;+-gTjxoN3J?KlMQoM~A$2>0

  • YdR$@Co?yL2F*C_?Z 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 TdjEMyG(b*D8Cd<%G~_=3eNw{e literal 0 HcmV?d00001 diff --git a/texinfo/udav/udav_var.png b/texinfo/udav/udav_var.png new file mode 100644 index 0000000000000000000000000000000000000000..9c1507d5c680765345ae1a14c027b04e5eed0199 GIT binary patch literal 15124 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 +@comment +@comment +@comment
    @html +@comment +@comment
    @html -
    SourceForge.net Logo +SourceForge.net Logo - thefreecountry.com: Free Programmers' Resources, Free Webmasters' Resources, Free Security Resources, Free Software + thefreecountry.com: Free Programmers' Resources, Free Webmasters' Resources, Free Security Resources, Free Software -Support This Project +Support This Project @end html @end macro + @macro fig {plot,text} @uref{../\text\, @image{../small/\plot\-sm,3cm, , , .png}} @end macro @@ -123,7 +109,7 @@ a library for working in window and console modes and for easy embedding into ot a library with large and growing set of graphics. @end itemize -At this version (1.11) MathGL has more than 35000 lines of code, more than 55 general types of graphics for 1d, 2d and 3d data arrays, including special ones for chemical and statistical graphics. It can export graphics to raster and vector (EPS or SVG) formats. It has Qt, FLTK, OpenGL interfaces and can be used even from console programs. It has functions for data processing and script MGL language for simplification of data plotting. Also it has several types of transparency and smoothed lightning, vector fonts and TeX-like symbol parsing, arbitrary curvilinear coordinate system and many over useful things. It can be used from code written on C++/C/Fortran/Python/Octave and many other languages. Finally it is platform independent and free (under GPL v.2.0 license). +Now MathGL has more than 35000 lines of code, more than 55 general types of graphics for 1d, 2d and 3d data arrays, including special ones for chemical and statistical graphics. It can export graphics to raster and vector (EPS or SVG) formats. It has Qt, FLTK, OpenGL interfaces and can be used even from console programs. It has functions for data processing and script MGL language for simplification of data plotting. Also it has several types of transparency and smoothed lightning, vector fonts and TeX-like symbol parsing, arbitrary curvilinear coordinate system and many over useful things. It can be used from code written on C++/C/Fortran/Python/Octave and many other languages. Finally it is platform independent and free (under GPL v.2.0 license). There is a @uref{http://sourceforge.net/forum/?group_id=152187, forum} where you can ask a question or suggest an improvement. However the @uref{http://groups.google.com/group/mathgl, MathGL group} is preferable for quicker answer. @@ -141,44 +127,142 @@ Generally MathGL is GPL library. However, you can use LGPL license for MathGL co @strong{Latest news} @itemize -@item @emph{29 March 2012.} -New version (v.2.0) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are a lot of new features, which partially denoted @ref{News, here}. +@item @emph{13 December 2012.} +New version (v.@value{VERSION}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new plots, advanced color schemes, @uref{../json.html, JavaScript drawing}, and many other improvements in both MathGL core and UDAV, which partially denoted @ref{News, here}. Note, there are @strong{incompatible with v.2.0.* changes} in the arguments of some functions. +@item @emph{I'm sorry for making incompatible changes in v.2.1. It was done for introducing unified interface for all functions. I promise that I will not break API for v.2.* later, i.e. I'll only add new features or bug fixes.} @end itemize There is detailed @ref{News, news list}. Sourceforge project page @uref{http://sourceforge.net/projects/mathgl/, here}. +@ifhtml +@html +$DATADVANCE +@end html +@end ifhtml +Javascript interface was developed with support of @url{www.datadvance.net, $DATADVANCE} company. + @external @node News, Features, Main, Top @section News @itemize -@item -@strong{29 March 2012.} -New version (v.2.0) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are a lot of new features, which partially denoted below. + +@item +@strong{13 December 2012.} +New version (v.2.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are speeding up and many improvements and bugfixes: @itemize @bullet @item -mglGraph class is single plotter class instead of mglGraphZB, mglGraphPS and so on. +Add class mglDataC for complex data arrays. +@item +Add Vect3() plot for drawing vectors on slice of 3d vector field. See @url{../doc_en/doc_en_17.html#Vect3-sample, sample}. +@item +Add Table() function for drawing table with data values. See @url{../doc_en/doc_en_14.html#Table-sample, sample}. +@item +Add ZoomAxis() for zooming/shifting axis range as whole. +@item +Add WriteJSON() function for exporting in JSON format suitable for later drawing by JavaScript +@item +Add JavaScript code for visualizing JSON data. See @uref{../json.html, samples}. @item -Text style and text color positions are swapped. I.e. text style @samp{r:C} give red centered text, but not roman dark cyan text as for v.1.*. +Add mgl.cgi tool which return PNG image for CGI request in form of MGL script. @item -ColumnPlot() indexing is reverted. +Add mglData::Solve() for finding x-value where dat(x)=val. See @url{../doc_en/doc_en_12.html#Solve-sample, sample}. @item -Move most of arguments of plotting functions into the string parameter and/or options. +Add mglData::Clean() for removing rows with duplicate values for given column. @item -``Bright'' colors (like @{b8@}) can be used in color schemes and line styles. +Add MGL commands 'errbox', 'face' + +@item +Color can be specified as its RGB[A] values, i.e. like @samp{@{xFFFFFF@}} or @samp{@{xFFFFFFFF@}}. See @url{../doc_en/doc_en_23.html#Line-styles, sample}. +@item +Color in color scheme may have position in range [0,1]. Format is @samp{@{CN,pos@}} or @samp{@{xFFFFFF,pos@}}. See @url{../doc_en/doc_en_24.html#Color-scheme, sample}. +@item +Now pen width for marks is proportional to pen width of line multiplied by size of marks. +@item +Now you can use different font-faces in the plot simultaneously. See @url{../doc_en/doc_en_11.html#Text-features, sample}. +@item +Now Legend() automatically use several columns if it contain too many legend entries. +@item +Add style '-' for legend for drawing them horizontally. See @url{../doc_en/doc_en_11.html#Legend-sample, sample}. +@item +Vectors is drawn now even if only starting or ending points are placed in bounding box. @item -Intensively use pthread internally for parallelization of drawing and data processing. +Strongly rewrite the algorithm of vector field plotting. + +@item +Grid lines for NAN origin values are always located at far-away edges. +@item +Try correctly place axis and tick labels even for axis with inverse range (i.e. for v2 +@comment +@comment +@comment
    @html -SourceForge.net Logo +SourceForge.net Logo - thefreecountry.com: Free Programmers' Resources, Free Webmasters' Resources, Free Security Resources, Free Software + thefreecountry.com: Free Programmers' Resources, Free Webmasters' Resources, Free Security Resources, Free Software -Support This Project +Support This Project @end html @end macro + @macro fig {plot,text} @uref{../\text\, @image{../small/\plot\-sm,3cm, , , .png}} @end macro @@ -123,7 +109,7 @@ a library for working in window and console modes and for easy embedding into ot a library with large and growing set of graphics. @end itemize -At this version (1.11) MathGL has more than 35000 lines of code, more than 55 general types of graphics for 1d, 2d and 3d data arrays, including special ones for chemical and statistical graphics. It can export graphics to raster and vector (EPS or SVG) formats. It has Qt, FLTK, OpenGL interfaces and can be used even from console programs. It has functions for data processing and script MGL language for simplification of data plotting. Also it has several types of transparency and smoothed lightning, vector fonts and TeX-like symbol parsing, arbitrary curvilinear coordinate system and many over useful things. It can be used from code written on C++/C/Fortran/Python/Octave and many other languages. Finally it is platform independent and free (under GPL v.2.0 license). +Now MathGL has more than 35000 lines of code, more than 55 general types of graphics for 1d, 2d and 3d data arrays, including special ones for chemical and statistical graphics. It can export graphics to raster and vector (EPS or SVG) formats. It has Qt, FLTK, OpenGL interfaces and can be used even from console programs. It has functions for data processing and script MGL language for simplification of data plotting. Also it has several types of transparency and smoothed lightning, vector fonts and TeX-like symbol parsing, arbitrary curvilinear coordinate system and many over useful things. It can be used from code written on C++/C/Fortran/Python/Octave and many other languages. Finally it is platform independent and free (under GPL v.2.0 license). There is a @uref{http://sourceforge.net/forum/?group_id=152187, forum} where you can ask a question or suggest an improvement. However the @uref{http://groups.google.com/group/mathgl, MathGL group} is preferable for quicker answer. @@ -141,44 +127,142 @@ Generally MathGL is GPL library. However, you can use LGPL license for MathGL co @strong{Latest news} @itemize -@item @emph{29 March 2012.} -New version (v.2.0) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are a lot of new features, which partially denoted @ref{News, here}. +@item @emph{13 December 2012.} +New version (v.@value{VERSION}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new plots, advanced color schemes, @uref{../json.html, JavaScript drawing}, and many other improvements in both MathGL core and UDAV, which partially denoted @ref{News, here}. Note, there are @strong{incompatible with v.2.0.* changes} in the arguments of some functions. +@item @emph{I'm sorry for making incompatible changes in v.2.1. It was done for introducing unified interface for all functions. I promise that I will not break API for v.2.* later, i.e. I'll only add new features or bug fixes.} @end itemize There is detailed @ref{News, news list}. Sourceforge project page @uref{http://sourceforge.net/projects/mathgl/, here}. +@ifhtml +@html +$DATADVANCE +@end html +@end ifhtml +Javascript interface was developed with support of @url{www.datadvance.net, $DATADVANCE} company. + @external @node News, Features, Main, Top @section News @itemize -@item -@strong{29 March 2012.} -New version (v.2.0) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are a lot of new features, which partially denoted below. + +@item +@strong{13 December 2012.} +New version (v.2.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are speeding up and many improvements and bugfixes: @itemize @bullet @item -mglGraph class is single plotter class instead of mglGraphZB, mglGraphPS and so on. +Add class mglDataC for complex data arrays. +@item +Add Vect3() plot for drawing vectors on slice of 3d vector field. See @url{../doc_en/doc_en_17.html#Vect3-sample, sample}. +@item +Add Table() function for drawing table with data values. See @url{../doc_en/doc_en_14.html#Table-sample, sample}. +@item +Add ZoomAxis() for zooming/shifting axis range as whole. +@item +Add WriteJSON() function for exporting in JSON format suitable for later drawing by JavaScript +@item +Add JavaScript code for visualizing JSON data. See @uref{../json.html, samples}. @item -Text style and text color positions are swapped. I.e. text style @samp{r:C} give red centered text, but not roman dark cyan text as for v.1.*. +Add mgl.cgi tool which return PNG image for CGI request in form of MGL script. @item -ColumnPlot() indexing is reverted. +Add mglData::Solve() for finding x-value where dat(x)=val. See @url{../doc_en/doc_en_12.html#Solve-sample, sample}. @item -Move most of arguments of plotting functions into the string parameter and/or options. +Add mglData::Clean() for removing rows with duplicate values for given column. @item -``Bright'' colors (like @{b8@}) can be used in color schemes and line styles. +Add MGL commands 'errbox', 'face' + +@item +Color can be specified as its RGB[A] values, i.e. like @samp{@{xFFFFFF@}} or @samp{@{xFFFFFFFF@}}. See @url{../doc_en/doc_en_23.html#Line-styles, sample}. +@item +Color in color scheme may have position in range [0,1]. Format is @samp{@{CN,pos@}} or @samp{@{xFFFFFF,pos@}}. See @url{../doc_en/doc_en_24.html#Color-scheme, sample}. +@item +Now pen width for marks is proportional to pen width of line multiplied by size of marks. +@item +Now you can use different font-faces in the plot simultaneously. See @url{../doc_en/doc_en_11.html#Text-features, sample}. +@item +Now Legend() automatically use several columns if it contain too many legend entries. +@item +Add style '-' for legend for drawing them horizontally. See @url{../doc_en/doc_en_11.html#Legend-sample, sample}. +@item +Vectors is drawn now even if only starting or ending points are placed in bounding box. @item -Intensively use pthread internally for parallelization of drawing and data processing. +Strongly rewrite the algorithm of vector field plotting. + +@item +Grid lines for NAN origin values are always located at far-away edges. +@item +Try correctly place axis and tick labels even for axis with inverse range (i.e. for v2}. It provide methods for handling window with MathGL graphics. +This class is derived from mglGraph class (see @ref{MathGL core}). It is defined in @code{#include }. It provide methods for handling window with MathGL graphics. Similar classes are exist for each widget library: @code{mglQT} in @code{#include }, @code{mglFLTK} in @code{#include }, @code{mglWX} in @code{#include }. @deftypefn {Constructor on @code{mglWindow}} {} mglWindow (@code{const char *}title=@code{"MathGL"}) @deftypefnx {Constructor on @code{mglWindow}} {} mglWindow (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title=@code{"MathGL"}, @code{void *}par=@code{NULL}, @code{int} kind=@code{0}, @code{void} (*reload)(@code{HMGL} gr, @code{void *}p)=0) @@ -376,8 +376,8 @@ Export current picture to OFF file. @c Export current picture to X3D file. @c @end deftypefn -@deftypefn {Slot on @code{QMathGL}} @code{void} exportIDTF (@code{QString} fname=@code{""}) -Export current picture to IDTF file. +@deftypefn {Slot on @code{QMathGL}} @code{void}setUsePrimitives (@code{bool} use) +Enable using list of primitives for frames. This allows frames transformation/zoom but requires much more memory. Default value is @code{true}. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setMGLFont (@code{QString} path) Restore (@var{path}=@code{""}) or load font for graphics. diff --git a/texinfo/widget_ru.texi b/texinfo/widget_ru.texi index d4528eb..86a033e 100644 --- a/texinfo/widget_ru.texi +++ b/texinfo/widget_ru.texi @@ -36,7 +36,7 @@ public: @cindex window @c @cindex mglDraw -Этот класс производный от класса mglGraph (см. @ref{MathGL core}). Он определен в @code{#include }. Класс содержит методы для создания и управления окном, содержащим графику MathGL. +Этот класс производный от класса mglGraph (см. @ref{MathGL core}). Он определен в @code{#include }. Класс содержит методы для создания и управления окном, содержащим графику MathGL. Похожий набор классов существует отдельно для каждой библиотеки виджетов: @code{mglQT} в @code{#include }, @code{mglFLTK} в @code{#include }, @code{mglWX} в @code{#include }. @deftypefn {Конструктор класса @code{mglWindow}} {} mglWindow (@code{const char *}title=@code{"MathGL"}) @deftypefnx {Конструктор класса @code{mglWindow}} {} mglWindow (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title=@code{"MathGL"}, @code{void *}par=@code{NULL}, @code{int} kind=@code{0}, @code{void} (*reload)(@code{HMGL} gr, @code{void *}p)=0) @@ -374,8 +374,8 @@ public: @c Сохраняет текущий рисунок в векторный X3D файл. @c @end deftypefn -@deftypefn {Slot on @code{QMathGL}} @code{void} exportIDTF (@code{QString} fname=@code{""}) -Сохраняет текущий рисунок в векторный IDTF файл. +@deftypefn {Slot on @code{QMathGL}} @code{void}setUsePrimitives (@code{bool} use) +Разрешает использовать список примитивов для кадров. Это позволяет вращать/масштабировать кадры, но требует значительно больше памяти. По умолчанию разрешено (=@code{true}). @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setMGLFont (@code{QString} path) Восстанавливает (@var{path}=@code{""}) или загружает файлы шрифтов. diff --git a/todo.txt b/todo.txt deleted file mode 100644 index 607a5eb..0000000 --- a/todo.txt +++ /dev/null @@ -1,101 +0,0 @@ -http://ubuntuforums.org/showthread.php?t=1862084 -Device 0 (VID=0502 and PID=337d) is UNKNOWN. - -============= NEW ============= - -0. Check RunThr() in python/octave - -2. Use Hershey as built-in font ?!! -3. Import/Export via GIF (as 3d data) ??? -4. Read DICOM files ??? -5. Export to JavaScript (WebGL) -6. GTK and WX window/widgets -7. Labels at TriCont() - -9. Save primitives for frames (not bitmap) ??? -- see MGL_USEDRWDAT -10. Enable several fonts at the same picture -11. Table(mreal x, mreal y, HCDT dat, char *xlabels, char *ylabels, char *stl) -- draw table with values (+ auto reduce font size?) - -12. Parallelization of drawing (MathGL level) -- bug with primitives drawing --> pixel.cpp -14. Axis -- projection (ternary + quaternary) -15. Examples of animation, u3d, x3d, js and so on - -17. curved text (in new sample) look not so good -18. emulate fog in EPS/SVG - -20. Add mglDataC for complex data -- main diff is reading/saving data -21. MGL testing system ??? -22. Export to X3D -23. Try libtcc (TinyCC) as alternative to MGL -- in mgllab??? -24. Use OI & Z for determining {x,y,z} from {xs,ys}. Try to find closest. -25. More accurate intersections in Region -26. Add flag for drawing 3d arrows instead of 2d (S,D -- cube, T -- sq.pyramid, I -- square, O -- sphere???, A,K,V -- ???) - -28. Add extra texture in Error -- for handling transparency of "marks" ??? -29. Textual colors, like "{0xFF00FF}" ?!? -30. Auto axis range for formulas, like AutoRange("y(x)") or AutoRange('x',"x(t)"). -31. Add Vect3 for vectors on slice - -33. Check feature: -* dash for rect, ellipse boundary - -34. Hotkeys -35. Check disabling completer in UDAV -36. Add line numbers in editor. - -37. Center ticks labels + check gap for axis labels (at axis rotation) - -============= DOCS ============= - -0. Option sample (_mirror) -1. Add back-references from samples - -2. Text about UDAV -3. Add FAQ about MPEG/GIF and PDF - -============= UDAV ============= - -01. Dialog for data input ------------------------------------------------ -| [Data name |V|] | -| [x1] [x2] [func] {ADD} | -| [y1] [y2] [suf|V] {ADD} | -| [z1] [z2] [oper|V] [dir] {ADD} | -| Reuslt [ ] | -| {Cancel} {OK} | ------------------------------------------------ -Ranges can be inverted. -Remove other setting if data name is changed. - -02. Double click -> jump to string + setup dialog (optionally) -03. Dialog for InPlot(s): -{SubPlot,MultiPlot} -- enable rotate,aspect,title -{ColumnPlot} -- enable rotate,several -{StickPlot} -- enable several -{InPlot} -- enable rotate,aspect,title - -04. Group/ungroup if command in single line, separated by ':' -05. Hide plot/group by putting "#h " at beginning of line -06. Annotation of plot/group -- comment before it -09. Data change via menu/toolbar -- save to internal script => enable undo + save initial array(?) -10. Add primitives by mouse at beginning of script + change its size/position by mouse + "attraction" points -11. Drag&drop plot/group between inplots -12. Create default plot dependently of selected row/column/range in data table -13. Show plot at creation stage (if option is enabled -- can be size_t process!!!) -14. Rotate/perspective/lighting/... of primitive list (without script re-execution) - -15. QTreeWidgetItem -- ICON (if,for,once,subplot,...); Cmd text; LINE - POS in group/line. After editing/changing --> put text to editor. - -17. Setupable hot-keys ?!? -18. Insert just filename (without path) by demand - -============= UNSURE =========== - -1. Problem with \calB and so on (\calH, ...) -- they are present only in italic font :(. -2. create PWT fonts -3. \dfrac for normal size and centering (sample \big\big{\frac{1}{2}}) ??? -4. "Cut off" curves if text is printed inside it (for contour labels) ?!? -5. String variables in MGL + readstr command. -6. Pool of threads for speeding up ??? -7. Drops as mglPrim -- not accurate but smaller memory and faster -8. Text aspect ratio in OpenGL mode diff --git a/udav/CMakeLists.txt b/udav/CMakeLists.txt index 70b1d9e..36ff0dd 100644 --- a/udav/CMakeLists.txt +++ b/udav/CMakeLists.txt @@ -4,11 +4,11 @@ if(MGL_HAVE_QT) set(udav_src anim_dlg.cpp find_dlg.cpp mem_pnl.cpp prop_dlg.cpp textedit.cpp args_dlg.cpp help_pnl.cpp newcmd_dlg.cpp text_pnl.cpp calc_dlg.cpp hint_dlg.cpp open_dlg.cpp qmglsyntax.cpp udav_wnd.cpp dat_pnl.cpp info_dlg.cpp opt_dlg.cpp setup_dlg.cpp - files_dlg.cpp plot_pnl.cpp style_dlg.cpp) + files_dlg.cpp plot_pnl.cpp style_dlg.cpp data_dlg.cpp tree_pnl.cpp) set(udav_moc_hdr anim_dlg.h files_dlg.h info_dlg.h opt_dlg.h qmglsyntax.h text_pnl.h args_dlg.h find_dlg.h mem_pnl.h plot_pnl.h setup_dlg.h udav_wnd.h calc_dlg.h help_pnl.h newcmd_dlg.h - prop_dlg.h style_dlg.h dat_pnl.h open_dlg.h textedit.h hint_dlg.h) + prop_dlg.h style_dlg.h dat_pnl.h open_dlg.h textedit.h hint_dlg.h data_dlg.h) set(udav_rc udav.qrc) @@ -26,7 +26,7 @@ qt4_add_resources(udav_rc_src ${udav_rc} ) #qt_wrap_cpp(udav udav_moc_src ${udav_moc_hdr} ) qt4_wrap_cpp(udav_moc_src ${udav_moc_hdr} ) add_executable(udav ${udav_src} ${udav_moc_src} ${udav_rc_src}) -target_link_libraries(udav mgl-wnd ${QT_LIBRARIES}) +target_link_libraries(udav mgl-qt ${QT_LIBRARIES}) if(MGL_HAVE_PTHREAD) target_link_libraries(udav ${CMAKE_THREAD_LIBS_INIT}) @@ -36,8 +36,8 @@ install( TARGETS udav RUNTIME DESTINATION bin ) -install(FILES UDAV.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/) +install(FILES udav.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/) install(FILES udav.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps/) -#install(FILES udav_ru.qm DESTINATION ${CMAKE_INSTALL_PREFIX}/share/udav/) +install(FILES udav_ru.qm DESTINATION ${CMAKE_INSTALL_PREFIX}/share/udav/) endif(MGL_HAVE_QT) diff --git a/udav/ReadMe b/udav/ReadMe deleted file mode 100644 index 87d23f7..0000000 --- a/udav/ReadMe +++ /dev/null @@ -1,11 +0,0 @@ -READ THIS IN ORDER TO COMPILE THE Qt4 TEMPLATE ----------------------------------------------- - -Before compiling, check the Qt Options, go to -Project->Project Options->C++ Support and open the Qt Options tab. - -Check that the Qt installation directory is correct for the Qt version you've chosen. - ------------------- -Andreas Pakulat -July 2006 diff --git a/udav/anim_dlg.h b/udav/anim_dlg.h index 2846404..4a34682 100644 --- a/udav/anim_dlg.h +++ b/udav/anim_dlg.h @@ -33,7 +33,7 @@ Q_OBJECT public: bool gifOn, jpgOn; /// string with resulting animation parameters - const QString &getResult() { return res; }; + const QString &getResult() { return res; } void setResult(const QString &s); void setResult(double a1,double a2,double da); AnimParam(QWidget *parent=0); diff --git a/udav/args_dlg.cpp b/udav/args_dlg.cpp index 69591da..aa20c48 100644 --- a/udav/args_dlg.cpp +++ b/udav/args_dlg.cpp @@ -21,9 +21,9 @@ #include #include #include -#include +#include #include "args_dlg.h" -extern mglParser parser; +extern mglParse parser; //----------------------------------------------------------------------------- QDialog *createArgsDlg(QWidget *p) { return new ArgsDialog(p); } //----------------------------------------------------------------------------- diff --git a/udav/calc_dlg.cpp b/udav/calc_dlg.cpp index 000ecbe..7ddcdf0 100644 --- a/udav/calc_dlg.cpp +++ b/udav/calc_dlg.cpp @@ -24,9 +24,9 @@ #include #include #include -#include +#include #include "calc_dlg.h" -extern mglParser parser; +extern mglParse parser; mglData mglFormulaCalc(const wchar_t *string, mglParser *arg); //----------------------------------------------------------------------------- // @@ -181,7 +181,7 @@ void CalcDialog::evaluate() wchar_t *txt=new wchar_t[sel.length()+1]; sel.toWCharArray(txt); txt[sel.length()]=0; setlocale(LC_NUMERIC, "C"); - mglData res=mglFormulaCalc(txt, &parser); + mglData res=parser.Calc(txt); setlocale(LC_NUMERIC, ""); // result->setText(QString::fromWCharArray(txt)); delete []txt; diff --git a/udav/dat_pnl.cpp b/udav/dat_pnl.cpp index 154f653..6724a7a 100644 --- a/udav/dat_pnl.cpp +++ b/udav/dat_pnl.cpp @@ -32,13 +32,16 @@ #include #include #include -#include +#include +#include +#include +#include //----------------------------------------------------------------------------- #include "dat_pnl.h" #include "info_dlg.h" #include "xpm/table.xpm" //----------------------------------------------------------------------------- -extern mglParser parser; +extern mglParse parser; void updateDataItems(); void addDataPanel(QWidget *wnd, QWidget *w, QString name); void deleteDat(void *o) { if(o) delete ((DatPanel *)o); } @@ -59,7 +62,7 @@ DatPanel::DatPanel(InfoDialog *inf, QWidget *parent) : QWidget(parent) ready = false; infoDlg = inf; QBoxLayout *v,*h,*m; - menu = new QMenu(tr("&Data"),this); + menu = new QMenu(tr("Data"),this); v = new QVBoxLayout(this); h = new QHBoxLayout(); v->addLayout(h); toolTop(h); h = new QHBoxLayout(); v->addLayout(h); @@ -77,11 +80,11 @@ void DatPanel::refresh() bool rc = false; if(!var) return; infoDlg->allowRefresh=false; - if(nx!=var->d.nx) { nx = var->d.nx; tab->setColumnCount(nx);rc=true; } - if(ny!=var->d.ny) { ny = var->d.ny; tab->setRowCount(ny); rc=true; } - if(kz>=var->d.nz) { kz = 0; emit sliceChanged(0); } - if(nz!=var->d.ny) { nz = var->d.nz; emit nzChanged(nz); } - id = QString(var->d.id.c_str()); + if(nx!=var->nx) { nx = var->nx; tab->setColumnCount(nx); rc=true; } + if(ny!=var->ny) { ny = var->ny; tab->setRowCount(ny); rc=true; } + if(kz>=var->nz) { kz = 0; emit sliceChanged(0); } + if(nz!=var->ny) { nz = var->nz; emit nzChanged(nz); } + id = QString(var->id.c_str()); if(nz==1 && ny>1 && !id.isEmpty()) { QStringList head; @@ -109,7 +112,7 @@ void DatPanel::refresh() } for(i=0;id.GetVal(i,j,kz); + f = var->GetVal(i,j,kz); if(mgl_isnan(f)) s = "nan"; else s.sprintf("%g",f); tab->item(j,i)->setText(s); @@ -158,48 +161,56 @@ void DatPanel::putValue(int r, int c) QString s = tab->item(r,c)->text().toLower(); mreal f; f = s=="nan" ? NAN : s.toDouble(); - if(f!=var->d.GetVal(c,r,kz)) + if(f!=var->GetVal(c,r,kz)) { if(mgl_isnan(f)) s="nan"; else s.sprintf("%g", f); tab->item(r,c)->setText(s); } - var->d.SetVal(f,c,r,kz); + var->SetVal(f,c,r,kz); infoDlg->refresh(); } //----------------------------------------------------------------------------- -void DatPanel::imprt() +void DatPanel::save() { - QString fn = QFileDialog::getOpenFileName(this, tr("UDAV - Import PNG"), "", tr("Data files (*.dat)\nAll files (*.*)")); - if(!fn.isEmpty()) + QString fn = QFileDialog::getSaveFileName(this, tr("UDAV - Save/export data"), "", + tr("Data files (*.dat)\nHDF5 files (*.h5 *.hdf)\nPNG files (*.png)\nAll files (*.*)")); + if(fn.isEmpty()) return; + QString ext = fn.section(".",-1); + if(ext=="png") { bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Export to PNG"), tr("Enter color scheme for picture.\nNote that data will be normalized in range [0,1]."), QLineEdit::Normal, "BbcyrR", &ok); - if(ok) var->d.Import(fn.toAscii(), s.toAscii()); - refresh(); + QString s = QInputDialog::getText(this, tr("UDAV - Export to PNG"), tr("Enter color scheme for picture"), QLineEdit::Normal, "BbcyrR", &ok); + if(ok) var->Export(fn.toAscii().constData(), s.toAscii().constData()); } -} -//----------------------------------------------------------------------------- -void DatPanel::exprt() -{ - QString fn = QFileDialog::getOpenFileName(this, tr("UDAV - Import PNG"), "", tr("PNG files (*.png)\nAll files (*.*)")); - if(!fn.isEmpty()) + else if(ext=="h5" || ext=="hdf") { bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Export to PNG"), tr("Enter color scheme for picture"), QLineEdit::Normal, "BbcyrR", &ok); - if(ok) var->d.Export(fn.toAscii(), s.toAscii()); + QString s = QInputDialog::getText(this, tr("UDAV - Save to HDF"), tr("Enter data name"), QLineEdit::Normal, QString::fromStdWString(var->s), &ok); + if(ok) var->SaveHDF(fn.toAscii().constData(), s.toAscii().constData()); } -} -//----------------------------------------------------------------------------- -void DatPanel::save() -{ - QString fn = QFileDialog::getSaveFileName(this, tr("UDAV - Save data"), "", tr("Data files (*.dat)\nAll files (*.*)")); - if(!fn.isEmpty()) var->d.Save(fn.toAscii()); + else var->Save(fn.toAscii().constData()); } //----------------------------------------------------------------------------- void DatPanel::load() { - QString fn = QFileDialog::getOpenFileName(this, tr("UDAV - Load data"), "", tr("Data files (*.dat)\nAll files (*.*)")); - if(!fn.isEmpty()) { var->d.Read(fn.toAscii()); refresh(); } + QString fn = QFileDialog::getOpenFileName(this, tr("UDAV - Load data"), "", + tr("Data files (*.dat)\nHDF5 files (*.h5 *.hdf)\nPNG files (*.png)\nAll files (*.*)")); + if(fn.isEmpty()) return; + QString ext = fn.section(".",-1); + if(ext=="png") + { + bool ok; + QString s = QInputDialog::getText(this, tr("UDAV - Import PNG"), tr("Enter color scheme for picture"), QLineEdit::Normal, "BbcyrR", &ok); + if(ok) var->Import(fn.toAscii().constData(), s.toAscii().constData()); + } + else if(ext=="h5" || ext=="hdf") + { + bool ok; + QString s = QInputDialog::getText(this, tr("UDAV - Read from HDF"), tr("Enter data name"), QLineEdit::Normal, QString::fromStdWString(var->s), &ok); + if(ok) var->ReadHDF(fn.toAscii().constData(), s.toAscii().constData()); + } + else var->Read(fn.toAscii().constData()); + refresh(); } //----------------------------------------------------------------------------- void DatPanel::copy() @@ -232,7 +243,7 @@ void DatPanel::paste() { t = s.section('\t',j,j,QString::SectionSkipEmpty); if(t.isEmpty()) { j=nx; continue; } - var->d.SetVal(t.toDouble(),j+c,i+r,kz); + var->SetVal(t.toDouble(),j+c,i+r,kz); } } refresh(); @@ -262,19 +273,12 @@ void DatPanel::list() // TODO: in which script insert ??? }*/ } //----------------------------------------------------------------------------- -void DatPanel::byformula() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Fill data"), tr("Enter formula for data filling.\nNote that variables x,y,z supposed to be in range [0,1]."), QLineEdit::Normal, "", &ok); - if(ok) { var->d.Modify(s.toAscii()); refresh(); } -} -//----------------------------------------------------------------------------- void DatPanel::inrange() { QString v1("-1"), v2("1"), dir("x"); if(sizesDialog(tr("UDAV - Fill data"), tr("Enter range for data and direction of filling"), tr("From"), tr("To"), tr("Direction"), v1, v2, dir)) { - var->d.Fill(v1.toDouble(), v2.toDouble(), dir[0].toLatin1()); + var->Fill(v1.toDouble(), v2.toDouble(), dir[0].toLatin1()); refresh(); } } @@ -284,7 +288,7 @@ void DatPanel::norm() QString v1("0"), v2("1"), how; if(sizesDialog(tr("UDAV - Normalize data"), tr("Enter range for final data"), tr("From"), tr("To"), tr("Symmetrical?"), v1, v2, how)) { - var->d.Norm(v1.toDouble(), v2.toDouble(), (how=="on" || how.contains('s'))); + var->Norm(v1.toDouble(), v2.toDouble(), (how=="on" || how.contains('s'))); refresh(); } } @@ -294,7 +298,7 @@ void DatPanel::normsl() QString v1("0"), v2("1"), dir("z"); if(sizesDialog(tr("UDAV - Normalize by slice"), tr("Enter range for final data"), tr("From"), tr("To"), tr("Direction"), v1, v2, dir)) { - var->d.NormSl(v1.toDouble(), v2.toDouble(), dir[0].toLatin1()); + var->NormSl(v1.toDouble(), v2.toDouble(), dir[0].toLatin1()); refresh(); } } @@ -304,7 +308,7 @@ void DatPanel::create() QString mx, my("1"), mz("1"); if(sizesDialog(tr("UDAV - Clear data"), tr("Enter new data sizes"), tr("X-size"), tr("Y-size"), tr("Z-size"), mx, my, mz)) { - var->d.Create(mx.toInt(), my.toInt(), mz.toInt()); + var->Create(mx.toInt(), my.toInt(), mz.toInt()); refresh(); updateDataItems(); } } @@ -315,7 +319,7 @@ void DatPanel::reSize() mx.sprintf("%d",nx); my.sprintf("%d",ny); mz.sprintf("%d",nz); if(sizesDialog(tr("UDAV - Resize data"), tr("Enter new data sizes"), tr("X-size"), tr("Y-size"), tr("Z-size"), mx, my, mz)) { - var->d = var->d.Resize(mx.toInt(), my.toInt(), mz.toInt()); + var->Set(var->Resize(mx.toInt(), my.toInt(), mz.toInt())); refresh(); updateDataItems(); } } @@ -325,7 +329,7 @@ void DatPanel::squize() QString mx("1"), my("1"), mz("1"); if(sizesDialog(tr("UDAV - Squeeze data"), tr("Enter step of saved points. For example, '1' save all, '2' save each 2nd point, '3' save each 3d and so on."), tr("X-direction"), tr("Y-direction"), tr("Z-direction"), mx, my, mz)) { - var->d.Squeeze(mx.toInt(), my.toInt(), mz.toInt()); + var->Squeeze(mx.toInt(), my.toInt(), mz.toInt()); refresh(); updateDataItems(); } } @@ -335,7 +339,7 @@ void DatPanel::crop() QString n1("1"), n2("1"), dir; if(sizesDialog(tr("UDAV - Crop data"), tr("Enter range of saved date."), tr("From"), tr("To"), tr("Direction"), n1, n2, dir)) { - var->d.Squeeze(n1.toInt(), n2.toInt(), dir[0].toLatin1()); + var->Squeeze(n1.toInt(), n2.toInt(), dir[0].toLatin1()); refresh(); updateDataItems(); } } @@ -346,136 +350,11 @@ void DatPanel::rearrange() mx.sprintf("%d",nx); my.sprintf("%d",ny); mz.sprintf("%d",nz); if(sizesDialog(tr("UDAV - Rearrange data"), tr("Enter new data sizes"), tr("X-size"), tr("Y-size"), tr("Z-size"), mx, my, mz)) { - var->d.Rearrange(mx.toInt(), my.toInt(), mz.toInt()); + var->Rearrange(mx.toInt(), my.toInt(), mz.toInt()); refresh(); updateDataItems(); } } //----------------------------------------------------------------------------- -void DatPanel::transp() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Transpose data"), tr("Enter new order of dimensions.\nFor example, 'yx' or 'yxz' for transpose x-y, 'zyx' for transposing x-z and so on."), QLineEdit::Normal, "yx", &ok); - if(ok) { var->d.Transpose(s.toAscii()); refresh(); updateDataItems(); } -} -//----------------------------------------------------------------------------- -void DatPanel::smooth() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Smooth data"), tr("Enter direction(s) for smoothing.\nOptionally you may enter the kind of smoothing by 3 or by 5 points. For example 'xy3' - smooth only in x and y directions and use 3-points scheme."), QLineEdit::Normal, "xyz", &ok); - if(ok) { var->d.Smooth(s.toAscii().constData()); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::cumsum() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Summarize data"), tr("Enter direction(s) for cumulative summation.\nFor example 'xy' - summate along x and y directions."), QLineEdit::Normal, "", &ok); - if(ok) { var->d.CumSum(s.toAscii()); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::integr() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Integrate data"), tr("Enter direction(s) for integration.\nFor example 'xy' - integrate along x and y directions."), QLineEdit::Normal, "", &ok); - if(ok) { var->d.Integral(s.toAscii()); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::diff() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Differentiate data"), tr("Enter direction(s) for differentiation.\nFor example 'xy' - differentiate along x and y directions."), QLineEdit::Normal, "", &ok); - if(ok) { var->d.Diff(s.toAscii()); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::diff2() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Laplace transform"), tr("Enter direction(s) for laplace transform.\nFor example 'xy' - do transform along x and y directions."), QLineEdit::Normal, "", &ok); - if(ok) { var->d.Diff2(s.toAscii()); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::swap() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Swap data"), tr("Enter direction(s) for swapping (exchange left and right parts).\nFor example 'xy' - swap along x and y directions. Useful for Fourier spectrum."), QLineEdit::Normal, "", &ok); - if(ok) { var->d.Swap(s.toAscii()); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::mirror() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Mirror data"), tr("Enter direction(s) for mirroring.\nFor example 'xy' - mirror along x and y directions."), QLineEdit::Normal, "", &ok); - if(ok) { var->d.Swap(s.toAscii()); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::sumof() -{ - QString name, val; - if(namesDialog(tr("UDAV - Sum along ..."), tr("Specify direction(s) of summation"), name, val)) - { - mglVar *v = parser.AddVar(name.toAscii()); - v->d = var->d.Sum(val.toAscii()); - updateDataItems(); - } -} -//----------------------------------------------------------------------------- -void DatPanel::maxof() -{ - QString name, val; - if(namesDialog(tr("UDAV - Max along ..."), tr("Specify direction(s) of maximal values"), name, val)) - { - mglVar *v = parser.AddVar(name.toAscii()); - v->d = var->d.Max(val.toAscii()); - updateDataItems(); - } -} -//----------------------------------------------------------------------------- -void DatPanel::minof() -{ - QString name, val; - if(namesDialog(tr("UDAV - Min along ..."), tr("Specify direction(s) of minimal values"), name, val)) - { - mglVar *v = parser.AddVar(name.toAscii()); - v->d = var->d.Min(val.toAscii()); - updateDataItems(); - } -} -//----------------------------------------------------------------------------- -void DatPanel::momentx() -{ - QString name, val; - if(namesDialog(tr("UDAV - Momentum along 'x'"), - tr("Specify which momentum evaluate.\nThe momentum is res_i = sum_jk how(x_i,y_j,z_k) a_jk/ sum_jk a_jk.\nCoordinates x, y, z are data indexes normalized in range [0,1]."), name, val)) - { - mglVar *v = parser.AddVar(name.toAscii()); - v->d = var->d.Momentum('x', val.toAscii()); - updateDataItems(); - } -} -//----------------------------------------------------------------------------- -void DatPanel::momenty() -{ - QString name, val; - if(namesDialog(tr("UDAV - Momentum along 'y'"), - tr("Specify which momentum evaluate.\nThe momentum is res_j = sum_ik how(x_i,y_j,z_k) a_ik/ sum_ik a_ik.\nCoordinates x, y, z are data indexes normalized in range [0,1]."), name, val)) - { - mglVar *v = parser.AddVar(name.toAscii()); - v->d = var->d.Momentum('y', val.toAscii()); - updateDataItems(); - } -} -//----------------------------------------------------------------------------- -void DatPanel::momentz() -{ - QString name, val; - if(namesDialog(tr("UDAV - Momentum along 'z'"), - tr("Specify which momentum evaluate.\nThe momentum is res_k = sum_ij how(x_i,y_j,z_k) a_ij/ sum_ij a_ij.\nCoordinates x, y, z are data indexes normalized in range [0,1]."), name, val)) - { - mglVar *v = parser.AddVar(name.toAscii()); - v->d = var->d.Momentum('z', val.toAscii()); - updateDataItems(); - } -} -//----------------------------------------------------------------------------- void DatPanel::hist() { QLabel *l; @@ -500,41 +379,13 @@ void DatPanel::hist() bool res = d->exec(); if(res && !v1->text().isEmpty() && !v2->text().isEmpty() && !id->text().isEmpty()) { - mglVar *vv = parser.AddVar(id->text().toAscii()); + mglVar *vv = parser.AddVar(id->text().toAscii().constData()); if(!vv) return; - vv->d = var->d.Hist(nm->value(), v1->text().toDouble(), v2->text().toDouble()); + vv->Set(var->Hist(nm->value(), v1->text().toDouble(), v2->text().toDouble())); updateDataItems(); } } //----------------------------------------------------------------------------- -void DatPanel::addto() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Change data"), tr("Enter number for adding to data elements:"), QLineEdit::Normal, "", &ok); - if(ok) { var->d += s.toDouble(); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::subto() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Change data"), tr("Enter number for subtraction from data elements:"), QLineEdit::Normal, "", &ok); - if(ok) { var->d -= s.toDouble(); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::divto() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Change data"), tr("Enter number for division of data elements:"), QLineEdit::Normal, "", &ok); - if(ok) { var->d /= s.toDouble(); refresh(); } -} -//----------------------------------------------------------------------------- -void DatPanel::multo() -{ - bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Change data"), tr("Enter number for multiplication of data elements:"), QLineEdit::Normal, "", &ok); - if(ok) { var->d *= s.toDouble(); refresh(); } -} -//----------------------------------------------------------------------------- void DatPanel::first() { setSlice(0); } //----------------------------------------------------------------------------- void DatPanel::last() { setSlice(nz-1); } @@ -584,18 +435,38 @@ bool DatPanel::sizesDialog(const QString &cap, const QString &lab, const QString return res; } //----------------------------------------------------------------------------- -bool DatPanel::namesDialog(const QString &cap, const QString &lab, QString &name, QString &val) +#include "xpm/plot.xpm" +#include "xpm/size.xpm" +#include "xpm/smth.xpm" +#include "xpm/crop.xpm" +#include "xpm/squize.xpm" +#include "xpm/sum.xpm" +#include "xpm/func.xpm" +#include "xpm/swap.xpm" +#include "xpm/hist.xpm" +#include "xpm/oper_dir.xpm" +#include "xpm/oper_of.xpm" +//----------------------------------------------------------------------------- +void DatPanel::newdat() { QLabel *l; QLineEdit *f1, *f2; QPushButton *b; QDialog *d = new QDialog(this); - d->setWindowTitle(cap); + d->setWindowTitle(tr("UDAV - make new data")); QVBoxLayout *v = new QVBoxLayout(d); - l = new QLabel(lab, d); v->addWidget(l); - l = new QLabel(tr("NOTE: All fields must be filled!"), d); v->addWidget(l); - f1 = new QLineEdit(val, d); v->addWidget(f1); - l = new QLabel(tr("Enter the name for new variable"), d); v->addWidget(l); + QComboBox *c = new QComboBox(d); v->addWidget(c); + c->addItem(tr("Sum along direction(s)")); + c->addItem(tr("Min along direction(s)")); + c->addItem(tr("Max along direction(s)")); + c->addItem(tr("Momentum along 'x' for function")); + c->addItem(tr("Momentum along 'y' for function")); + c->addItem(tr("Momentum along 'z' for function")); + c->setCurrentIndex(0); + + f1 = new QLineEdit("z",d); v->addWidget(f1); + QCheckBox *cb = new QCheckBox(tr("Put into this data array"), d); v->addWidget(cb); + l = new QLabel(tr("or enter name for new variable"), d); v->addWidget(l); f2 = new QLineEdit(d); v->addWidget(f2); QHBoxLayout *h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); b = new QPushButton(tr("Cancel"), d); h->addWidget(b); @@ -605,28 +476,121 @@ bool DatPanel::namesDialog(const QString &cap, const QString &lab, QString &name b->setDefault(true); // now execute dialog and get values bool res = d->exec(); - val = f1->text(); name = f2->text(); - if(val.isEmpty() || name.isEmpty()) res = false; - delete d; - return res; + QString val = f1->text(), mgl; + int k = c->currentIndex(); + QString self = QString::fromStdWString(var->s); + if(res) + { + if(k<0) + { + QMessageBox::warning(d, tr("UDAV - make new data"), + tr("No action is selected. Do nothing.")); + return; + } + if(val.isEmpty()) + { + QMessageBox::warning(d, tr("UDAV - make new data"), + tr("No direction/formula is entered. Do nothing.")); + return; + } + if(cb->isChecked()) k += 6; + QString name = f2->text(); + switch(k) + { + case 0: mgl = "sum "+name+" "+self+" '"+val+"'"; break; + case 1: mgl = "min "+name+" "+self+" '"+val+"'"; break; + case 2: mgl = "max "+name+" "+self+" '"+val+"'"; break; + case 3: mgl = "momentum "+name+" "+self+" 'x' '"+val+"'"; break; + case 4: mgl = "momentum "+name+" "+self+" 'y' '"+val+"'"; break; + case 5: mgl = "momentum "+name+" "+self+" 'z' '"+val+"'"; break; + case 6: mgl = "copy "+self+" {sum "+self+" '"+val+"'}"; break; + case 7: mgl = "copy "+self+" {min "+self+" '"+val+"'}"; break; + case 8: mgl = "copy "+self+" {max "+self+" '"+val+"'}"; break; + case 9: mgl = "copy "+self+" {momentum "+self+" 'x' '"+val+"'}"; break; + case 10: mgl = "copy "+self+" {momentum "+self+" 'y' '"+val+"'}"; break; + case 11: mgl = "copy "+self+" {momentum "+self+" 'z' '"+val+"'}"; break; + } + } + if(!mgl.isEmpty()) + { + mglGraph gr; + parser.Execute(&gr,mgl.toAscii().constData()); + opers += mgl+"\n"; + updateDataItems(); + } } //----------------------------------------------------------------------------- -#include "xpm/plot.xpm" -#include "xpm/size.xpm" -#include "xpm/smth.xpm" -#include "xpm/oper_d.xpm" -#include "xpm/oper_s.xpm" -#include "xpm/oper_a.xpm" -#include "xpm/oper_m.xpm" -#include "xpm/crop.xpm" -#include "xpm/tran.xpm" -#include "xpm/integr.xpm" -#include "xpm/diff.xpm" -#include "xpm/diff2.xpm" -#include "xpm/squize.xpm" -#include "xpm/sum.xpm" -#include "xpm/func.xpm" -#include "xpm/swap.xpm" +void DatPanel::oper() +{ + QLabel *l; + QLineEdit *f1; + QPushButton *b; + QDialog *d = new QDialog(this); + d->setWindowTitle(tr("UDAV - change data")); + QVBoxLayout *v = new QVBoxLayout(d); + QComboBox *c = new QComboBox(d); v->addWidget(c); + c->addItem(tr("Fill data by formula")); + c->addItem(tr("Transpose data with new dimensions")); + c->addItem(tr("Smooth data along direction(s)")); + c->addItem(tr("Summarize data along direction(s)")); + c->addItem(tr("Integrate data along direction(s)")); + c->addItem(tr("Differentiate data along direction(s)")); + c->addItem(tr("Laplace transform along direction(s)")); + c->addItem(tr("Swap data along direction(s)")); + c->addItem(tr("Mirror data along direction(s)")); + c->addItem(tr("Sin-Fourier transform along direction(s)")); + c->addItem(tr("Cos-Fourier transform along direction(s)")); + c->addItem(tr("Hankel transform along direction(s)")); + c->addItem(tr("Sew data along direction(s)")); + c->addItem(tr("Find envelope along direction(s)")); + c->setCurrentIndex(0); + + f1 = new QLineEdit("z",d); v->addWidget(f1); + QHBoxLayout *h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); + b = new QPushButton(tr("Cancel"), d); h->addWidget(b); + connect(b, SIGNAL(clicked()), d, SLOT(reject())); + b = new QPushButton(tr("OK"), d); h->addWidget(b); + connect(b, SIGNAL(clicked()), d, SLOT(accept())); + b->setDefault(true); + // now execute dialog and get values + bool res = d->exec(); + QString val = f1->text(), mgl; + int k = c->currentIndex(); + QString self = QString::fromStdWString(var->s); + if(res) + { + if(k<0) + { + QMessageBox::warning(d, tr("UDAV - make new data"), + tr("No action is selected. Do nothing.")); + return; + } + switch(k) + { + case 0: mgl = "modify "+self+" '"+val+"'"; break; + case 1: mgl = "transpose "+self+" '"+val+"'"; break; + case 2: mgl = "smooth "+self+" '"+val+"'"; break; + case 3: mgl = "cumsum "+self+" '"+val+"'"; break; + case 4: mgl = "integrate "+self+" '"+val+"'"; break; + case 5: mgl = "diff "+self+" '"+val+"'"; break; + case 6: mgl = "diff2 "+self+" '"+val+"'"; break; + case 7: mgl = "swap "+self+" '"+val+"'"; break; + case 8: mgl = "mirror "+self+" '"+val+"'"; break; + case 9: mgl = "sinfft "+self+" '"+val+"'"; break; + case 10: mgl = "cosfft "+self+" '"+val+"'"; break; + case 11: mgl = "hankel "+self+" '"+val+"'"; break; + case 12: mgl = "sew "+self+" '"+val+"'"; break; + case 13: mgl = "envelop "+self+" '"+val+"'"; break; + } + } + if(!mgl.isEmpty()) + { + mglGraph gr; + parser.Execute(&gr,mgl.toAscii().constData()); + opers += mgl+"\n"; + updateDataItems(); + } +} //----------------------------------------------------------------------------- void DatPanel::toolTop(QBoxLayout *l) { @@ -635,65 +599,53 @@ void DatPanel::toolTop(QBoxLayout *l) QToolButton *bb; // file menu - o = menu->addMenu(tr("&File")); - a = new QAction(QPixmap(":/xpm/document-open.png"), tr("&Load data"), this); + o = menu->addMenu(tr("File")); + a = new QAction(QPixmap(":/xpm/document-open.png"), tr("Load data"), this); connect(a, SIGNAL(triggered()), this, SLOT(load())); - a->setToolTip(tr("Load data from file. Data will be deleted only\nat exit but UDAV will not ask to save it.")); + a->setToolTip(tr("Load data from file. Data will be deleted only\nat exit but UDAV will not ask to save it (Ctrl+Shift+O).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_O); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/document-import.png"), tr("&Import PNG"), this); - connect(a, SIGNAL(triggered()), this, SLOT(imprt())); - a->setToolTip(tr("Import data from PNG picture with specified color scheme.\nData will be deleted only at exit but UDAV will not ask it saving.")); - o->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - - a = new QAction(QPixmap(":/xpm/document-save.png"), tr("&Save data"), this); + a = new QAction(QPixmap(":/xpm/document-save.png"), tr("Save data"), this); connect(a, SIGNAL(triggered()), this, SLOT(save())); - a->setToolTip(tr("Save data to tab-separeted file.")); + a->setToolTip(tr("Save data to a file (Ctrl+Shift+S).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_S); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/document-export.png"), tr("&Export PNG"), this); - connect(a, SIGNAL(triggered()), this, SLOT(exprt())); - a->setToolTip(tr("Export data to PNG picture. The colors defined by \nspecified color scheme. The same as in 'dens' command.")); - o->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - // o->addSeparator(); bb->addSeparator(); -// a = new QAction(QPixmap(insert_xpm), tr("Insert as &list"), this); +// a = new QAction(QPixmap(insert_xpm), tr("Insert as list"), this); // connect(a, SIGNAL(triggered()), this, SLOT(list())); // o->addAction(a); // bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(plot_xpm), tr("Plot &data"), this); + a = new QAction(QPixmap(plot_xpm), tr("Plot data"), this); connect(a, SIGNAL(triggered()), this, SLOT(plot())); a->setToolTip(tr("Plot data in new script window. You may select the kind\nof plot, its style and so on.")); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/edit-copy.png"), tr("Copy &data"), this); + a = new QAction(QPixmap(":/xpm/edit-copy.png"), tr("Copy data"), this); connect(a, SIGNAL(triggered()), this, SLOT(copy())); - a->setToolTip(tr("Copy range of numbers to clipboard.")); - o->addAction(a); + a->setToolTip(tr("Copy range of numbers to clipboard (Ctrl+Shift+C).")); + a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_C); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/edit-paste.png"), tr("Paste &data"), this); + a = new QAction(QPixmap(":/xpm/edit-paste.png"), tr("Paste data"), this); connect(a, SIGNAL(triggered()), this, SLOT(copy())); - a->setToolTip(tr("Paste range of numbers from clipboard.")); - o->addAction(a); + a->setToolTip(tr("Paste range of numbers from clipboard (Ctrl+Shift+P).")); + a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_V); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); // navigation menu - o = menu->addMenu(tr("&Navigate")); - a = new QAction(QPixmap(":/xpm/go-first.png"), tr("&First slice"), this); + o = menu->addMenu(tr("Navigate")); + a = new QAction(QPixmap(":/xpm/go-first.png"), tr("First slice"), this); connect(a, SIGNAL(triggered()), this, SLOT(first())); a->setToolTip(tr("Go to the first data slice for 3D data.")); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/go-previous.png"), tr("&Prev. slice"), this); + a = new QAction(QPixmap(":/xpm/go-previous.png"), tr("Prev. slice"), this); connect(a, SIGNAL(triggered()), this, SLOT(prev())); a->setToolTip(tr("Go to the previous data slice for 3D data.")); o->addAction(a); @@ -731,20 +683,20 @@ void DatPanel::toolLeft(QBoxLayout *l) QToolButton *bb; // size menu - o = menu->addMenu(tr("&Sizes")); - a = new QAction(QPixmap(":/xpm/document-new.png"), tr("&Create new"), this); + o = menu->addMenu(tr("Sizes")); + a = new QAction(QPixmap(":/xpm/document-new.png"), tr("Create new"), this); connect(a, SIGNAL(triggered()), this, SLOT(create())); - a->setToolTip(tr("Recreate the data with new sizes and fill it by zeros (Ctrl+N).")); - a->setShortcut(Qt::CTRL+Qt::Key_N); o->addAction(a); + a->setToolTip(tr("Recreate the data with new sizes and fill it by zeros (Ctrl+Shift+N).")); + a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_N); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(size_xpm), tr("&Resize"), this); + a = new QAction(QPixmap(size_xpm), tr("Resize"), this); connect(a, SIGNAL(triggered()), this, SLOT(reSize())); - a->setToolTip(tr("Resize (interpolate) the data to specified sizes (Ctrl+R).")); - a->setShortcut(Qt::CTRL+Qt::Key_R); o->addAction(a); + a->setToolTip(tr("Resize (interpolate) the data to specified sizes (Ctrl+Shift+R).")); + a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_R); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(squize_xpm), tr("&Squeeze"), this); + a = new QAction(QPixmap(squize_xpm), tr("Squeeze"), this); connect(a, SIGNAL(triggered()), this, SLOT(squize())); a->setToolTip(tr("Keep only each n-th element of the data array.")); o->addAction(a); @@ -756,112 +708,46 @@ void DatPanel::toolLeft(QBoxLayout *l) o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(tran_xpm), tr("&Transpose"), this); - connect(a, SIGNAL(triggered()), this, SLOT(transp())); - a->setToolTip(tr("Transpose data dimensions, like x<->y or x<->z and so on.")); - o->addAction(a); + a = new QAction(QPixmap(oper_of_xpm), tr("Transform"), this); + connect(a, SIGNAL(triggered()), this, SLOT(newdat())); + a->setToolTip(tr("Transform data along dimension(s) (Ctrl+Shift+T).")); + a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_T); o->addAction(a); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); + + a = new QAction(QPixmap(oper_dir_xpm), tr("Make new (Ctrl+Shift+M)"), this); + connect(a, SIGNAL(triggered()), this, SLOT(oper())); + a->setToolTip(tr("Make another data.")); + a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_M); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(tr("Re&arrange"), this); + a = new QAction(QPixmap(hist_xpm), tr("Histogram (Ctrl+Shift+H)"), this); + connect(a, SIGNAL(triggered()), this, SLOT(hist())); + a->setToolTip(tr("Find histogram of data.")); + a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_H); o->addAction(a); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); + +/* a = new QAction(QPixmap(":/xpm/view-refresh.png"), tr("Refresh"), this); + connect(a, SIGNAL(triggered()), this, SLOT(refresh())); + a->setToolTip(tr("Refresh data values.")); + o->addAction(a); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a);*/ + +/* a = new QAction(tr("Rearrange"), this); // TODO: move in generalized dialog connect(a, SIGNAL(triggered()), this, SLOT(rearrange())); a->setToolTip(tr("Rearrange data sizes without changing data values.")); o->addAction(a); - - // modify menu - o = menu->addMenu(tr("&Modify")); - a = new QAction(QPixmap(func_xpm), tr("By &formula"), this); - connect(a, SIGNAL(triggered()), this, SLOT(byformula())); - a->setToolTip(tr("Change data values according to formula depended on 'x', 'y' and 'z'\nvariables. A set of special function is availible also.")); - a->setShortcut(Qt::CTRL+Qt::Key_M); o->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - - a = new QAction(tr("Fill in &range"), this); + a = new QAction(tr("Fill in range"), this); connect(a, SIGNAL(triggered()), this, SLOT(inrange())); a->setToolTip(tr("Fill data equidistantly from one value to another.")); o->addAction(a); - a = new QAction(tr("&Normalize"), this); + a = new QAction(tr("Normalize"), this); connect(a, SIGNAL(triggered()), this, SLOT(norm())); a->setToolTip(tr("Normalize data so that its minimal\nand maximal values be in specified range.")); o->addAction(a); - a = new QAction(tr("Norm. s&lices"), this); + a = new QAction(tr("Norm. slices"), this); connect(a, SIGNAL(triggered()), this, SLOT(normsl())); a->setToolTip(tr("Normalize each data slice perpendicular to some direction\nso that its minimal and maximal values be in specified range.")); - o->addAction(a); - a = new QAction(QPixmap(smth_xpm), tr("&Smooth data"), this); - connect(a, SIGNAL(triggered()), this, SLOT(smooth())); - a->setToolTip(tr("Smooth data by one of 4 methods along specified direction(s).")); - o->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - - oo = menu->addMenu(tr("&Operators")); - a = new QAction(QPixmap(sum_xpm), tr("&Cum. sum"), this); - connect(a, SIGNAL(triggered()), this, SLOT(cumsum())); - a->setToolTip(tr("Summate data values along specified direction(s).")); - oo->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - - a = new QAction(QPixmap(integr_xpm), tr("&Integrate"), this); - connect(a, SIGNAL(triggered()), this, SLOT(integr())); - a->setToolTip(tr("Integrate data values along specified direction(s).")); - oo->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - - a = new QAction(QPixmap(diff_xpm), tr("&Differentiate"), this); - connect(a, SIGNAL(triggered()), this, SLOT(diff())); - a->setToolTip(tr("Differentiate data values along specified direction(s).")); - oo->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - - a = new QAction(QPixmap(diff2_xpm), tr("&Laplace"), this); - connect(a, SIGNAL(triggered()), this, SLOT(diff2())); - a->setToolTip(tr("Double differentiate data values along specified direction(s).")); - oo->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - - a = new QAction(QPixmap(swap_xpm), tr("&Swap"), this); - connect(a, SIGNAL(triggered()), this, SLOT(swap())); - a->setToolTip(tr("Swap left and right data part along specified direction(s).\nThis operation is useful for data after Fourier transform.")); - oo->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - - a = new QAction(tr("&Mirror"), this); - connect(a, SIGNAL(triggered()), this, SLOT(mirror())); - a->setToolTip(tr("Mirror left and right data part along specified direction(s).\nThis operation do like index change from 'i' to 'n-i'.")); - oo->addAction(a); - - oo = menu->addMenu(tr("&Algebraic")); - a = new QAction(QPixmap(oper_a_xpm), tr("&Add"), this); - connect(a, SIGNAL(triggered()), this, SLOT(addto())); - a->setToolTip(tr("Add a number to all data values.")); - oo->addAction(a); - a = new QAction(QPixmap(oper_s_xpm), tr("&Subtract"), this); - connect(a, SIGNAL(triggered()), this, SLOT(subto())); - a->setToolTip(tr("Subtract a number to all data values.")); - oo->addAction(a); - a = new QAction(QPixmap(oper_m_xpm), tr("&Multiply"), this); - connect(a, SIGNAL(triggered()), this, SLOT(multo())); - a->setToolTip(tr("Multiply all data values by a number.")); - oo->addAction(a); - a = new QAction(QPixmap(oper_d_xpm), tr("&Divide"), this); - connect(a, SIGNAL(triggered()), this, SLOT(divto())); - a->setToolTip(tr("Divide all data values by a number.")); - oo->addAction(a); - - oo = menu->addMenu(tr("A¬her data")); - a = new QAction(tr("&Sum of"), this); oo->addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(sumof())); - a = new QAction(tr("M&in of"), this); oo->addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(minof())); - a = new QAction(tr("M&ax of"), this); oo->addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(maxof())); - a = new QAction(tr("Momentum along &x"), this); oo->addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(momentx())); - a = new QAction(tr("Momentum along &y"), this); oo->addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(momenty())); - a = new QAction(tr("Momentum along &z"), this); oo->addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(momentz())); - a = new QAction(tr("&Histogram"), this); oo->addAction(a); - connect(a, SIGNAL(triggered()), this, SLOT(hist())); + o->addAction(a);*/ l->addStretch(1); } diff --git a/udav/dat_pnl.h b/udav/dat_pnl.h index b9be24b..28d444f 100644 --- a/udav/dat_pnl.h +++ b/udav/dat_pnl.h @@ -39,11 +39,14 @@ public: DatPanel(InfoDialog *inf, QWidget *parent = 0); ~DatPanel(); - void refresh(); ///< Refresh table with new data values void setVar(mglVar *v); inline long GetNz() { return nz; } ///< Get number of slices QString dataName(); +public slots: + QString dataOper() { return opers; } + void refresh(); ///< Refresh table with new data values + signals: void sliceChanged(int); void nzChanged(int); @@ -54,14 +57,11 @@ private slots: // menu genereal void load(); void save(); - void imprt(); - void exprt(); void copy(); void paste(); void plot(); void list(); // menu fill - void byformula(); void inrange(); void norm(); void normsl(); @@ -70,29 +70,12 @@ private slots: void reSize(); void squize(); void crop(); - void transp(); void rearrange(); // menu change - void smooth(); - void cumsum(); - void integr(); - void diff(); - void diff2(); - void swap(); - void mirror(); - // menu another ??? - void sumof(); - void maxof(); - void minof(); - void momentx(); - void momenty(); - void momentz(); + void oper(); + // menu another + void newdat(); void hist(); - // menu operations - void addto(); - void subto(); - void divto(); - void multo(); // menu navigation void first(); void last(); @@ -104,6 +87,7 @@ private slots: private: int nx,ny,nz; ///< Data sizes QString id; + QString opers; QTableWidget *tab; ///< Table itself int kz; ///< Current z-slice mglVar *var; ///< Variable with data @@ -112,7 +96,6 @@ private: QSpinBox *sb; bool sizesDialog(const QString &cap, const QString &lab, const QString &desc1, const QString &desc2, const QString &desc3, QString &val1, QString &val2, QString &val3); - bool namesDialog(const QString &cap, const QString &lab, QString &name, QString &val); void toolTop(QBoxLayout *l); void toolLeft(QBoxLayout *l); }; diff --git a/udav/data_dlg.cpp b/udav/data_dlg.cpp new file mode 100644 index 0000000..050307b --- /dev/null +++ b/udav/data_dlg.cpp @@ -0,0 +1,145 @@ +/*************************************************************************** + * Copyright (C) 2008 by Alexey Balakin * + * mathgl.abalakin@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include +#include +#include +#include +#include +//----------------------------------------------------------------------------- +#include +mglData mglFormulaCalc(const wchar_t *string, mglParser *arg); +extern mglParse parser; +#include "data_dlg.h" +//----------------------------------------------------------------------------- +DataDialog::DataDialog(QWidget* parent): QDialog(parent) +{ + setWindowTitle(tr("UDAV - Insert style/scheme")); + QHBoxLayout *h; + QVBoxLayout *v; + QGridLayout *g; + QLabel *l; + QPushButton *b; + + v = new QVBoxLayout(this); + h = new QHBoxLayout(); v->addLayout(h); + l = new QLabel(tr("Data name"), this); h->addWidget(l); + name = new QComboBox(this); h->addWidget(name); + + g = new QGridLayout(); v->addLayout(g); + + l = new QLabel("x1", this); g->addWidget(l, 0, 0); + x1 = new QSpinBox(this); x1->setMinimum(-1); g->addWidget(x1, 0, 1); + l = new QLabel("x2", this); g->addWidget(l, 0, 2); + x2 = new QSpinBox(this); x2->setMinimum(-1); g->addWidget(x2, 0, 3); + + l = new QLabel("y1", this); g->addWidget(l, 1, 0); + y1 = new QSpinBox(this); y1->setMinimum(-1); g->addWidget(y1, 1, 1); + l = new QLabel("y2", this); g->addWidget(l, 1, 2); + y2 = new QSpinBox(this); y2->setMinimum(-1); g->addWidget(y2, 1, 3); + + l = new QLabel("z1", this); g->addWidget(l, 2, 0); + z1 = new QSpinBox(this); z1->setMinimum(-1); g->addWidget(z1, 2, 1); + l = new QLabel("z2", this); g->addWidget(l, 2, 2); + z2 = new QSpinBox(this); z2->setMinimum(-1); g->addWidget(z2, 2, 3); + + x1->setValue(-1); y1->setValue(-1); z1->setValue(-1); + x2->setValue(-1); y2->setValue(-1); z2->setValue(-1); + + l = new QLabel(tr("Operation")); g->addWidget(l, 3, 0); + oper = new QComboBox(this); g->addWidget(oper, 3, 1); + oper->addItem(tr("none")); oper->addItem(tr("sum")); + oper->addItem(tr("min")); oper->addItem(tr("max")); + l = new QLabel("along", this); g->addWidget(l, 3, 2); + dirs = new QComboBox(this); g->addWidget(dirs, 3, 3); + dirs->addItem("xyz"); + dirs->addItem("x"); dirs->addItem("y"); dirs->addItem("z"); + dirs->addItem("xy"); dirs->addItem("xz"); dirs->addItem("yz"); + + connect(name, SIGNAL(currentIndexChanged(int)), this, SLOT(nameChanged())); + connect(x1, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); + connect(x2, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); + connect(y1, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); + connect(y2, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); + connect(z1, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); + connect(z2, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); + connect(oper, SIGNAL(currentIndexChanged(int)), this, SLOT(updateRes())); + connect(dirs, SIGNAL(currentIndexChanged(int)), this, SLOT(updateRes())); + + sizes = new QLabel(tr("Result")); v->addWidget(sizes); + res = new QLineEdit(this); v->addWidget(res); + connect(res, SIGNAL(textChanged(QString)), this, SLOT(userRes())); + + h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); + b = new QPushButton(tr("Cancel"), this); h->addWidget(b); + connect(b, SIGNAL(clicked()),this, SLOT(reject())); + b = new QPushButton(tr("OK"), this); h->addWidget(b); + connect(b, SIGNAL(clicked()),this, SLOT(accept())); + b->setDefault(true); +} +//----------------------------------------------------------------------------- +void DataDialog::nameChanged() +{ + QString var = name->currentText(); + wchar_t *txt=new wchar_t[var.length()+1]; + var.toWCharArray(txt); txt[var.length()]=0; + mglData dat=parser.Calc(txt); delete []txt; + x1->setMaximum(dat.nx-1); x1->setValue(-1); + x2->setMaximum(dat.nx-1); x2->setValue(-1); + y1->setMaximum(dat.ny-1); y1->setValue(-1); + y2->setMaximum(dat.ny-1); y2->setValue(-1); + z1->setMaximum(dat.nz-1); z1->setValue(-1); + z2->setMaximum(dat.nz-1); z2->setValue(-1); +} +//----------------------------------------------------------------------------- +void DataDialog::updateRes() +{ + result = name->currentText(); + int nx1 = x1->value(), nx2 = x2->value(), ny1 = y1->value(), ny2 = y2->value(), nz1 = z1->value(), nz2 = z2->value(); + if(nx1>=0 || ny1>=0 || nz1>=0 || nx2>=0 || ny2>=0 || nz2>=0) + result += "(" + (nx1<0?"":QString::number(nx1)) + ":" + (nx2<0?"":QString::number(nx2)) + "," + + (ny1<0?"":QString::number(ny1)) + ":" + (ny2<0?"":QString::number(ny2)) + "," + + (nz1<0?"":QString::number(nz1)) + ":" + (nz2<0?"":QString::number(nz2)) + ")"; + if(oper->currentIndex()>0) + result = "{" + oper->currentText() + " " + result + " '" + dirs->currentText() + "'}"; + wchar_t *txt=new wchar_t[result.length()+1]; + result.toWCharArray(txt); txt[result.length()]=0; + mglData dat=parser.Calc(txt); delete []txt; + sizes->setText(tr("Result (will have sizes ") + QString::number(dat.nx)+"*"+QString::number(dat.ny)+"*"+QString::number(dat.nz)+")" ); + res->setText(result); +} +//----------------------------------------------------------------------------- +void DataDialog::updateNames() +{ + name->clear(); + mglVar *v = parser.FindVar(""); + QString s; + while(v) + { name->addItem(QString::fromStdWString(v->s)); v = v->next; } + +} +//----------------------------------------------------------------------------- +void DataDialog::userRes() +{ + QString txt = res->text(); + if(txt != result) + { result = txt; sizes->setText(tr("Result")); } +} +//----------------------------------------------------------------------------- diff --git a/udav/data_dlg.h b/udav/data_dlg.h new file mode 100644 index 0000000..048da95 --- /dev/null +++ b/udav/data_dlg.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * Copyright (C) 2008 by Alexey Balakin * + * mathgl.abalakin@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef DATADIALOG_H +#define DATADIALOG_H +//----------------------------------------------------------------------------- +#include +class QComboBox; +class QLineEdit; +class QSpinBox; +class QLabel; +class QShowEvent; +//----------------------------------------------------------------------------- +/// Selecting styles of command (like line style, color scheme, font style, axis style) +class DataDialog : public QDialog +{ + Q_OBJECT +public: + QString getData() { return result; }; + void updateNames(); + DataDialog(QWidget *parent = 0); + ~DataDialog(){}; +protected: + virtual void showEvent(QShowEvent *ev) + { updateNames(); QDialog::showEvent(ev); } +private slots: + void nameChanged(); + void updateRes(); + void userRes(); +private: + QString result; + QComboBox *name, *suffix, *oper, *dirs; + QLineEdit *res, *func; + QSpinBox *x1, *y1, *z1, *x2, *y2, *z2; + QLabel *sizes; +}; +//----------------------------------------------------------------------------- +#endif +//----------------------------------------------------------------------------- diff --git a/udav/find_dlg.cpp b/udav/find_dlg.cpp index 3d029d5..56bbaf1 100644 --- a/udav/find_dlg.cpp +++ b/udav/find_dlg.cpp @@ -32,21 +32,21 @@ FindDialog::FindDialog(QWidget *parent) : QDialog(parent) setWindowTitle(tr("UDAV - Find")); QVBoxLayout *o = new QVBoxLayout; a = new QHBoxLayout; o->addLayout(a); - lbl = new QLabel(tr("Find &what:"), this); a->addWidget(lbl); + lbl = new QLabel(tr("Find what:"), this); a->addWidget(lbl); line = new QLineEdit(this); lbl->setBuddy(line); a->addWidget(line); a = new QHBoxLayout; o->addLayout(a); - lbl = new QLabel(tr("Replace &by:"), this); a->addWidget(lbl); + lbl = new QLabel(tr("Replace by:"), this); a->addWidget(lbl); text = new QLineEdit(this); lbl->setBuddy(text); a->addWidget(text); - caseUse = new QCheckBox(tr("Match &case"), this); o->addWidget(caseUse); - backward = new QCheckBox(tr("Search &backward"), this); o->addWidget(backward); + caseUse = new QCheckBox(tr("Match case"), this); o->addWidget(caseUse); + backward = new QCheckBox(tr("Search backward"), this); o->addWidget(backward); a = new QHBoxLayout(this); a->setMargin(11); a->setSpacing(6); a->addLayout(o); o = new QVBoxLayout; a->addLayout(o); - find = new QPushButton(tr("&Find"), this); o->addWidget(find); + find = new QPushButton(tr("Find"), this); o->addWidget(find); find->setDefault(true); find->setEnabled(false); - repl= new QPushButton(tr("&Replace"), this); o->addWidget(repl); + repl= new QPushButton(tr("Replace"), this); o->addWidget(repl); repl->setEnabled(false); cancel = new QPushButton(tr("Close"), this); o->addWidget(cancel); o->addStretch(1); diff --git a/udav/help_pnl.cpp b/udav/help_pnl.cpp index 6bedd95..ed5f9b1 100644 --- a/udav/help_pnl.cpp +++ b/udav/help_pnl.cpp @@ -52,7 +52,7 @@ HelpPanel::HelpPanel(QWidget *parent) : QWidget(parent) connect(entry, SIGNAL(returnPressed()), this, SLOT(showHelp())); b = new QPushButton(QPixmap(":/xpm/go-next.png"), tr("Forward")); connect(b, SIGNAL(clicked()), help, SLOT(forward())); a->addWidget(b); -// b = new QPushButton(QPixmap(":/xpm/help-faq.png"), tr("&Examples")); +// b = new QPushButton(QPixmap(":/xpm/help-faq.png"), tr("Examples")); // connect(b, SIGNAL(clicked()), this, SLOT(showExamples())); a->addWidget(b); t = new QToolButton(this); t->setIcon(QPixmap(":/xpm/zoom-in.png")); connect(t, SIGNAL(clicked()), this, SLOT(zoomIn())); a->addWidget(t); diff --git a/udav/hint_dlg.cpp b/udav/hint_dlg.cpp index 2ed6d0a..59273ee 100644 --- a/udav/hint_dlg.cpp +++ b/udav/hint_dlg.cpp @@ -25,23 +25,25 @@ //----------------------------------------------------------------------------- #define qtr HintDialog::tr QString hints[] = { - qtr("You can rotate plot by mouse. Just press 'Rotate' toolbutton, click image and hold a mouse button: left button for rotation, right button for zooming/perspective, middle button for shifting."), + qtr("You can shift axis range by pressing middle button and moving mouse. Also, you can zoom in/out axis range by using mouse wheel."), + qtr("You can rotate/shift/zoom whole plot by mouse. Just press 'Rotate' toolbutton, click image and hold a mouse button: left button for rotation, right button for zoom/perspective, middle button for shift."), qtr("You may quickly draw the data from file. Just use: udav 'filename.dat' in command line."), qtr("You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later you can paste it directly into yours document or presentation."), qtr("You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing right mouse button inside image and selecting 'Export as ...'."), - qtr("You can setup colors for script highlighting in Property dialog. Just select menu item 'Edit/Properties'."), - qtr("You can save the parameter of animation inside MGL script by using comment started from '##a '."), + qtr("You can setup colors for script highlighting in Property dialog. Just select menu item 'Settings/Properties'."), + qtr("You can save the parameter of animation inside MGL script by using comment started from '##a ' or '##c ' for loops."), qtr("New drawing never clears things drawn already. For example, you can make a surface with contour lines by calling commands 'surf' and 'cont' one after another (in any order). "), qtr("You can put several plots in the same image by help of commands 'subplot' or 'inplot'."), qtr("All indexes (of data arrays, subplots and so on) are always start from 0."), - qtr("You can edit MGL file in any text editor. Also you can run it in console by help of commands: mgl2png, mgl2eps, mgl2svg and so on."), + qtr("You can edit MGL file in any text editor. Also you can run it in console by help of commands: mglconv, mglview."), qtr("You can use command 'once on|off' for marking the block which should be executed only once. For example, this can be the block of large data reading/creating/handling. Press F9 (or menu item 'Graphics/Reload') to re-execute this block."), qtr("You can use command 'stop' for terminating script parsing. It is useful if you don't want to execute a part of script."), - qtr("You can type arbitrary expression as input argument for data or number. In last case, the first value of data array is used."), + qtr("You can type arbitrary expression as input argument for data or number. In last case (for numbers), the first value of data array is used."), qtr("There is powerful calculator with a lot of special functions. You can use buttons or keyboard to type the expression. Also you can use existed variables in the expression."), qtr("The calculator can help you to put complex expression in the script. Just type the expression (which may depend on coordinates x,y,z and so on) and put it into the script."), - qtr("You can easely insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert."), + qtr("You can easily insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert."), qtr("The special dialog (Edit|Insert|New Command) help you select the command, fill its arguments and put it into the script."), + qtr("You can put several plotting commands in the same line or in separate function, for highlighting all of them simultaneously."), qtr("") }; //----------------------------------------------------------------------------- @@ -52,7 +54,7 @@ QString hints[] = { extern "C"{double mgl_rnd();} HintDialog::HintDialog(QWidget *parent) : QDialog(parent) { - for(numHints=0;!hints[numHints].isEmpty();numHints++){}; + for(numHints=0;!hints[numHints].isEmpty();numHints++); cur = int(mgl_rnd()*numHints); setWindowTitle(tr("UDAV - Hint")); QHBoxLayout *a; @@ -61,15 +63,15 @@ HintDialog::HintDialog(QWidget *parent) : QDialog(parent) text = new QTextEdit(this); o->addWidget(text); text->setReadOnly(true); text->setText(hints[cur]); - start = new QCheckBox(tr("&Show at startup"), this); o->addWidget(start); + start = new QCheckBox(tr("Show at startup"), this); o->addWidget(start); start->setChecked(true); a = new QHBoxLayout; o->addLayout(a); - b = new QPushButton(tr("&Prev"), this); a->addWidget(b); + b = new QPushButton(tr("Prev"), this); a->addWidget(b); connect(b, SIGNAL(clicked()), this, SLOT(prevClicked())); - b = new QPushButton(tr("&Next"), this); a->addWidget(b); + b = new QPushButton(tr("Next"), this); a->addWidget(b); connect(b, SIGNAL(clicked()), this, SLOT(nextClicked())); - b = new QPushButton(tr("&Close"), this); a->addWidget(b); + b = new QPushButton(tr("Close"), this); a->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(close())); } //----------------------------------------------------------------------------- diff --git a/udav/hint_dlg.h b/udav/hint_dlg.h index 6b3e709..338b222 100644 --- a/udav/hint_dlg.h +++ b/udav/hint_dlg.h @@ -31,7 +31,7 @@ class HintDialog : public QDialog Q_OBJECT public: HintDialog(QWidget *parent = 0); - ~HintDialog() {}; + ~HintDialog() {} protected: void closeEvent(QCloseEvent *event); private slots: diff --git a/udav/info_dlg.cpp b/udav/info_dlg.cpp index 9377b49..1cc72c8 100644 --- a/udav/info_dlg.cpp +++ b/udav/info_dlg.cpp @@ -22,10 +22,9 @@ #include #include #include -#include "mgl2/parser.h" -#include "mgl2/qt.h" +#include "mgl2/qmathgl.h" #include "info_dlg.h" -extern mglParser parser; +extern mglParse parser; //----------------------------------------------------------------------------- InfoDialog::InfoDialog(QWidget *parent) : QDialog(parent) { @@ -43,7 +42,7 @@ InfoDialog::InfoDialog(QWidget *parent) : QDialog(parent) mgl->autoResize = true; mgl->appName = tr("Data preview"); mgl->setToolTip(tr("Data preview for current slice.")); - draw = new mglDrawScript(&parser); mgl->setDraw(draw); + draw = new mglDrawScript(parser.Self()); mgl->setDraw(draw); kind->addItem(tr("1D plot")); kind->addItem(tr("2D plot")); kind->setCurrentIndex(0); // kind->addItem(tr("3D plot")); @@ -76,7 +75,7 @@ void InfoDialog::refresh(bool force) void InfoDialog::setVar(mglVar *v) { var=v; - if(v) kind->setCurrentIndex(v->d.ny>1 ? 1:0); + if(v) kind->setCurrentIndex(v->ny>1 ? 1:0); refresh(); } //----------------------------------------------------------------------------- diff --git a/udav/info_dlg.h b/udav/info_dlg.h index 715c7d3..34113f0 100644 --- a/udav/info_dlg.h +++ b/udav/info_dlg.h @@ -35,9 +35,9 @@ class InfoDialog : public QDialog Q_OBJECT public: InfoDialog(QWidget *parent = 0); - ~InfoDialog(); + virtual ~InfoDialog(); void setVar(mglVar *v); - void setSlice(int k) { kz=k; refresh(); }; + void setSlice(int k) { kz=k; refresh(); } bool allowRefresh; // void setName(QString &name); void showEvent(QShowEvent *ev); diff --git a/udav/mem_pnl.cpp b/udav/mem_pnl.cpp index fe7c3d3..7d974cc 100644 --- a/udav/mem_pnl.cpp +++ b/udav/mem_pnl.cpp @@ -22,7 +22,7 @@ #include #include #include -#include +#include //----------------------------------------------------------------------------- #include "mem_pnl.h" #include "info_dlg.h" @@ -31,7 +31,7 @@ #include "xpm/preview.xpm" //----------------------------------------------------------------------------- extern bool mglAutoSave; -extern mglParser parser; +extern mglParse parser; QWidget *newDataWnd(InfoDialog *inf, QWidget *wnd, mglVar *v); void refreshData(QWidget *w); //----------------------------------------------------------------------------- @@ -98,7 +98,7 @@ void MemPanel::newTable() QString name = QInputDialog::getText(this, tr("UDAV - New variable"), tr("Enter name for new variable"), QLineEdit::Normal, "", &ok); if(!ok || name.isEmpty()) return; - mglVar *v = parser.AddVar(name.toAscii()); + mglVar *v = parser.AddVar(name.toAscii().constData()); QWidget *t; if(v->o) t = (QWidget *)v->o; else t = newDataWnd(infoDlg,wnd,v); @@ -111,7 +111,7 @@ void MemPanel::editData(int n) if(tab->rowCount()<1) return; if(n<0) n = tab->currentRow(); if(n<0) n = 0; - mglVar *v = parser.FindVar(tab->item(n,0)->text().toAscii()); + mglVar *v = parser.FindVar(tab->item(n,0)->text().toAscii().constData()); if(!v) return; QWidget *t; if(v->o) t = (QWidget *)v->o; @@ -124,10 +124,9 @@ void MemPanel::delData() if(tab->rowCount()<1) return; int n = tab->currentRow(); if(n<0) n = 0; - mglVar *v = parser.FindVar(tab->item(n,0)->text().toAscii()); - if(!v) return; - if(v->o) ((QWidget *)v->o)->close(); - parser.DeleteVar(v); + mglVar *v = parser.FindVar(tab->item(n,0)->text().toAscii().constData()); + if(!v && v->o) ((QWidget *)v->o)->close(); + parser.DeleteVar(tab->item(n,0)->text().toAscii().constData()); refresh(); } //----------------------------------------------------------------------------- @@ -136,8 +135,7 @@ void MemPanel::delAllData() if(QMessageBox::information(this, tr("UDAV - delete all data"), tr("Do you want to delete all data?"), QMessageBox::No, QMessageBox::Yes)!=QMessageBox::Yes) return; - while(parser.DataList) parser.DeleteVar(parser.DataList); - refresh(); + parser.DeleteAll(); refresh(); } //----------------------------------------------------------------------------- void MemPanel::infoData() @@ -145,7 +143,7 @@ void MemPanel::infoData() if(tab->rowCount()<1) return; int n = tab->currentRow(); if(n<0) n = 0; - mglVar *v = parser.FindVar(tab->item(n,0)->text().toAscii()); + mglVar *v = parser.FindVar(tab->item(n,0)->text().toAscii().constData()); if(!v) return; infoDlg->setVar(v); QString s = QString::fromStdWString(v->s); @@ -156,11 +154,11 @@ void MemPanel::infoData() //----------------------------------------------------------------------------- void MemPanel::refresh() { - mglVar *v = parser.DataList; + mglVar *v = parser.FindVar(""); int n = 0; while(v) { v = v->next; n++; } tab->setRowCount(n); - v = parser.DataList; n = 0; + v = parser.FindVar(""); n = 0; QString s; QTableWidgetItem *it; Qt::ItemFlags flags=Qt::ItemIsSelectable|Qt::ItemIsEnabled; @@ -169,11 +167,11 @@ void MemPanel::refresh() s = QString::fromStdWString(v->s); it = new QTableWidgetItem(s); tab->setItem(n,0,it); it->setFlags(flags); - s.sprintf("%ld * %ld * %ld", v->d.nx, v->d.ny, v->d.nz); + s.sprintf("%ld * %ld * %ld", v->nx, v->ny, v->nz); it = new QTableWidgetItem(s); tab->setItem(n,1,it); it->setFlags(flags); it->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); - s.sprintf("%12ld", v->d.nx*v->d.ny*v->d.nz*sizeof(mreal)); + s.sprintf("%12ld", v->nx*v->ny*v->nz*sizeof(mreal)); it = new QTableWidgetItem(s); tab->setItem(n,2,it); it->setFlags(flags); it->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); diff --git a/udav/newcmd_dlg.cpp b/udav/newcmd_dlg.cpp index beb0787..5cb0c3e 100644 --- a/udav/newcmd_dlg.cpp +++ b/udav/newcmd_dlg.cpp @@ -26,12 +26,13 @@ #include #include #include -#include +#include #include "newcmd_dlg.h" #include "opt_dlg.h" #include "style_dlg.h" -extern mglParser parser; +#include "data_dlg.h" +extern mglParse parser; extern QString pathHelp; //----------------------------------------------------------------------------- NewCmdDialog::NewCmdDialog(QWidget *p) : QDialog(p,Qt::WindowStaysOnTopHint) @@ -43,6 +44,7 @@ NewCmdDialog::NewCmdDialog(QWidget *p) : QDialog(p,Qt::WindowStaysOnTopHint) QVBoxLayout *o = new QVBoxLayout; m->addLayout(o); optDialog = new OptionDialog(this); stlDialog = new StyleDialog(this); + datDialog = new DataDialog(this); type = new QComboBox(this); o->addWidget(type); type->setToolTip(tr("Groups of MGL commands")); name = new QComboBox(this); o->addWidget(name); @@ -62,6 +64,7 @@ NewCmdDialog::NewCmdDialog(QWidget *p) : QDialog(p,Qt::WindowStaysOnTopHint) "You can use '' for default format. See help at right\nfor default values.")); QStringList sl; sl<setHorizontalHeaderLabels(sl); + connect(args,SIGNAL(cellDoubleClicked(int,int)), this, SLOT(insertData())); a = new QHBoxLayout; o->addLayout(a); b = new QPushButton(tr("Add style"),this); a->addWidget(b); @@ -98,6 +101,7 @@ NewCmdDialog::NewCmdDialog(QWidget *p) : QDialog(p,Qt::WindowStaysOnTopHint) connect(name, SIGNAL(currentIndexChanged(int)),this,SLOT(nameChanged(int))); connect(kind, SIGNAL(currentIndexChanged(int)),this,SLOT(kindChanged(int))); type->setCurrentIndex(0); typeChanged(0); + setWindowTitle(tr("New command")); } //----------------------------------------------------------------------------- void NewCmdDialog::zoomIn() @@ -146,47 +150,39 @@ void NewCmdDialog::parseCmd(const QString &txt) } } //----------------------------------------------------------------------------- -void NewCmdDialog::fillList() +void NewCmdDialog::fillList() // TODO update list !!! { types<itemText(s), par, a; @@ -237,11 +225,10 @@ void NewCmdDialog::nameChanged(int s) // clear old kind->clear(); kinds.clear(); for(k=0;ksetText(QString::fromAscii(rts->desc)); + if(!parser.CmdType(n.toAscii().constData())) return; + info->setText(QString::fromAscii(parser.CmdDesc(n.toAscii().constData()))); - par = QString::fromAscii(rts->form); + par = QString::fromAscii(parser.CmdFormat(n.toAscii().constData())); int i0 = par.indexOf(' '); // first space if present if(i0<0) { kind->addItem(par); return; } // no arguments // parse kind of arguments @@ -254,6 +241,7 @@ void NewCmdDialog::nameChanged(int s) kinds<setCurrentIndex(s); kind->addItems(kinds); kind->setCurrentIndex(0); } //----------------------------------------------------------------------------- @@ -262,6 +250,9 @@ void NewCmdDialog::kindChanged(int s) if(s<0 || s>NUM_CH-1) return; cmd=""; int nn = argn[s].count(); + QStringList lst; + for(int i=0;irowCount();i++) + lst<item(i,0)->text()+"~ "+args->item(i,1)->text(); //return; args->setRowCount(nn); args->setColumnCount(2); QTableWidgetItem *it; @@ -278,14 +269,31 @@ void NewCmdDialog::kindChanged(int s) args->item(i,0)->setText(a); args->item(i,0)->setFont(f); args->item(i,0)->setFlags(Qt::ItemIsEnabled); args->item(i,1)->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled); + for(int j=0;jitem(i,1)->setText(lst[j].section('~',1).trimmed()); } } //----------------------------------------------------------------------------- -void NewCmdDialog::insertData() {} // TODO !!! -//----------------------------------------------------------------------------- void NewCmdDialog::insertOpt() { if(optDialog->exec()) opt->setText(optDialog->getOption()); } //----------------------------------------------------------------------------- +void NewCmdDialog::insertData() +{ + int row = args->currentRow(); + if(row<0) + { + QMessageBox::warning(this,tr("New command"), tr("No argument is selected")); + return; + } + QString a = args->item(row,0)->text(); + if(a[0].isUpper()) + { + if(datDialog->exec()) args->item(row,1)->setText(datDialog->getData()); + } + else QMessageBox::warning(this,tr("New command"), tr("This argument is not data")); +} +//----------------------------------------------------------------------------- void NewCmdDialog::insertStl() { int s=kind->currentIndex(); diff --git a/udav/newcmd_dlg.h b/udav/newcmd_dlg.h index d960883..c8080e1 100644 --- a/udav/newcmd_dlg.h +++ b/udav/newcmd_dlg.h @@ -30,6 +30,7 @@ class QTableWidget; class QTextBrowser; class OptionDialog; class StyleDialog; +class DataDialog; //----------------------------------------------------------------------------- class NewCmdDialog : public QDialog { @@ -65,6 +66,7 @@ private: QStringList types, cmds[17], argn[NUM_CH], kinds; OptionDialog *optDialog; StyleDialog *stlDialog; + DataDialog *datDialog; void fillList(); }; diff --git a/udav/open_dlg.cpp b/udav/open_dlg.cpp index 7248ea7..8552f5f 100644 --- a/udav/open_dlg.cpp +++ b/udav/open_dlg.cpp @@ -26,10 +26,10 @@ #include #include #include -#include +#include #include "open_dlg.h" int numDataOpened=0; -extern mglParser parser; +extern mglParse parser; QStringList dataScr; //----------------------------------------------------------------------------- QWidget *createDataOpenDlg(QWidget *p) { return new DataOpenDialog(p); } @@ -115,35 +115,35 @@ void DataOpenDialog::prepareResult() code = ""; numDataOpened++; data = name->text(); // prepare unique value of name for next time char buf[32]; sprintf(buf,"mgl_%d",numDataOpened); name->setText(buf); - mglVar *v = parser.AddVar(data.toAscii()); + mglVar *v = parser.AddVar(data.toAscii().constData()); bool dd=0; if(rA->isChecked()) // auto sizes { - setlocale(LC_NUMERIC, "C"); v->d.Read(file.toAscii().constData()); setlocale(LC_NUMERIC, ""); - if(v->d.nx==1) { v->d.nx = v->d.ny; v->d.ny = v->d.nz; } + setlocale(LC_NUMERIC, "C"); v->Read(file.toAscii().constData()); setlocale(LC_NUMERIC, ""); + if(v->nx==1) { v->nx = v->ny; v->ny = v->nz; } code=QString("#read %1 '%2'\n").arg(data).arg(file); } else if(rM->isChecked()) // manual sizes { int x=nx->text().toInt(), y=ny->text().toInt(), z=nz->text().toInt(); - setlocale(LC_NUMERIC, "C"); v->d.Read(file.toAscii().constData(),x,y,z); setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, "C"); v->Read(file.toAscii().constData(),x,y,z); setlocale(LC_NUMERIC, ""); code=QString("#read %1 '%2' %3 %4 %5\n").arg(data).arg(file).arg(x).arg(y).arg(z); } else if(r2->isChecked()) // matrix { - setlocale(LC_NUMERIC, "C"); v->d.ReadMat(file.toAscii().constData()); setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, "C"); v->ReadMat(file.toAscii().constData()); setlocale(LC_NUMERIC, ""); code=QString("#readmat %1 '%2'\n").arg(data).arg(file); dd=1; } else if(r3->isChecked()) // 3d-data { - setlocale(LC_NUMERIC, "C"); v->d.ReadMat(file.toAscii().constData(),3); setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, "C"); v->ReadMat(file.toAscii().constData(),3); setlocale(LC_NUMERIC, ""); code=QString("#readmat %1 '%2' 3\n").arg(data).arg(file); dd=2; } if(scr->lineEdit()->text().isEmpty() || scr->lineEdit()->text()==tr("default")) { - if(v->d.nz>1 || dd==2) + if(v->nz>1 || dd==2) code+=QString("rotate 40 60\ncrange %1:box\nsurf3 %1\n").arg(data); - else if(v->d.ny>1 || dd==1) + else if(v->ny>1 || dd==1) code+=QString("rotate 40 60\ncrange %1:zrange %1:box\nsurf %1\n").arg(data); else code+=QString("yrange %1:box\nplot %1\n").arg(data); } diff --git a/udav/opt_dlg.cpp b/udav/opt_dlg.cpp index 2ca30a6..32a2e7a 100644 --- a/udav/opt_dlg.cpp +++ b/udav/opt_dlg.cpp @@ -46,18 +46,29 @@ OptionDialog::OptionDialog(QWidget *parent) : QDialog(parent) lbl = new QLabel(tr("C-range"),this); g->addWidget(lbl,1,3); c1 = new QLineEdit(this); g->addWidget(c1,1,4); c2 = new QLineEdit(this); g->addWidget(c2,1,5); - g = new QGridLayout(); o->addLayout(g); - lbl = new QLabel(tr("Alpha"),this); g->addWidget(lbl,0,0); - alpha = new QLineEdit(this); g->addWidget(alpha,1,0); - lbl = new QLabel(tr("Ambient"),this); g->addWidget(lbl,0,1); - amb = new QLineEdit(this); g->addWidget(amb,1,1); - lbl = new QLabel(tr("Mesh num"),this); g->addWidget(lbl,0,2); - mn = new QLineEdit(this); g->addWidget(mn,1,2); - lbl = new QLabel(tr("Font size"),this); g->addWidget(lbl,0,3); - fs = new QLineEdit(this); g->addWidget(fs,1,3); - lbl = new QLabel(tr("Cutting"),this); g->addWidget(lbl,0,4); - cut = new QComboBox(this); g->addWidget(cut,1,4); - cut->insertItem(0,tr("on")); cut->insertItem(1,tr("off")); + + lbl = new QLabel(tr("Alpha"),this); g->addWidget(lbl,2,0); + alpha = new QLineEdit(this); g->addWidget(alpha,2,1); + lbl = new QLabel(tr("Mesh num"),this); g->addWidget(lbl,2,3); + mn = new QLineEdit(this); g->addWidget(mn,2,4); + + lbl = new QLabel(tr("Ambient"),this); g->addWidget(lbl,3,0); + amb = new QLineEdit(this); g->addWidget(amb,3,1); + lbl = new QLabel(tr("Diffuse"),this); g->addWidget(lbl,3,3); + dif = new QLineEdit(this); g->addWidget(dif,3,4); + + lbl = new QLabel(tr("Cutting"),this); g->addWidget(lbl,4,0); + cut = new QComboBox(this); g->addWidget(cut,4,1); + cut->insertItem(0,tr("default")); cut->insertItem(1,tr("on")); cut->insertItem(2,tr("off")); + lbl = new QLabel(tr("Light"),this); g->addWidget(lbl,4,3); + lig = new QComboBox(this); g->addWidget(lig,4,4); + lig->insertItem(0,tr("default")); lig->insertItem(1,tr("on")); lig->insertItem(2,tr("off")); + + lbl = new QLabel(tr("Value"),this); g->addWidget(lbl,5,0); + val = new QLineEdit(this); g->addWidget(val,5,1); + lbl = new QLabel(tr("Size"),this); g->addWidget(lbl,5,3); + fs = new QLineEdit(this); g->addWidget(fs,5,4); + a = new QHBoxLayout(); o->addLayout(a); lbl = new QLabel(tr("Legend"),this); a->addWidget(lbl); leg = new QLineEdit(this); a->addWidget(leg); @@ -103,12 +114,16 @@ void OptionDialog::prepareResult() QMessageBox::warning(this,tr("UDAV - command options"), tr("Both fields in crange must be filled")); return; } - if(!alpha->text().isEmpty()) result = result+"; alpha "+alpha->text(); + if(!val->text().isEmpty()) result = result+"; value "+val->text(); + if(!alpha->text().isEmpty())result = result+"; alpha "+alpha->text(); if(!amb->text().isEmpty()) result = result+"; ambient "+amb->text(); + if(!dif->text().isEmpty()) result = result+"; diffuse "+dif->text(); if(!mn->text().isEmpty()) result = result+"; meshnum "+mn->text(); - if(!fs->text().isEmpty()) result = result+"; fontsize "+fs->text(); - if(cut->currentIndex()==0) result = result+"; cut on"; - if(cut->currentIndex()==1) result = result+"; cut off"; + if(!fs->text().isEmpty()) result = result+"; size "+fs->text(); + if(cut->currentIndex()==1) result = result+"; cut on"; + if(cut->currentIndex()==2) result = result+"; cut off"; + if(lig->currentIndex()==1) result = result+"; light on"; + if(lig->currentIndex()==2) result = result+"; light off"; if(!leg->text().isEmpty()) result = result+"; legend '"+leg->text()+"'"; accept(); } diff --git a/udav/opt_dlg.h b/udav/opt_dlg.h index f992649..2e25952 100644 --- a/udav/opt_dlg.h +++ b/udav/opt_dlg.h @@ -39,8 +39,8 @@ private slots: private: QString result; QLineEdit *x1, *x2, *y1, *y2, *z1, *z2, *c1, *c2; - QLineEdit *alpha, *amb, *mn, *fs, *leg; - QComboBox *cut; + QLineEdit *alpha, *amb, *dif, *val, *mn, *fs, *leg; + QComboBox *cut, *lig; }; //----------------------------------------------------------------------------- #endif diff --git a/udav/plot_pnl.cpp b/udav/plot_pnl.cpp index c6a9da4..4f43e02 100644 --- a/udav/plot_pnl.cpp +++ b/udav/plot_pnl.cpp @@ -33,12 +33,13 @@ #include #include -#include -#include "mgl2/qt.h" +#include "mgl2/qmathgl.h" #include "plot_pnl.h" #include "anim_dlg.h" +#include "style_dlg.h" extern bool mglAutoSave; -extern mglParser parser; +extern bool mglHighlight; +extern mglParse parser; int animDelay=500; void raisePanel(QWidget *w); //----------------------------------------------------------------------------- @@ -46,16 +47,18 @@ PlotPanel::PlotPanel(QWidget *parent) : QWidget(parent) { gifOn = jpgOn = false; animDialog = new AnimParam(this); animPos = -1; + stlDialog = new StyleDialog(this); printer = new QPrinter; curPos = -1; timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(next())); connect(animDialog, SIGNAL(putText(const QString &)), this, SLOT(animText(const QString &))); - menu = new QMenu(tr("&Graphics"),this); + menu = new QMenu(tr("Graphics"),this); popup = new QMenu(this); mgl = new QMathGL(this); - draw = new mglDrawScript(&parser); - mgl->setDraw(draw); + draw = new mglDrawScript(parser.Self()); + mgl->getGraph()->set(MGL_SHOW_POS); mgl->setDraw(draw); + connect(mgl,SIGNAL(askStyle(int)),this,SLOT(setStyle(int))); QBoxLayout *v,*h,*m; v = new QVBoxLayout(this); @@ -70,11 +73,18 @@ PlotPanel::PlotPanel(QWidget *parent) : QWidget(parent) //----------------------------------------------------------------------------- PlotPanel::~PlotPanel() { delete printer; } //----------------------------------------------------------------------------- -void PlotPanel::animText(const QString &txt) { animPutText(txt); } +void PlotPanel::setStyle(int id) +{ if(stlDialog->exec()) mgl->setStyle(id, stlDialog->getStyle()); } //----------------------------------------------------------------------------- -void PlotPanel::setCurPos(int pos) { curPos = pos; execute(); } +void PlotPanel::animText(const QString &txt) { animPutText(txt); } //----------------------------------------------------------------------------- -void PlotPanel::stop() { parser.Stop = true; mgl->stop(); } +void PlotPanel::setCurPos(int pos) +{ + if(!mglHighlight) pos = -1; + if(curPos!=pos) { curPos = pos; execute(); } +} +//----------------------------------------------------------------------------- +void PlotPanel::stop() { parser.Stop(); mgl->stop(); } //----------------------------------------------------------------------------- void PlotPanel::execute() { @@ -82,8 +92,10 @@ void PlotPanel::execute() raisePanel(this); emit clearWarn(); QTime t; t.start(); + mgl->getGraph()->FaceNum=0; draw->text=textMGL->toPlainText(); - draw->line=curPos; mgl->update(); + draw->line=curPos; + mgl->update(); setStatus(QString(tr("Drawing time %1 ms")).arg(t.elapsed()*1e-3)); emit giveFocus(); } @@ -245,6 +257,13 @@ void PlotPanel::animParseText(const QString &txt) } //----------------------------------------------------------------------------- #include "xpm/wire.xpm" +#include "xpm/text.xpm" +#include "xpm/line.xpm" +#include "xpm/curve.xpm" +#include "xpm/mark_o.xpm" +#include "xpm/mark_s.xpm" +#include "xpm/mark_a.xpm" +#include "xpm/mark_d.xpm" //----------------------------------------------------------------------------- void PlotPanel::toolTop(QBoxLayout *l) { @@ -253,7 +272,7 @@ void PlotPanel::toolTop(QBoxLayout *l) QToolButton *bb; // graphics menu - a = new QAction(QPixmap(":/xpm/alpha.png"), tr("&Alpha"), this); + a = new QAction(QPixmap(":/xpm/alpha.png"), tr("Alpha"), this); a->setShortcut(Qt::CTRL+Qt::Key_T); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setAlpha(bool))); connect(mgl, SIGNAL(alphaChanged(bool)), a, SLOT(setOn(bool))); @@ -261,7 +280,7 @@ void PlotPanel::toolTop(QBoxLayout *l) o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/weather-clear.png"), tr("&Light"), this); + a = new QAction(QPixmap(":/xpm/weather-clear.png"), tr("Light"), this); a->setShortcut(Qt::CTRL+Qt::Key_L); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setLight(bool))); connect(mgl, SIGNAL(lightChanged(bool)), a, SLOT(setOn(bool))); @@ -269,21 +288,21 @@ void PlotPanel::toolTop(QBoxLayout *l) o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(wire_xpm), tr("&Grid"), this); + a = new QAction(QPixmap(wire_xpm), tr("Grid"), this); a->setShortcut(Qt::CTRL+Qt::Key_G); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setGrid(bool))); - a->setToolTip(tr("Switch on/off grid drawing for absolute coordinates (Ctrl+G).")); + a->setToolTip(tr("Switch on/off grid of absolute coordinates (Ctrl+G).")); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/object-rotate-right.png"), tr("&Rotate by mouse"), this); + a = new QAction(QPixmap(":/xpm/object-rotate-right.png"), tr("Rotate by mouse"), this); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setRotate(bool))); connect(mgl, SIGNAL(rotateChanged(bool)), a, SLOT(setOn(bool))); a->setToolTip(tr("Switch on/off mouse handling of the graphics\n(rotation, shifting, zooming and perspective).")); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); -/* a = new QAction(QPixmap(":/xpm/zoom-fit-best.png"), tr("&Zoom by mouse"), this); +/* a = new QAction(QPixmap(":/xpm/zoom-fit-best.png"), tr("Zoom by mouse"), this); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setZoom(bool))); connect(mgl, SIGNAL(zoomChanged(bool)), a, SLOT(setOn(bool))); @@ -291,82 +310,124 @@ void PlotPanel::toolTop(QBoxLayout *l) bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a);*/ o->addSeparator(); - a = new QAction(QPixmap(":/xpm/zoom-original.png"), tr("Res&tore"), this); + a = new QAction(QPixmap(":/xpm/zoom-original.png"), tr("Restore"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(restore())); a->setToolTip(tr("Restore default graphics rotation, zoom and perspective (Ctrl+Space).")); a->setShortcut(Qt::CTRL+Qt::Key_Space); o->addAction(a); popup->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/view-refresh.png"), tr("Re&draw"), this); + a = new QAction(QPixmap(":/xpm/view-refresh.png"), tr("Redraw"), this); connect(a, SIGNAL(triggered()), this, SLOT(execute())); a->setToolTip(tr("Execute script and redraw graphics (F5).")); a->setShortcut(Qt::Key_F5); o->addAction(a); popup->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(tr("&Adjust size"), this); + a = new QAction(tr("Adjust size"), this); connect(a, SIGNAL(triggered()), this, SLOT(adjust())); a->setToolTip(tr("Change canvas size to fill whole region (F6).")); a->setShortcut(Qt::Key_F6); o->addAction(a); - a = new QAction(tr("Re&load"), this); + a = new QAction(tr("Reload"), this); connect(a, SIGNAL(triggered()), this, SLOT(pressF9())); a->setToolTip(tr("Restore status for 'once' command and reload data (F9).")); a->setShortcut(Qt::Key_F9); o->addAction(a); popup->addAction(a); - a = new QAction(QPixmap(":/xpm/process-stop.png"), tr("&Stop"), this); + a = new QAction(QPixmap(":/xpm/process-stop.png"), tr("Stop"), this); connect(a, SIGNAL(triggered()), this, SLOT(stop())); a->setToolTip(tr("Stop script execution (F7).")); a->setShortcut(Qt::Key_F7); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/edit-copy.png"), tr("&Copy plot"), this); + a = new QAction(QPixmap(":/xpm/edit-copy.png"), tr("Copy plot"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(copy())); - a->setToolTip(tr("Copy graphics to clipboard (Ctrl+Shift+C).")); - a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_C); + a->setToolTip(tr("Copy graphics to clipboard (Ctrl+Shift+G).")); + a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_G); o->addAction(a); popup->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/edit-copy.png"), tr("&Copy click coor."), this); + a = new QAction(QPixmap(":/xpm/edit-copy.png"), tr("Copy click coor."), this); connect(a, SIGNAL(triggered()), mgl, SLOT(copyClickCoor())); a->setToolTip(tr("Copy coordinates of last mouse click to clipboard.")); o->addAction(a); popup->addAction(a); l->addStretch(1); + oo = new QMenu(tr("Primitives ..."),this); + a = new QAction(QPixmap(line_xpm), tr("Add line"), this); + connect(a, SIGNAL(triggered()), mgl, SLOT(addLine())); + connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(tr("Add line which properties can be changed later by mouse.")); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); oo->addAction(a); + + a = new QAction(QPixmap(curve_xpm), tr("Add curve"), this); + connect(a, SIGNAL(triggered()), mgl, SLOT(addCurve())); + connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(tr("Add curve which properties can be changed later by mouse.")); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); oo->addAction(a); + + a = new QAction(QPixmap(mark_s_xpm), tr("Add rect"), this); + connect(a, SIGNAL(triggered()), mgl, SLOT(addRect())); + connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(tr("Add rectangle which properties can be changed later by mouse.")); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); oo->addAction(a); + + a = new QAction(QPixmap(mark_d_xpm), tr("Add rhombus"), this); + connect(a, SIGNAL(triggered()), mgl, SLOT(addRhomb())); + connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(tr("Add rhombus which properties can be changed later by mouse.")); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); oo->addAction(a); + + a = new QAction(QPixmap(mark_o_xpm), tr("Add ellipse"), this); + connect(a, SIGNAL(triggered()), mgl, SLOT(addEllipse())); + connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(tr("Add ellipse which properties can be changed later by mouse.")); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); oo->addAction(a); + + a = new QAction(QPixmap(mark_a_xpm), tr("Add mark"), this); + connect(a, SIGNAL(triggered()), mgl, SLOT(addMark())); + connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(tr("Add marker which properties can be changed later by mouse.")); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); oo->addAction(a); + + a = new QAction(QPixmap(text_xpm), tr("Add text"), this); + connect(a, SIGNAL(triggered()), mgl, SLOT(addText())); + connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(tr("Add text which properties can be changed later by mouse.")); + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); oo->addAction(a); + + o->addMenu(oo); l->addStretch(1); tet = new QSpinBox(this); tet->setWrapping(true); l->addWidget(tet); tet->setRange(-180, 180); tet->setSingleStep(10); connect(tet, SIGNAL(valueChanged(int)), mgl, SLOT(setTet(int))); connect(mgl, SIGNAL(tetChanged(int)), tet, SLOT(setValue(int))); tet->setToolTip(tr("Set value of \\theta angle.\nYou can use keys (Shift+Meta+Up or Shift+Meta+Down).")); - a = new QAction(this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Up); - connect(a, SIGNAL(triggered()), tet, SLOT(stepUp())); - a = new QAction(this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Down); - connect(a, SIGNAL(triggered()), tet, SLOT(stepDown())); phi = new QSpinBox(this); phi->setWrapping(true); l->addWidget(phi); phi->setRange(-180, 180); phi->setSingleStep(10); connect(phi, SIGNAL(valueChanged(int)), mgl, SLOT(setPhi(int))); connect(mgl, SIGNAL(phiChanged(int)), phi, SLOT(setValue(int))); phi->setToolTip(tr("Set value of \\phi angle.\nYou can use keys (Shift+Meta+Left or Shift+Meta+Right).")); - a = new QAction(this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Right); - connect(a, SIGNAL(triggered()), phi, SLOT(stepUp())); - a = new QAction(this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Left); - connect(a, SIGNAL(triggered()), phi, SLOT(stepDown())); - - oo = new QMenu(tr("&Export as ..."),this); - oo->addAction(tr("PNG"), mgl, SLOT(exportPNG()),Qt::META+Qt::Key_P); - oo->addAction(tr("solid PNG"), mgl, SLOT(exportPNGs()),Qt::META+Qt::Key_F); - oo->addAction(tr("JPEG"), mgl, SLOT(exportJPG()),Qt::META+Qt::Key_J); - oo->addAction(tr("GIF"), mgl, SLOT(exportGIF()),Qt::META+Qt::Key_G); + + oo = new QMenu(tr("Export as 2D ..."),this); + oo->addAction(tr("PNG"), mgl, SLOT(exportPNG()),Qt::ALT+Qt::Key_P); + oo->addAction(tr("solid PNG"), mgl, SLOT(exportPNGs()),Qt::ALT+Qt::Key_F); + oo->addAction(tr("JPEG"), mgl, SLOT(exportJPG()),Qt::ALT+Qt::Key_J); oo->addAction(tr("bitmap EPS"), mgl, SLOT(exportBPS())); - oo->addAction(tr("vector EPS"), mgl, SLOT(exportEPS()),Qt::META+Qt::Key_E); - oo->addAction(tr("SVG"), mgl, SLOT(exportSVG()),Qt::META+Qt::Key_S); + oo->addAction(tr("vector EPS"), mgl, SLOT(exportEPS()),Qt::ALT+Qt::Key_E); + oo->addAction(tr("SVG"), mgl, SLOT(exportSVG()),Qt::ALT+Qt::Key_S); + oo->addAction(tr("LaTeX"), mgl, SLOT(exportTEX()),Qt::ALT+Qt::Key_L); // oo->addAction(tr("C++"), mgl, SLOT(exportCPP())); // TODO: Add later -// oo->addAction(tr("IDTF"), mgl, SLOT(exportIDTF())); - o->addMenu(oo); - popup->addMenu(oo); + o->addMenu(oo); popup->addMenu(oo); + oo = new QMenu(tr("Export as 3D ..."),this); + oo->addAction(tr("MGLD"), mgl, SLOT(exportMGLD()),Qt::ALT+Qt::Key_M); + oo->addAction(tr("PRC"), mgl, SLOT(exportPRC()),Qt::ALT+Qt::Key_D); + oo->addAction(tr("OBJ"), mgl, SLOT(exportOBJ()),Qt::ALT+Qt::Key_O); + oo->addAction(tr("STL"), mgl, SLOT(exportSTL())); + oo->addAction(tr("XYZ"), mgl, SLOT(exportXYZ())); +// oo->addAction(tr("X3D"), QMGL, SLOT(exportX3D()),Qt::ALT+Qt::Key_X); // TODO: Add later + o->addMenu(oo); popup->addMenu(oo); } //----------------------------------------------------------------------------- void PlotPanel::toolLeft(QBoxLayout *l) @@ -376,85 +437,89 @@ void PlotPanel::toolLeft(QBoxLayout *l) QToolButton *bb; // zooming menu -/* oo = o->addMenu(tr("Zoom/move")); - a = new QAction(QPixmap(":/xpm/go-previous.png"), tr("Move &left"), this); + oo = o->addMenu(tr("Zoom/move")); + a = new QAction(QPixmap(":/xpm/go-previous.png"), tr("Move left"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(shiftLeft())); - a->setShortcut(Qt::CTRL+Qt::META+Qt::Key_Left); + a->setShortcut(Qt::ALT+Qt::Key_Left); a->setToolTip(tr("Move graphics left by 1/3 of its width.")); oo->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/go-up.png"), tr("Move &up"), this); + a = new QAction(QPixmap(":/xpm/go-up.png"), tr("Move up"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(shiftUp())); - a->setShortcut(Qt::CTRL+Qt::META+Qt::Key_Up); + a->setShortcut(Qt::ALT+Qt::Key_Up); a->setToolTip(tr("Move graphics up by 1/3 of its height.")); oo->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/zoom-in.png"), tr("Zoom &in"), this); + a = new QAction(QPixmap(":/xpm/zoom-in.png"), tr("Zoom in"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(zoomIn())); - a->setShortcut(Qt::CTRL+Qt::META+Qt::Key_Equal); + a->setShortcut(Qt::ALT+Qt::Key_Equal); a->setToolTip(tr("Zoom in graphics.")); oo->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/zoom-out.png"), tr("Zoom &out"), this); + a = new QAction(QPixmap(":/xpm/zoom-out.png"), tr("Zoom out"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(zoomOut())); - a->setShortcut(Qt::CTRL+Qt::META+Qt::Key_Minus); + a->setShortcut(Qt::ALT+Qt::Key_Minus); a->setToolTip(tr("Zoom out graphics.")); oo->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/go-down.png"), tr("Move &down"), this); + a = new QAction(QPixmap(":/xpm/go-down.png"), tr("Move down"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(shiftDown())); - a->setShortcut(Qt::CTRL+Qt::META+Qt::Key_Down); + a->setShortcut(Qt::ALT+Qt::Key_Down); a->setToolTip(tr("Move graphics up down 1/3 of its height.")); oo->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/go-next.png"), tr("Move &right"), this); + a = new QAction(QPixmap(":/xpm/go-next.png"), tr("Move right"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(shiftRight())); - a->setShortcut(Qt::CTRL+Qt::META+Qt::Key_Right); + a->setShortcut(Qt::ALT+Qt::Key_Right); a->setToolTip(tr("Move graphics right by 1/3 of its width.")); oo->addAction(a); - bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a);*/ + bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); // rotate menu oo = o->addMenu(tr("Rotate")); - a = new QAction(tr("Rotate up"), this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Up); + a = new QAction(tr("Rotate up"), this); + a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Up); connect(a, SIGNAL(triggered()), tet, SLOT(stepUp())); oo->addAction(a); a->setToolTip(tr("Increase \\theta angle by 10 degrees.")); - a = new QAction(tr("Rotate down"), this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Down); + a = new QAction(tr("Rotate down"), this); + a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Down); connect(a, SIGNAL(triggered()), tet, SLOT(stepDown())); oo->addAction(a); a->setToolTip(tr("Decrease \\theta angle by 10 degrees.")); - a = new QAction(tr("Rotate left"), this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Right); + a = new QAction(tr("Rotate left"), this); + a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Right); connect(a, SIGNAL(triggered()), phi, SLOT(stepUp())); oo->addAction(a); a->setToolTip(tr("Increase \\phi angle by 10 degrees.")); - a = new QAction(tr("Rotate right"), this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Left); + a = new QAction(tr("Rotate right"), this); + a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Left); connect(a, SIGNAL(triggered()), phi, SLOT(stepDown())); oo->addAction(a); a->setToolTip(tr("Decrease \\phi angle by 10 degrees.")); // animation menu - oo = o->addMenu(tr("&Animation")); - a = new QAction(QPixmap(":/xpm/media-seek-forward.png"), tr("&Next slide"), this); + oo = o->addMenu(tr("Animation")); + a = new QAction(QPixmap(":/xpm/media-seek-forward.png"), tr("Next slide"), this); connect(a, SIGNAL(triggered()), this, SLOT(nextSlide())); - a->setToolTip(tr("Show next slide (Meta+Right).")); - a->setShortcut(Qt::META+Qt::Key_Right); oo->addAction(a); + a->setShortcut(Qt::CTRL+Qt::Key_Period); + a->setToolTip(tr("Show next slide (Ctrl+.).")); oo->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/media-seek-backward.png"), tr("&Prev slide"), this); + a = new QAction(QPixmap(":/xpm/media-seek-backward.png"), tr("Prev slide"), this); connect(a, SIGNAL(triggered()), this, SLOT(prevSlide())); - a->setToolTip(tr("Show previous slide (Meta+Left).")); - a->setShortcut(Qt::META+Qt::Key_Left); oo->addAction(a); + a->setShortcut(Qt::CTRL+Qt::Key_Comma); + a->setToolTip(tr("Show previous slide (Ctrl+,).")); oo->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/film-b.png"), tr("&Slideshow"), this); + a = new QAction(QPixmap(":/xpm/film-b.png"), tr("Slideshow"), this); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), this, SLOT(animStart(bool))); connect(this, SIGNAL(animSwitch(bool)),a,SLOT(setChecked(bool))); a->setToolTip(tr("Run slideshow (Ctrl+F5). If no parameter specified\nthen the dialog with slideshow options will appear.")); a->setShortcut(Qt::CTRL+Qt::Key_F5); oo->addAction(a); - oo->addAction(tr("Se&tup show"), this, SLOT(animSetup()), Qt::CTRL+Qt::Key_W); + oo->addAction(tr("Setup show"), this, SLOT(animSetup()), Qt::CTRL+Qt::Key_W); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); l->addStretch(1); diff --git a/udav/plot_pnl.h b/udav/plot_pnl.h index 5aae870..dc04798 100644 --- a/udav/plot_pnl.h +++ b/udav/plot_pnl.h @@ -35,6 +35,7 @@ class InfoDialog; class AnimParam; class DatPanel; class mglVar; +class StyleDialog; //----------------------------------------------------------------------------- class PlotPanel : public QWidget { @@ -72,6 +73,7 @@ private slots: void adjust(); void pressF9(); void stop(); + void setStyle(int id); private: bool gifOn, jpgOn; @@ -85,7 +87,8 @@ private: AnimParam *animDialog; QMenu *popup; QPrinter *printer; - + StyleDialog *stlDialog; + void toolTop(QBoxLayout *l); void toolLeft(QBoxLayout *l); }; diff --git a/udav/prop_dlg.cpp b/udav/prop_dlg.cpp index 37e1921..18dc151 100644 --- a/udav/prop_dlg.cpp +++ b/udav/prop_dlg.cpp @@ -37,7 +37,7 @@ #include "plot_pnl.h" #include "text_pnl.h" //----------------------------------------------------------------------------- -extern QColor mglColorScheme[9]; +extern QColor mglColorScheme[10]; extern QString defFontFamily; extern int defFontSize; extern QString pathHelp; @@ -47,6 +47,7 @@ extern bool mglAutoPure; extern bool mglCompleter; extern bool editPosBottom; extern bool loadInNewWnd; +extern bool mglHighlight; int defWidth, defHeight; QString pathFont; QString lang[]={"","ru"}; @@ -71,7 +72,7 @@ PropDialog::PropDialog(QWidget *parent) : QDialog(parent) cc[2]=mglColorScheme[2]; cc[3]=mglColorScheme[3]; cc[4]=mglColorScheme[4]; cc[5]=mglColorScheme[5]; cc[6]=mglColorScheme[6]; cc[7]=mglColorScheme[7]; - cc[8]=mglColorScheme[8];// cc[5]=mglColorScheme[5]; + cc[8]=mglColorScheme[8]; cc[9]=mglColorScheme[9]; QPixmap pic(16,16); l = new QLabel(tr("Setup colors for:"), this); v->addWidget(l, Qt::AlignHCenter); QGridLayout *g = new QGridLayout(); v->addLayout(g); @@ -99,7 +100,10 @@ PropDialog::PropDialog(QWidget *parent) : QDialog(parent) pic.fill(cc[7]); cb[7] = new QPushButton(pic, tr("FlowKey"), this); connect(cb[7], SIGNAL(clicked()),this, SLOT(setC7())); g->addWidget(cb[7], 2, 1); - + pic.fill(cc[9]); cb[9] = new QPushButton(pic, tr("CurrLine"), this); + connect(cb[9], SIGNAL(clicked()),this, SLOT(setC9())); + g->addWidget(cb[9], 2, 2); + l = new QLabel(tr("Path for help files"), this); v->addWidget(l); h = new QHBoxLayout(); v->addLayout(h); hlp = new QLineEdit(pathHelp, this); h->addWidget(hlp,1); @@ -157,10 +161,12 @@ PropDialog::PropDialog(QWidget *parent) : QDialog(parent) save = new QCheckBox(tr("Automatically save before redrawing (F5)"), this); save->setChecked(mglAutoSave); v->addWidget(save); pure = new QCheckBox(tr("Disable face drawing (faster) for mouse rotation/shift/zoom."), this); - pure->setChecked(mglAutoPure); v->addWidget(pure); + pure->setChecked(mglAutoPure); v->addWidget(pure); pure->setEnabled(false); cmpl = new QCheckBox(tr("Enable keywords completition"), this); cmpl->setChecked(mglCompleter); v->addWidget(cmpl); - + high = new QCheckBox(tr("Highlight current object(s)"), this); + high->setChecked(mglHighlight); v->addWidget(high); + h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); b = new QPushButton(tr("Cancel"), this); h->addWidget(b); @@ -189,7 +195,7 @@ void PropDialog::getPathF() //----------------------------------------------------------------------------- void PropDialog::setC(int k) { - if(k<0 || k>8) return; + if(k<0 || k>9) return; QColor c = QColorDialog::getColor(cc[k], this); if(c.isValid()) { @@ -211,6 +217,8 @@ void PropDialog::applyChanges() mglColorScheme[0]=cc[0]; mglColorScheme[1]=cc[1]; mglColorScheme[2]=cc[2]; mglColorScheme[3]=cc[3]; mglColorScheme[4]=cc[4]; mglColorScheme[5]=cc[5]; + mglColorScheme[6]=cc[6]; mglColorScheme[7]=cc[7]; + mglColorScheme[8]=cc[8]; mglColorScheme[9]=cc[9]; mglAutoExecute = run->isChecked(); editPosBottom = edt->isChecked(); pathHelp = hlp->text(); pathFont = fnt->lineEdit()->text(); @@ -219,6 +227,7 @@ void PropDialog::applyChanges() defFontSize = defFont.pointSize(); loadInNewWnd = load->isChecked(); mglAutoSave = save->isChecked(); + mglHighlight = high->isChecked(); mglAutoPure = pure->isChecked(); mglCompleter = cmpl->isChecked(); @@ -263,6 +272,6 @@ void PropDialog::applyChanges() settings.setValue("/defHeight", defHeight); settings.endGroup(); - accept(); + accept(); emit propUpdated(); } //----------------------------------------------------------------------------- diff --git a/udav/prop_dlg.h b/udav/prop_dlg.h index 7274325..8f0e126 100644 --- a/udav/prop_dlg.h +++ b/udav/prop_dlg.h @@ -36,6 +36,7 @@ public: ~PropDialog(); signals: void sizeChanged(int w, int h); + void propUpdated(); private slots: void applyChanges(); void setC0() { setC(0); } @@ -47,17 +48,18 @@ private slots: void setC6() { setC(6); } void setC7() { setC(7); } void setC8() { setC(8); } + void setC9() { setC(9); } void setF(); void getPathH(); void getPathF(); private: void setC(int k); QLabel *lbl; - QPushButton *cb[9]; - QCheckBox *run, *edt, *load, *save, *pure, *cmpl; + QPushButton *cb[10]; + QCheckBox *run, *edt, *load, *save, *pure, *cmpl, *high; QLineEdit *hlp, *defW, *defH; QFont defFont; - QColor cc[9]; + QColor cc[10]; QComboBox *lng, *fnt; }; //----------------------------------------------------------------------------- diff --git a/udav/qmglsyntax.cpp b/udav/qmglsyntax.cpp index 6d064a0..20efa2b 100644 --- a/udav/qmglsyntax.cpp +++ b/udav/qmglsyntax.cpp @@ -21,21 +21,34 @@ #include #include #include "qmglsyntax.h" -#include -mglParser parser; +#include +mglParse parser; int mgl_cmd_cmp(const void *a, const void *b); // comment string keyword option suffix number -QColor mglColorScheme[9] = {QColor(0,127,0), QColor(255,0,0), QColor(0,0,127), QColor(127,0,0), QColor(127,0,0), QColor(0,0,255), QColor(127,0,127), QColor(0,127,127), QColor(0,0,127)}; +QColor mglColorScheme[10] = {QColor(0,127,0), QColor(255,0,0), QColor(0,0,127), QColor(127,0,0), QColor(127,0,0), QColor(0,0,255), QColor(127,0,127), QColor(0,127,127), QColor(0,0,127), QColor(255,255,204)}; //----------------------------------------------------------------------------- QMGLSyntax::QMGLSyntax(QTextEdit *textEdit) : QSyntaxHighlighter(textEdit) {} //----------------------------------------------------------------------------- void QMGLSyntax::highlightBlock(const QString &text) { - register int i, j, n, m = text.length(),s=0; - for(n=0;parser.Cmd[n].name[0];n++){}; // determine the number of symbols in parser + register int i, j, m = text.length(),s=0; bool arg = false, nl = true; QString num("+-.0123456789:"); - for(i=0;i' ') cont=false; + if(text[i]=='\\') cont=true; + } + setFormat(j,i-j+1,mglColorScheme[1]); + if(cont && i==m) setCurrentBlockState(1); + } + for(;i' ') cont=false; + if(text[i]=='\\') cont=true; + } setFormat(j,i-j+1,mglColorScheme[1]); + if(cont && i==m) setCurrentBlockState(1); } else if(nl) // keyword { - wchar_t *s = new wchar_t[m+1]; + char *s = new char[m+1]; for(j=i;jtype!=6 ? (rts->type==4 ? mglColorScheme[6] : mglColorScheme[2]) : mglColorScheme[7]); + int type = parser.CmdType(s); + if(type) setFormat(i,j-i+1,type!=7 ? (type==5 ? mglColorScheme[6] : mglColorScheme[2]) : mglColorScheme[7]); delete []s; } else if(text[i]==';') { arg = true; nl = false; continue; } else if(text[i]==':' && s==0) { nl=true; continue; } else if(arg) // option { - const char *o[]={"xrange","yrange","zrange","crange","alpha", - "cut","ambient","meshnum","fontsize","alphadef", - "marksize","legend","light"}; - int l[] = {6, 6, 6, 6, 5, 3, 7, 7, 8, 8, 8, 6, 5}; + const char *o[13]={"xrange","yrange","zrange","cut","meshnum","alpha","light","ambient","diffuse","size","legend","number","value"}; + unsigned l; for(j=0;j<13;j++) - if(text.indexOf(o[j],i)==i && (i+l[j]==text.length() || text[i+l[j]].isSpace())) - setFormat(i,l[j],mglColorScheme[3]); + { + l = strlen(o[j]); + if(text.indexOf(o[j],i)==i && (i+l==text.length() || text[i+l].isSpace())) + setFormat(i,l,mglColorScheme[3]); + } } else if(text[i]=='.' && i+1addWidget(a2, 1, 2); fillArrows(a2); l = new QLabel(tr("Color"), p); g->addWidget(l, 2, 0, Qt::AlignRight); cline=new QComboBox(p); g->addWidget(cline, 2, 1); fillColors(cline); + + nline = new QSlider(p); g->addWidget(nline, 2, 2); + nline->setRange(1, 9); nline->setValue(5); + nline->setTickPosition(QSlider::TicksAbove); + nline->setTickInterval(1); nline->setPageStep(2); + nline->setOrientation(Qt::Horizontal); + l = new QLabel(tr("Marks"), p); g->addWidget(l, 3, 0, Qt::AlignRight); mark = new QComboBox(p); g->addWidget(mark, 3, 1); fillMarkers(mark); l = new QLabel(tr("Line width"), p); g->addWidget(l, 4, 0, Qt::AlignRight); @@ -111,6 +118,7 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent) connect(dash,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(mark,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(cline,SIGNAL(activated(int)), this, SLOT(updatePic())); + connect(nline,SIGNAL(valueChanged(int)), this, SLOT(updatePic())); connect(width,SIGNAL(valueChanged(int)), this, SLOT(updatePic())); tab->addTab(p, tr("Line style")); // color scheme @@ -132,7 +140,6 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent) connect(cc[i],SIGNAL(activated(int)), this, SLOT(updatePic())); connect(nn[i],SIGNAL(valueChanged(int)), this, SLOT(updatePic())); } - coor = new QCheckBox(tr("Colors along coordinates"),p); v->addWidget(coor); swire = new QCheckBox(tr("Wire or mesh plot"),p); v->addWidget(swire); g = new QGridLayout(); v->addLayout(g); l = new QLabel(tr("Axial direction"), p); g->addWidget(l, 0, 0, Qt::AlignRight); @@ -142,7 +149,6 @@ StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent) axial->addItem("y"); axial->addItem("z"); ctext = new QComboBox(p); g->addWidget(ctext, 1, 1); ctext->addItem(tr("none")); ctext->addItem(tr("under")); ctext->addItem(tr("above")); - connect(coor,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(axial,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(ctext,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(swire,SIGNAL(toggled(bool)), this, SLOT(updatePic())); @@ -291,7 +297,7 @@ void fillMarkers(QComboBox *cb) //----------------------------------------------------------------------------- void StyleDialog::updatePic() { - static mglGraph gr(0,128,30); + static mglGraph gr(0,128,30); static bool f = true; mglData x(3), y(3), a(32,2); x.Fill(-1,1); a.Fill(-1,1); @@ -318,29 +324,38 @@ void StyleDialog::updatePic() i = dash->currentIndex(); if(i>0) result += dsh[i-1]; i = mark->currentIndex(); if(i>0) result += mrk[i-1]; if(i>11) result += '#'; - i = cline->currentIndex(); if(i>0) result += col[i-1]; + i = cline->currentIndex(); + if(i>0) + { + j = nline->value(); + if(j!=5) result += "{"+col[i-1]+char('0'+i)+"}"; + else result += col[i-1]; + } i = width->value(); if(i>1) result += char('0'+i); - gr.Plot(x,y,result.toAscii()); + gr.Plot(x,y,result.toAscii().constData()); break; case 1: // color sceheme for(j=0;j<7;j++) { i = cc[j]->currentIndex(); if(i<1) break; - result += col[i-1]; + QCharRef c = col[i-1]; i = nn[j]->value(); - if(i!=5) result += char('0'+i); + if(i!=5) result += "{"+c+char('0'+i)+"}"; + else result += c; } - if(coor->isChecked()) result += 'd'; if(swire->isChecked()) result += '#'; i = ctext->currentIndex(); if(i==1) result += 't'; if(i==2) result += 'T'; i = axial->currentIndex(); if(i>0) result = result+':'+char('x'+i-1); - gr.Surf(a,result.toAscii()); + gr.Surf(a,result.toAscii().constData()); break; case 2: // text style + i = cfont->currentIndex(); + if(i>1) result += col[i-1]; + result += ':'; if(bold->isChecked()) result += 'b'; if(ital->isChecked()) result += 'i'; if(wire->isChecked()) result += 'w'; @@ -349,9 +364,7 @@ void StyleDialog::updatePic() if(rbL->isChecked()) result += 'L'; if(rbC->isChecked()) result += 'C'; if(rbR->isChecked()) result += 'R'; - i = cfont->currentIndex(); - if(i>0) result = result + ':' + col[i-1]; - gr.Puts(mglPoint(0,-0.5),"Font test",result.toAscii(),-10); + gr.Puts(mglPoint(0,-0.5),"Font test",result.toAscii().constData(),-10); break; } result = "'" + result + "'"; diff --git a/udav/style_dlg.h b/udav/style_dlg.h index a7c2ce3..fd7fe96 100644 --- a/udav/style_dlg.h +++ b/udav/style_dlg.h @@ -44,9 +44,9 @@ private slots: private: QString result; QComboBox *cc[8], *cline, *cfont; - QSlider *nn[8]; + QSlider *nn[8], *nline; QComboBox *axial, *ctext, *a1, *a2, *dash, *mark; - QCheckBox *swire, *coor, *upd; + QCheckBox *swire, *upd; QCheckBox *ital, *bold, *wire, *uline, *oline; QSpinBox *width; QGroupBox *align; diff --git a/udav/text_pnl.cpp b/udav/text_pnl.cpp index e6fc108..a3c1c89 100644 --- a/udav/text_pnl.cpp +++ b/udav/text_pnl.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include "mgl2/qmathgl.h" //----------------------------------------------------------------------------- #include "udav_wnd.h" #include "qmglsyntax.h" @@ -43,7 +43,7 @@ FilesDialog *files_dlg=0; QString defFontFamily; int defFontSize; bool mglAutoExecute = true; -extern mglParser parser; +extern mglParse parser; extern bool mglCompleter; QWidget *createDataOpenDlg(QWidget *p); QString getOpenDataFile(QWidget *w, QString filename); @@ -59,9 +59,8 @@ TextPanel::TextPanel(QWidget *parent) : QWidget(parent) dataOpenDlg = createDataOpenDlg(this); if(!files_dlg) files_dlg= new FilesDialog; - register int i; - for(i=0;mgls_base_cmd[i].name[0];i++) - words<setCaseSensitivity(Qt::CaseInsensitive); @@ -74,13 +73,13 @@ TextPanel::TextPanel(QWidget *parent) : QWidget(parent) new QMGLSyntax(edit); defFontFamily = edit->fontFamily(); defFontSize = int(edit->fontPointSize()); -// completer->setCompletionMode(QCompleter::PopupCompletion); + completer->setCompletionMode(QCompleter::PopupCompletion); // edit->setCompleter(completer); edit->setLineWrapMode(QTextEdit::NoWrap); setCompleter(mglCompleter); QBoxLayout *v,*h; - menu = new QMenu(tr("&Edit"),this); + menu = new QMenu(tr("Edit"),this); v = new QVBoxLayout(this); h = new QHBoxLayout(); v->addLayout(h); toolTop(h); v->addWidget(edit); @@ -98,10 +97,14 @@ mglData mglFormulaCalc(const wchar_t *string, mglParser *arg); void TextPanel::insNVal() { QString sel=edit->textCursor().selectedText(); - if(sel.isEmpty()) return; + if(sel.isEmpty()) + { + QMessageBox::warning(this,tr("UDAV"),tr("There is no selection to evaluate.")); + return; + } wchar_t *txt=new wchar_t[sel.length()+1]; sel.toWCharArray(txt); txt[sel.length()]=0; - mglData res=mglFormulaCalc(txt, &parser); + mglData res=mglFormulaCalc(txt, parser.Self()); delete []txt; edit->textCursor().insertText(QString::number(res.GetVal(0))); } @@ -109,7 +112,11 @@ void TextPanel::insNVal() void TextPanel::insFitF() { QString str(graph->getFit()); - if(str.isEmpty()) return; + if(str.isEmpty()) + { + QMessageBox::warning(this,tr("UDAV"),tr("There is no fitted formula.")); + return; + } edit->textCursor().insertText("'"+str+"'"); } //----------------------------------------------------------------------------- @@ -130,7 +137,7 @@ void TextPanel::insPath() void TextPanel::refreshData() { QStringList vars=words; - mglVar *v = parser.DataList; + mglVar *v = parser.FindVar(""); while(v) { if(v->s.length()>2) vars<s); @@ -140,7 +147,7 @@ void TextPanel::refreshData() completer = new QCompleter(vars, this); completer->setCaseSensitivity(Qt::CaseInsensitive); completer->setCompletionMode(QCompleter::PopupCompletion); - edit->setCompleter(completer); + setCompleter(mglCompleter); } //----------------------------------------------------------------------------- void TextPanel::printText() @@ -238,8 +245,10 @@ void TextPanel::setCursorPosition(int n) edit->setFocus(); } //----------------------------------------------------------------------------- -void TextPanel::newCmd() +void TextPanel::newCmd(int n) { + if(n>0) setCursorPosition(n-1); + else if(n==0) return; newCmdDlg->parseCmd(edit->textCursor().block().text()); newCmdDlg->show(); } @@ -276,7 +285,13 @@ void TextPanel::loadHDF5(const QString &fileName) char *buf = new char[dims[0]+1]; H5Dread(hd, H5T_C_S1, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); buf[dims[0]]=0; // to be sure :) - edit->setText(buf); + QString str = buf; + if(str.contains("#----- End of QMathGL block -----\n")) + { + graph->mgl->primitives = str.section("#----- End of QMathGL block -----\n",0,0); + str = str.section("#----- End of QMathGL block -----\n",1); + } + edit->setText(str); graph->animParseText(edit->toPlainText()); setCurrentFile(fileName); delete []buf; @@ -297,11 +312,11 @@ void TextPanel::loadHDF5(const QString &fileName) case 2: nx=dims[1]; ny=dims[0]; break; case 3: nx=dims[2]; ny=dims[1]; nz=dims[0]; break; } - v->d.Create(nx, ny, nz); + v->Create(nx, ny, nz); #if MGL_USE_DOUBLE - H5Dread(hd, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, v->d.a); + H5Dread(hd, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, v->a); #else - H5Dread(hd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, v->d.a); + H5Dread(hd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, v->a); #endif } } @@ -324,7 +339,10 @@ void TextPanel::saveHDF5(const QString &fileName) return; } { // save script - QString txt = edit->toPlainText(); + QString txt; + if(!graph->mgl->primitives.isEmpty()) + txt += graph->mgl->primitives + "#----- End of QMathGL block -----"; + txt += edit->toPlainText(); dims[0] = txt.length()+1; char *buf = new char[dims[0]+1]; memcpy(buf, txt.toAscii().constData(), dims[0]); @@ -335,21 +353,21 @@ void TextPanel::saveHDF5(const QString &fileName) H5Dclose(hd); H5Sclose(hs); delete []buf; } - mglVar *v = parser.DataList; + mglVar *v = parser.FindVar(""); char name[256]; while(v) { wcstombs(name,v->s.c_str(),v->s.length()+1); - if(v->d.nz==1 && v->d.ny == 1) - { rank = 1; dims[0] = v->d.nx; } - else if(v->d.nz==1) - { rank = 2; dims[0] = v->d.ny; dims[1] = v->d.nx; } + if(v->nz==1 && v->ny == 1) + { rank = 1; dims[0] = v->nx; } + else if(v->nz==1) + { rank = 2; dims[0] = v->ny; dims[1] = v->nx; } else - { rank = 3; dims[0] = v->d.nz; dims[1] = v->d.ny; dims[2] = v->d.nx; } + { rank = 3; dims[0] = v->nz; dims[1] = v->ny; dims[2] = v->nx; } hs = H5Screate_simple(rank, dims, 0); hd = H5Dcreate(hf, name, H5T_IEEE_F32LE, hs, H5P_DEFAULT); - H5Dwrite(hd, H5T_NATIVE_FLOAT, hs, hs, H5P_DEFAULT, v->d.a); + H5Dwrite(hd, H5T_NATIVE_FLOAT, hs, hs, H5P_DEFAULT, v->a); H5Dclose(hd); H5Sclose(hs); v = v->next; } @@ -405,7 +423,12 @@ void TextPanel::load(const QString &fileName) str = files_dlg->putFiles(str); } } - + if(str.contains("#----- End of QMathGL block -----\n")) + { + graph->mgl->primitives = str.section("#----- End of QMathGL block -----\n",0,0); + str = str.section("#----- End of QMathGL block -----\n",1); + } + if(narg>0) setCurrentFile(fileName.left(fileName.length()-3)+"mgl"); edit->setText(str); graph->animParseText(edit->toPlainText()); @@ -419,7 +442,10 @@ void TextPanel::save(const QString &fileName) { if(fileName.right(4)==".hdf" || fileName.right(3)==".h5") { saveHDF5(fileName); return; } - QString text = edit->toPlainText(); + QString text; + if(!graph->mgl->primitives.isEmpty()) + text += graph->mgl->primitives + "#----- End of QMathGL block -----\n"; + text += edit->toPlainText(); QFile f(fileName); if(!f.open(QIODevice::WriteOnly)) { @@ -452,13 +478,13 @@ void TextPanel::toolTop(QBoxLayout *l) bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(mw->asave); } // edit menu - a = new QAction(QPixmap(":/xpm/edit-undo.png"), tr("&Undo"), this); + a = new QAction(QPixmap(":/xpm/edit-undo.png"), tr("Undo"), this); connect(a, SIGNAL(triggered()), edit, SLOT(undo())); a->setToolTip(tr("Undo editor change (Ctrl+Z).")); a->setShortcut(Qt::CTRL+Qt::Key_Z); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/edit-redo.png"), tr("&Redo"), this); + a = new QAction(QPixmap(":/xpm/edit-redo.png"), tr("Redo"), this); connect(a, SIGNAL(triggered()), edit, SLOT(redo())); a->setToolTip(tr("Redo editor change (Ctrl+Shift+Z).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_Z); o->addAction(a); @@ -466,28 +492,28 @@ void TextPanel::toolTop(QBoxLayout *l) o->addSeparator(); o->addAction(tr("Clear all"), edit, SLOT(clear())); - a = new QAction(QPixmap(":/xpm/edit-cut.png"), tr("Cu&t text"), this); + a = new QAction(QPixmap(":/xpm/edit-cut.png"), tr("Cut text"), this); connect(a, SIGNAL(triggered()), edit, SLOT(cut())); a->setToolTip(tr("Cut selected text to clipboard (Ctrl+X).")); a->setShortcut(Qt::CTRL+Qt::Key_X); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/edit-copy.png"), tr("&Copy text"), this); + a = new QAction(QPixmap(":/xpm/edit-copy.png"), tr("Copy text"), this); connect(a, SIGNAL(triggered()), edit, SLOT(copy())); a->setToolTip(tr("Copy selected text or data to clipboard (Ctrl+C).")); a->setShortcut(Qt::CTRL+Qt::Key_C); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(QPixmap(":/xpm/edit-paste.png"), tr("&Paste text"), this); + a = new QAction(QPixmap(":/xpm/edit-paste.png"), tr("Paste text"), this); connect(a, SIGNAL(triggered()), edit, SLOT(paste())); a->setToolTip(tr("Paste text or data from clipboard (Ctrl+V).")); a->setShortcut(Qt::CTRL+Qt::Key_V); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - o->addAction(QPixmap(":/xpm/edit-select-all.png"), tr("Select &all"), edit, SLOT(selectAll()), Qt::CTRL+Qt::Key_A); + o->addAction(QPixmap(":/xpm/edit-select-all.png"), tr("Select all"), edit, SLOT(selectAll()), Qt::CTRL+Qt::Key_A); o->addSeparator(); - a = new QAction(QPixmap(":/xpm/edit-find.png"), tr("&Find/Replace"), this); + a = new QAction(QPixmap(":/xpm/edit-find.png"), tr("Find/Replace"), this); connect(a, SIGNAL(triggered()), this, SLOT(find())); a->setToolTip(tr("Show dialog for text finding (Ctrl+F).")); a->setShortcut(Qt::CTRL+Qt::Key_F); o->addAction(a); @@ -506,20 +532,20 @@ void TextPanel::toolTop(QBoxLayout *l) oo->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); - a = new QAction(tr("Fitted formula"), this); a->setShortcut(Qt::META+Qt::Key_N); - connect(a, SIGNAL(triggered()), this, SLOT(insFitF())); + a = new QAction(tr("Fitted formula"), this); + a->setShortcut(Qt::META+Qt::Key_F); connect(a, SIGNAL(triggered()), this, SLOT(insFitF())); a->setToolTip(tr("Insert last fitted formula with found coefficients.")); oo->addAction(a); a = new QAction(QPixmap(style_xpm), tr("Plot style"), this); - connect(a, SIGNAL(triggered()), this, SLOT(addStyle())); + a->setShortcut(Qt::META+Qt::Key_S); connect(a, SIGNAL(triggered()), this, SLOT(addStyle())); a->setToolTip(tr("Show dialog for styles and put it into the script.\nStyles define the plot view (color scheme, marks, dashing and so on).")); oo->addAction(a); a = new QAction(QPixmap(option_xpm), tr("Command options"), this); - connect(a, SIGNAL(triggered()), this, SLOT(addOptions())); + a->setShortcut(Qt::META+Qt::Key_O); connect(a, SIGNAL(triggered()), this, SLOT(addOptions())); a->setToolTip(tr("Show dialog for options and put it into the script.\nOptions are used for additional setup the plot.")); oo->addAction(a); a = new QAction(tr("Numeric value"), this); - connect(a, SIGNAL(triggered()), this, SLOT(insNVal())); + a->setShortcut(Qt::META+Qt::Key_N); connect(a, SIGNAL(triggered()), this, SLOT(insNVal())); a->setToolTip(tr("Replace expression by its numerical value.")); oo->addAction(a); a = new QAction(QPixmap(":/xpm/x-office-spreadsheet.png"), tr("File name"), this); @@ -532,7 +558,7 @@ void TextPanel::toolTop(QBoxLayout *l) oo->addAction(a); a = new QAction(QPixmap(":/xpm/document-properties.png"), tr("Graphics setup"), this); - connect(a, SIGNAL(triggered()), this, SLOT(addSetup())); + a->setShortcut(Qt::META+Qt::Key_G); connect(a, SIGNAL(triggered()), this, SLOT(addSetup())); a->setToolTip(tr("Show dialog for plot setup and put code into the script.\nThis dialog setup axis, labels, lighting and other general things.")); oo->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); diff --git a/udav/text_pnl.h b/udav/text_pnl.h index 9fe85da..4fd373e 100644 --- a/udav/text_pnl.h +++ b/udav/text_pnl.h @@ -73,7 +73,7 @@ public slots: void insFile(); void insPath(); void insFitF(); - void newCmd(); + void newCmd(int n=-1); void addSetup(); void refreshData(); diff --git a/udav/textedit.cpp b/udav/textedit.cpp index ca78fe7..ff16d95 100644 --- a/udav/textedit.cpp +++ b/udav/textedit.cpp @@ -47,13 +47,36 @@ #include #include #include +#include +#include +extern QColor mglColorScheme[10]; //----------------------------------------------------------------------------- -TextEdit::TextEdit(QWidget *parent) : QTextEdit(parent), c(0) {} +TextEdit::TextEdit(QWidget *parent) : QTextEdit(parent) +{ + c=0; + connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlight())); +} +//----------------------------------------------------------------------------- +void TextEdit::highlight() +{ + QList extraSelections; + if (!isReadOnly()) + { + QTextEdit::ExtraSelection selection; + selection.format.setBackground(mglColorScheme[9]); + selection.format.setProperty(QTextFormat::FullWidthSelection, true); + selection.cursor = textCursor(); + selection.cursor.clearSelection(); + extraSelections.append(selection); + } + setExtraSelections(extraSelections); +} //----------------------------------------------------------------------------- void TextEdit::setCompleter(QCompleter *completer) { + if(c && c!=completer) + { QObject::disconnect(c); c->setWidget(0); delete c; c=0; } if(!completer) return; - if(c) QObject::disconnect(c, 0, this, 0); c = completer; c->setWidget(this); c->setCompletionMode(QCompleter::PopupCompletion); @@ -63,7 +86,7 @@ void TextEdit::setCompleter(QCompleter *completer) //----------------------------------------------------------------------------- void TextEdit::insertCompletion(const QString& completion) { - if (c->widget() != this) return; + if (!c || c->widget() != this) return; QTextCursor tc = textCursor(); int extra = completion.length() - c->completionPrefix().length(); tc.movePosition(QTextCursor::Left); diff --git a/udav/textedit.h b/udav/textedit.h index 21199d5..3f45770 100644 --- a/udav/textedit.h +++ b/udav/textedit.h @@ -37,31 +37,33 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - #ifndef TEXTEDIT_H #define TEXTEDIT_H - +//----------------------------------------------------------------------------- #include - +//----------------------------------------------------------------------------- class QCompleter; - +class Numb; +//----------------------------------------------------------------------------- class TextEdit : public QTextEdit { Q_OBJECT public: TextEdit(QWidget *parent = 0); void setCompleter(QCompleter *c); QCompleter *completer() const { return c; } - + protected: void keyPressEvent(QKeyEvent *e); void focusInEvent(QFocusEvent *e); - + private slots: void insertCompletion(const QString &completion); + void highlight(); private: QString textUnderCursor() const; QCompleter *c; }; - +//----------------------------------------------------------------------------- #endif // TEXTEDIT_H +//----------------------------------------------------------------------------- diff --git a/udav/tree_pnl.cpp b/udav/tree_pnl.cpp new file mode 100644 index 0000000..e69de29 diff --git a/udav/tree_pnl.h b/udav/tree_pnl.h new file mode 100644 index 0000000..26a1186 --- /dev/null +++ b/udav/tree_pnl.h @@ -0,0 +1,57 @@ +/*************************************************************************** + * Copyright (C) 2008 by Alexey Balakin * + * mathgl.abalakin@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef TREE_PNL_H +#define TREE_PNL_H +//----------------------------------------------------------------------------- +#include +#include +//----------------------------------------------------------------------------- +class QMenu; +class QBoxLayout; +class OptionDialog; +class NewCmdDialog; +class PlotPanel; +class TextEdit; +//----------------------------------------------------------------------------- +class TreePanel : public QWidget +{ +Q_OBJECT +public: + // NOTE: these 3 pointers have to be filled!!! + TextEdit *edit; ///< script itself + PlotPanel *graph; + NewCmdDialog *newCmdDlg; + + TreePanel(QWidget *parent = 0); + ~TreePanel(); + +public slots: + void refresh(); ///< refresh tree according new script + void setPosition(int); ///< select item for given line number + void hidePlot(int); ///< hide plot for given item + void annotatePlot(int); ///< add annotation for given item + void newCmd(); ///< add new command + refresh tree + +private: + void toolTop(QBoxLayout *l); +}; +//----------------------------------------------------------------------------- +#endif // TREE_PNL_H +//----------------------------------------------------------------------------- diff --git a/udav/UDAV.desktop b/udav/udav.desktop similarity index 100% rename from udav/UDAV.desktop rename to udav/udav.desktop diff --git a/udav/udav_wnd.cpp b/udav/udav_wnd.cpp index f4a6504..fcdfc20 100644 --- a/udav/udav_wnd.cpp +++ b/udav/udav_wnd.cpp @@ -37,13 +37,13 @@ #include #include #include +#include //----------------------------------------------------------------------------- #if !defined(WIN32) && !defined(__APPLE__) #include #endif //----------------------------------------------------------------------------- -#include "mgl2/parser.h" -#include "mgl2/qt.h" +#include #include "udav_wnd.h" #include "text_pnl.h" #include "plot_pnl.h" @@ -57,11 +57,12 @@ QStringList recentFiles; int MaxRecentFiles=5; bool editPosBottom = false; bool mglAutoSave = false; +bool mglHighlight = true; bool mglAutoPure = true; bool mglCompleter = true; bool loadInNewWnd = false; QString pathHelp; -extern mglParser parser; +extern mglParse parser; extern QColor mglColorScheme[9]; extern QString defFontFamily; extern int defFontSize; @@ -109,9 +110,13 @@ int main(int argc, char **argv) settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); pathHelp = settings.value("/helpPath", MGL_DOC_DIR).toString(); +#if defined(WIN32) + if(pathHelp.isEmpty()) pathHelp = a.applicationDirPath()+"\\"; +#endif pathFont = settings.value("/userFont", "").toString(); lang = settings.value("/udavLang", "").toString(); bool showHint = settings.value("/showHint", true).toBool(); + mglCompleter = settings.value("/completer", true).toBool(); settings.endGroup(); if(pathHelp.isEmpty()) pathHelp=MGL_DOC_DIR; @@ -129,7 +134,7 @@ int main(int argc, char **argv) QTextCodec *codec = QTextCodec::codecForLocale(); mw->load(codec->toUnicode(argv[1]), true); } - mw->show(); parser.AllowSetSize = true; + mw->show(); parser.AllowSetSize(true); a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit())); if(showHint) udavShowHint(mw); return a.exec(); @@ -143,9 +148,9 @@ int main(int argc, char **argv) {L"fplot",L"Plot curve by formula",L"fplot 'func' ['stl'='' num=100]", mgls_fplot, mglc_fplot}, {L"fsurf",L"Plot surface by formula",L"fsurf 'func' ['stl'='' numx=100 numy=100]", mgls_fsurf, mglc_fsurf}, {L"fgets",L"Print string from file",L"fgets x y {z} 'fname' [pos=0 'stl'='' size=-1.4]", mgls_fgets, mglc_fgets}, -{L"",0,0,0,0}};*/ +{L"",0,0,0,0}}; //----------------------------------------------------------------------------- -void udavAddCommands(const mglCommand *cmd) +void udavAddCommands(const mglCommand *cmd) // NOTE it work but I don't how I can use it { int i, mp, mc; // determine the number of symbols @@ -157,7 +162,7 @@ void udavAddCommands(const mglCommand *cmd) qsort(buf, mp+mc, sizeof(mglCommand), mgl_cmd_cmp); if(parser.Cmd!=mgls_base_cmd) delete []parser.Cmd; parser.Cmd = buf; -} +}*/ //----------------------------------------------------------------------------- void udavLoadDefCommands() {} //{ udavAddCommands(udav_base_cmd); } //----------------------------------------------------------------------------- @@ -174,6 +179,7 @@ MainWindow::MainWindow(QWidget *wp) : QMainWindow(wp) split = new QSplitter(this); ltab = new QTabWidget(split); ltab->setMovable(true); ltab->setTabPosition(QTabWidget::South); +// ltab->setTabsClosable(true); rtab = new QTabWidget(split); rtab->setMovable(true); rtab->setTabPosition(QTabWidget::South); @@ -187,12 +193,12 @@ MainWindow::MainWindow(QWidget *wp) : QMainWindow(wp) calcWnd = new QDockWidget(tr("Calculator"),this); - aload = a = new QAction(QPixmap(":/xpm/document-open.png"), tr("&Open file"), this); + aload = a = new QAction(QPixmap(":/xpm/document-open.png"), tr("Open file"), this); connect(a, SIGNAL(triggered()), this, SLOT(choose())); a->setToolTip(tr("Open and execute/show script or data from file (Ctrl+O).\nYou may switch off automatic exection in UDAV properties.")); a->setShortcut(Qt::CTRL+Qt::Key_O); - asave = a = new QAction(QPixmap(":/xpm/document-save.png"), tr("&Save script"), this); + asave = a = new QAction(QPixmap(":/xpm/document-save.png"), tr("Save script"), this); connect(a, SIGNAL(triggered()), this, SLOT(save())); a->setToolTip(tr("Save script to a file (Ctrl+S)")); a->setShortcut(Qt::CTRL+Qt::Key_S); @@ -239,13 +245,15 @@ MainWindow::MainWindow(QWidget *wp) : QMainWindow(wp) connect(graph, SIGNAL(animPutText(const QString &)), edit, SLOT(animPutText(const QString &))); connect(graph,SIGNAL(giveFocus()),edit->edit,SLOT(setFocus())); connect(graph->mgl, SIGNAL(objChanged(int)), edit, SLOT(setCursorPosition(int))); - connect(graph->mgl, SIGNAL(posChanged(QString)), statusBar(), SLOT(showMessage(QString))); +// connect(graph->mgl, SIGNAL(posChanged(QString)), statusBar(), SLOT(showMessage(QString))); connect(graph->mgl, SIGNAL(refreshData()), this, SLOT(refresh())); connect(graph->mgl, SIGNAL(refreshData()), edit, SLOT(refreshData())); + connect(graph->mgl,SIGNAL(doubleClick(int)),edit,SLOT(newCmd(int))); connect(mess, SIGNAL(textChanged()), this, SLOT(warnChanged())); // connect(mdi, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(subActivated(QMdiSubWindow *))); connect(propDlg, SIGNAL(sizeChanged(int,int)), graph->mgl, SLOT(imgSize(int,int))); +// connect(propDlg, SIGNAL(propUpdated()), edit->edit, SLOT(update())); // TODO: update qmglsyntax connect(edit->edit,SIGNAL(textChanged()), this, SLOT(setAsterix())); connect(edit->edit, SIGNAL(cursorPositionChanged()), this, SLOT(editPosChanged())); connect(edit,SIGNAL(setCurrentFile(QString)),this,SLOT(setCurrentFile(QString))); @@ -264,8 +272,8 @@ void MainWindow::makeMenu() // file menu { - o = menuBar()->addMenu(tr("&File")); - a = new QAction(QPixmap(":/xpm/document-new.png"), tr("&New script"), this); + o = menuBar()->addMenu(tr("File")); + a = new QAction(QPixmap(":/xpm/document-new.png"), tr("New script"), this); connect(a, SIGNAL(triggered()), this, SLOT(newDoc())); a->setToolTip(tr("Create new empty script window (Ctrl+N).")); a->setShortcut(Qt::CTRL+Qt::Key_N); o->addAction(a); @@ -273,20 +281,20 @@ void MainWindow::makeMenu() o->addAction(aload); o->addAction(asave); - a = new QAction(tr("Save &As ..."), this); + a = new QAction(tr("Save as ..."), this); connect(a, SIGNAL(triggered()), this, SLOT(saveAs())); o->addAction(a); o->addSeparator(); - o->addAction(tr("&Print script"), edit, SLOT(printText())); - a = new QAction(QPixmap(":/xpm/document-print.png"), tr("Print &graphics"), this); + o->addAction(tr("Print script"), edit, SLOT(printText())); + a = new QAction(QPixmap(":/xpm/document-print.png"), tr("Print graphics"), this); connect(a, SIGNAL(triggered()), graph->mgl, SLOT(print())); - a->setToolTip(tr("Open printer dialog and print graphics\t(Ctrl+P)")); + a->setToolTip(tr("Open printer dialog and print graphics (Ctrl+P)")); a->setShortcut(Qt::CTRL+Qt::Key_P); o->addAction(a); o->addSeparator(); fileMenu = o->addMenu(tr("Recent files")); o->addSeparator(); - o->addAction(tr("&Quit"), qApp, SLOT(closeAllWindows()), Qt::CTRL+Qt::Key_Q); + o->addAction(tr("Quit"), qApp, SLOT(closeAllWindows())); } menuBar()->addMenu(edit->menu); @@ -294,31 +302,27 @@ void MainWindow::makeMenu() // settings menu { - o = menuBar()->addMenu(tr("&Settings")); + o = menuBar()->addMenu(tr("Settings")); a = new QAction(QPixmap(":/xpm/preferences-system.png"), tr("Properties"), this); connect(a, SIGNAL(triggered()), this, SLOT(properties())); a->setToolTip(tr("Show dialog for UDAV properties.")); o->addAction(a); - o->addAction(tr("Set ar&guments"), createArgsDlg(this), SLOT(exec())); + o->addAction(tr("Set arguments"), createArgsDlg(this), SLOT(exec())); o->addAction(acalc); o->addAction(ainfo); } menuBar()->addSeparator(); - o = menuBar()->addMenu(tr("&Help")); - a = new QAction(QPixmap(":/xpm/help-contents.png"), tr("MGL &help"), this); + o = menuBar()->addMenu(tr("Help")); + a = new QAction(QPixmap(":/xpm/help-contents.png"), tr("MGL help"), this); connect(a, SIGNAL(triggered()), this, SLOT(showHelp())); a->setToolTip(tr("Show help on MGL commands (F1).")); a->setShortcut(Qt::Key_F1); o->addAction(a); -// a = new QAction(QPixmap(":/xpm/help-faq.png"), tr("&Examples"), this); -// connect(a, SIGNAL(triggered()), this, SLOT(showExamples())); -// a->setToolTip(tr("Show examples of MGL usage (Shift+F1).")); -// a->setShortcut(Qt::SHIFT+Qt::Key_F1); o->addAction(a); - a = new QAction(QPixmap(":/xpm/help-faq.png"), tr("H&ints"), this); + a = new QAction(QPixmap(":/xpm/help-faq.png"), tr("Hints"), this); connect(a, SIGNAL(triggered()), this, SLOT(showHint())); a->setToolTip(tr("Show hints of MGL usage.")); o->addAction(a); - o->addAction(tr("&About"), this, SLOT(about())); - o->addAction(tr("About &Qt"), this, SLOT(aboutQt())); + o->addAction(tr("About"), this, SLOT(about())); + o->addAction(tr("About Qt"), this, SLOT(aboutQt())); } //----------------------------------------------------------------------------- void MainWindow::closeEvent(QCloseEvent* ce) @@ -425,10 +429,9 @@ void MainWindow::editPosChanged() for(i=0;idesc)+": "+QString::fromAscii(rts->form)); + const char *desc = parser.CmdDesc(text.toAscii().constData()); + const char *form = parser.CmdFormat(text.toAscii().constData()); + if(form) setStatus(QString::fromAscii(desc)+": "+QString::fromAscii(form)); else setStatus(tr("Not recognized")); } //----------------------------------------------------------------------------- @@ -450,6 +453,7 @@ void MainWindow::messClicked() int n = s.toInt()-1; if(n<0) return; edit->moveCursor(QTextCursor::Start); for(int i=0;imoveCursor(QTextCursor::NextBlock); + break; } } edit->setFocus(); @@ -465,8 +469,8 @@ void MainWindow::warnChanged() //----------------------------------------------------------------------------- void MainWindow::about() { - QString s = tr("UDAV v. 0.")+QString::number(UDAV_VERSION)+ - tr("\n(c) Alexey Balakin, 2008\nhttp://udav.sf.net/"); + QString s = tr("UDAV v. 2.")+QString::number(MGL_VER2)+ + tr("\n(c) Alexey Balakin, 2008-2012\nhttp://mathgl.sf.net/"); QMessageBox::about(this, tr("UDAV - about"), s); } //----------------------------------------------------------------------------- @@ -497,8 +501,10 @@ void MainWindow::writeSettings() settings.setValue("/colACKeyword", mglColorScheme[6].name()); settings.setValue("/colFCKeyword", mglColorScheme[7].name()); settings.setValue("/colReserved", mglColorScheme[8].name()); + settings.setValue("/colCurrLine", mglColorScheme[9].name()); settings.setValue("/autoExec", mglAutoExecute); settings.setValue("/autoSave", mglAutoSave); + settings.setValue("/highlight", mglHighlight); settings.setValue("/autoPure", mglAutoPure); settings.setValue("/editAtTop", editPosBottom); settings.setValue("/fontFamily", defFontFamily); @@ -533,7 +539,9 @@ void MainWindow::readSettings() mglColorScheme[6] = QColor(settings.value("/colACKeyword","#7F007F").toString()); mglColorScheme[7] = QColor(settings.value("/colFCKeyword","#007F7F").toString()); mglColorScheme[8] = QColor(settings.value("/colReserved", "#0000FF").toString()); + mglColorScheme[9] = QColor(settings.value("/colCurrLine", "#FFFFCC").toString()); mglAutoSave = settings.value("/autoSave", false).toBool(); + mglHighlight = settings.value("/highlight", true).toBool(); mglAutoPure = settings.value("/autoPure", true).toBool(); mglAutoExecute = settings.value("/autoExec", true).toBool(); editPosBottom = settings.value("/editAtTop", false).toBool(); @@ -554,12 +562,12 @@ void MainWindow::readSettings() } //----------------------------------------------------------------------------- void MainWindow::setStatus(const QString &txt) -{ statusBar()->showMessage(txt, 2000); } +{ statusBar()->showMessage(txt, 5000); } //----------------------------------------------------------------------------- void MainWindow::setCurrentFile(const QString &fileName) { filename = fileName; - graph->mgl->getGraph()->PlotId = (const char *)fileName.toAscii(); + graph->mgl->getGraph()->PlotId = fileName.toAscii().constData(); edit->setModified(false); if(filename.isEmpty()) setWindowTitle(tr("untitled - UDAV")); @@ -646,7 +654,7 @@ void MainWindow::choose() void MainWindow::load(const QString &fileName, bool noNewWnd) { // save current path - QFileInfo fi(fileName); + QFileInfo fi(fileName); filename = fileName; QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); diff --git a/udav/udav_wnd.h b/udav/udav_wnd.h index 3758cdb..1091d7d 100644 --- a/udav/udav_wnd.h +++ b/udav/udav_wnd.h @@ -22,10 +22,6 @@ //----------------------------------------------------------------------------- #include //----------------------------------------------------------------------------- -#ifndef UDAV_VERSION -#define UDAV_VERSION 7 -#endif -//----------------------------------------------------------------------------- #ifndef MGL_DOC_DIR #ifdef WIN32 #define MGL_DOC_DIR "" diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 271ca76..ab06731 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -1,23 +1,3 @@ -if(MGL_HAVE_GSL) -# target_link_libraries(mgl ${GSL_LIB} ${GSL_CBLAS_LIB} ) - include_directories(${GSL_INCLUDE_DIR}) -endif(MGL_HAVE_GSL) - -if(MGL_HAVE_FLTK) - include_directories(${FLTK_INCLUDE_DIR}) - set(mgl_wnd_src ${mgl_wnd_src} fltk.cpp) -endif(MGL_HAVE_FLTK) -if(MGL_HAVE_WX) - include(${wxWidgets_USE_FILE}) - set(mgl_wnd_src ${mgl_wnd_src} wx.cpp) -endif(MGL_HAVE_WX) -if(MGL_HAVE_QT) - include(${QT_USE_FILE}) - qt_wrap_cpp(mgl-qt MGL_MOC_FILES ../include/mgl2/qt.h) - set(mgl_wnd_src ${mgl_wnd_src} qt.cpp ${MGL_MOC_FILES}) -endif(MGL_HAVE_QT) - - add_executable(mglconv mglconv.cpp) target_link_libraries(mglconv mgl) @@ -26,11 +6,19 @@ install( RUNTIME DESTINATION bin ) -if(MGL_HAVE_FLTK OR MGL_HAVE_QT) -add_executable(mglview mglview.cpp) -target_link_libraries(mglview mgl-wnd) +add_executable(mgl.cgi mglcgi.cpp) +target_link_libraries(mgl.cgi mgl) install( - TARGETS mglview + TARGETS mgl.cgi RUNTIME DESTINATION bin ) -endif(MGL_HAVE_FLTK OR MGL_HAVE_QT) + +if(MGL_HAVE_QT) + include(${QT_USE_FILE}) + add_executable(mglview mglview.cpp) + target_link_libraries(mglview mgl-qt) + install( + TARGETS mglview + RUNTIME DESTINATION bin + ) +endif(MGL_HAVE_QT) diff --git a/utils/mglcgi.cpp b/utils/mglcgi.cpp new file mode 100644 index 0000000..4f08553 --- /dev/null +++ b/utils/mglcgi.cpp @@ -0,0 +1,89 @@ +/*************************************************************************** + * mglcgi.cpp is part of Math Graphic Library + * Copyright (C) 2007-2012 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include +#include "mgl2/mgl.h" +//----------------------------------------------------------------------------- +int mgl_hex(char ch) +{ + int res=-1; + if(ch>='0' && ch<='9') res = ch-'0'; + if(ch>='a' && ch<='f') res = ch-'a'+10; + if(ch>='A' && ch<='F') res = ch-'A'+10; + return res; +} +//----------------------------------------------------------------------------- +/// Parse CGI string buf and return usual string as val for given name. +/// The size of val should be the same as size of buf. +void mgl_get_value(const char *buf, const char *name, char *val) +{ + const char *pos = strstr(buf,name); + memset(val,0,strlen(buf)+1); + if(pos && (pos==buf || pos[-1]=='&')) + { + pos+=4; // shift for "mgl=" + register size_t i,j,l=strlen(pos); + for(i=j=0;i\n"); + printf("\n"); + printf("MathGL - library for scientific graphics\n\n"); + gr.WriteSVG("-"); fflush(stdout); + printf("\n");*/ + + printf("Content-Type: image/png\n\n"); gr.WritePNG("-"); + return 0; +} +//----------------------------------------------------------------------------- diff --git a/utils/mglconv.cpp b/utils/mglconv.cpp index 49ff395..2c8d54f 100644 --- a/utils/mglconv.cpp +++ b/utils/mglconv.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - * mgl2png.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * mglconv.cpp is part of Math Graphic Library + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -84,7 +84,9 @@ int main(int argc, char *argv[]) std::wstring str; setlocale(LC_CTYPE, ""); FILE *fp = *iname?fopen(iname,"r"):stdin; - while(!feof(fp)) str.push_back(fgetwc(fp)); + wchar_t cw; + while((cw=fgetwc(fp))!=WEOF) str.push_back(cw); +// while(!feof(fp)) str.push_back(fgetwc(fp)); if(*iname) fclose(fp); for(i=0;;) // collect exact values @@ -125,6 +127,7 @@ int main(int argc, char *argv[]) printf("%s\n",gr.Message()); gr.WriteFrame(oname); } + if(!mglGlobalMess.empty()) printf("%s",mglGlobalMess.c_str()); printf("Write output to %s\n",oname); return 0; } diff --git a/utils/mglview.cpp b/utils/mglview.cpp index 67f2d74..4094294 100644 --- a/utils/mglview.cpp +++ b/utils/mglview.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mglview.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -19,14 +19,16 @@ ***************************************************************************/ #include #include -#include "mgl2/window.h" -#include "mgl2/parser.h" + +#include "mgl2/mgl.h" +#include "mgl2/qt.h" //----------------------------------------------------------------------------- std::wstring str; mglParse p(true); void mgl_error_print(const char *Message, void *par); void mgl_ask_fltk(const wchar_t *quest, wchar_t *res); void mgl_ask_qt(const wchar_t *quest, wchar_t *res); +void mgl_ask_gets(const wchar_t *quest, wchar_t *res); //----------------------------------------------------------------------------- int show(mglGraph *gr) { @@ -62,21 +64,22 @@ int main(int argc, char **argv) } if(ch=='h') return 0; - mgl_ask_func = mgl_ask_gets; -#if MGL_HAVE_QT - int kind=1; mgl_ask_func = mgl_ask_qt; -#else - int kind=0; mgl_ask_func = mgl_ask_fltk; -#endif bool mgld=(*iname && iname[strlen(iname)-1]=='d'); if(!mgld) { setlocale(LC_CTYPE, ""); FILE *fp = *iname?fopen(iname,"r"):stdin; - while(!feof(fp)) str.push_back(fgetwc(fp)); - if(*iname) fclose(fp); + if(fp) + { + wchar_t ch; + while((ch=fgetwc(fp))!=WEOF) str.push_back(ch); + fclose(fp); + } } - mglWindow gr(mgld?NULL:show, *iname?iname:"mglview", kind); + + mgl_ask_func = mgl_ask_gets; + mgl_ask_func = mgl_ask_qt; + mglQT gr(mgld?NULL:show, *iname?iname:"mglview"); if(mgld) { gr.Setup(false); @@ -85,6 +88,7 @@ int main(int argc, char **argv) setlocale(LC_NUMERIC, ""); gr.Update(); } + if(!mglGlobalMess.empty()) printf("%s",mglGlobalMess.c_str()); gr.Run(); return 0; } diff --git a/widgets/CMakeLists.txt b/widgets/CMakeLists.txt index 69f9653..91f2fd6 100644 --- a/widgets/CMakeLists.txt +++ b/widgets/CMakeLists.txt @@ -1,36 +1,34 @@ -set(mgl_wnd_hdr ../include/mgl2/window.h ../include/mgl2/canvas_wnd.h) -set(mgl_wnd_src window.cpp) -#set(mgl_wnd_src ) - -if(MGL_HAVE_GSL) -# target_link_libraries(mgl ${GSL_LIB} ${GSL_CBLAS_LIB} ) - include_directories(${GSL_INCLUDE_DIR}) -endif(MGL_HAVE_GSL) if(MGL_HAVE_FLTK) include_directories(${FLTK_INCLUDE_DIR}) - set(mgl_wnd_src ${mgl_wnd_src} fltk.cpp) - set(mgl_wnd_hdr ${mgl_wnd_hdr} ../include/mgl2/fltk.h) + add_library(mgl-fltk SHARED fltk.cpp ../include/mgl2/fltk.h) + add_library(mgl-fltk-static STATIC fltk.cpp ../include/mgl2/fltk.h) + set_target_properties(mgl-fltk-static PROPERTIES OUTPUT_NAME "mgl-fltk") + set_target_properties(mgl-fltk PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(mgl-fltk-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(mgl-fltk PROPERTIES SOVERSION 7.0.0) + target_link_libraries(mgl-fltk mgl) + target_link_libraries(mgl-fltk ${FLTK_LIBRARIES}) + + install( + TARGETS mgl-fltk mgl-fltk-static + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + ) endif(MGL_HAVE_FLTK) if(MGL_HAVE_GLUT) include_directories(${GLUT_INCLUDE_DIR}) - set(mgl_glut_src glut.cpp window.cpp) - set(mgl_glut_hdr ../include/mgl2/glut.h ../include/mgl2/window.h) - - add_library(mgl-glut SHARED ${mgl_glut_src} ${mgl_glut_hdr}) - add_library(mgl-glut-static STATIC ${mgl_glut_src} ${mgl_glut_hdr}) + add_library(mgl-glut SHARED glut.cpp ../include/mgl2/glut.h) + add_library(mgl-glut-static STATIC glut.cpp ../include/mgl2/glut.h) set_target_properties(mgl-glut-static PROPERTIES OUTPUT_NAME "mgl-glut") set_target_properties(mgl-glut PROPERTIES CLEAN_DIRECT_OUTPUT 1) set_target_properties(mgl-glut-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) - set_target_properties(mgl-glut PROPERTIES SOVERSION 6.0.0) + set_target_properties(mgl-glut PROPERTIES SOVERSION 7.0.0) target_link_libraries(mgl-glut mgl) target_link_libraries(mgl-glut ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES}) - if(MGL_HAVE_PTHREAD) - target_link_libraries(mgl-glut ${CMAKE_THREAD_LIBS_INIT}) - endif(MGL_HAVE_PTHREAD) - install( TARGETS mgl-glut mgl-glut-static RUNTIME DESTINATION bin @@ -41,46 +39,71 @@ endif(MGL_HAVE_GLUT) if(MGL_HAVE_WX) include(${wxWidgets_USE_FILE}) - set(mgl_wnd_src ${mgl_wnd_src} wx.cpp) - set(mgl_wnd_hdr ${mgl_wnd_hdr} ../include/mgl2/fltk.h) + add_library(mgl-wx SHARED wx.cpp ../include/mgl2/wx.h) + add_library(mgl-wx-static STATIC wx.cpp ../include/mgl2/wx.h) + set_target_properties(mgl-wx-static PROPERTIES OUTPUT_NAME "mgl-wx") + set_target_properties(mgl-wx PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(mgl-wx-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(mgl-wx PROPERTIES SOVERSION 7.0.0) + target_link_libraries(mgl-wx mgl) + target_link_libraries(mgl-wx ${wxWidgets_LIBRARIES}) + + install( + TARGETS mgl-wx mgl-wx-static + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + ) endif(MGL_HAVE_WX) if(MGL_HAVE_QT) include(${QT_USE_FILE}) -# qt_wrap_cpp(mgl-wnd MGL_MOC_FILES ../include/mgl2/qt.h) - qt4_wrap_cpp(MGL_MOC_FILES ../include/mgl2/qt.h) - set(mgl_wnd_src ${mgl_wnd_src} qt.cpp ${MGL_MOC_FILES}) - set(mgl_wnd_hdr ${mgl_wnd_hdr} ../include/mgl2/qt.h) + qt4_wrap_cpp(MGL_MOC_FILES ../include/mgl2/qmathgl.h) + add_library(mgl-qt SHARED qt.cpp ${MGL_MOC_FILES} ../include/mgl2/qt.h ../include/mgl2/qmathgl.h) + add_library(mgl-qt-static STATIC qt.cpp ${MGL_MOC_FILES} ../include/mgl2/qt.h ../include/mgl2/qmathgl.h) + set_target_properties(mgl-qt-static PROPERTIES OUTPUT_NAME "mgl-qt") + set_target_properties(mgl-qt PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(mgl-qt-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(mgl-qt PROPERTIES SOVERSION 7.0.0) + target_link_libraries(mgl-qt mgl) + target_link_libraries(mgl-qt ${QT_LIBRARIES}) + + install( + TARGETS mgl-qt mgl-qt-static + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + ) endif(MGL_HAVE_QT) -add_library(mgl-wnd SHARED ${mgl_wnd_src} ${mgl_wnd_hdr}) -add_library(mgl-wnd-static STATIC ${mgl_wnd_src} ${mgl_wnd_hdr}) -set_target_properties(mgl-wnd-static PROPERTIES OUTPUT_NAME "mgl-wnd") -set_target_properties(mgl-wnd PROPERTIES CLEAN_DIRECT_OUTPUT 1) -set_target_properties(mgl-wnd-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) -set_target_properties(mgl-wnd PROPERTIES SOVERSION 6.0.0) -target_link_libraries(mgl-wnd mgl) +#if(MGL_HAVE_QT AND MGL_HAVE_WX AND MGL_HAVE_FLTK) +if(MGL_HAVE_QT AND MGL_HAVE_FLTK) + include_directories(${FLTK_INCLUDE_DIR}) +# include(${wxWidgets_USE_FILE}) + include(${QT_USE_FILE}) -if(MGL_HAVE_PTHREAD) - target_link_libraries(mgl-wnd ${CMAKE_THREAD_LIBS_INIT}) -endif(MGL_HAVE_PTHREAD) +# set(MGL_WND_SRC wx.cpp ../include/mgl2/wx.h qt.cpp ../include/mgl2/qt.h ../include/mgl2/qmathgl.h fltk.cpp ../include/mgl2/fltk.h) + set(MGL_WND_SRC qt.cpp ../include/mgl2/qt.h ../include/mgl2/qmathgl.h fltk.cpp ../include/mgl2/fltk.h) -if(MGL_HAVE_FLTK) - target_link_libraries(mgl-wnd ${FLTK_LIBRARIES}) -endif(MGL_HAVE_FLTK) + add_library(mgl-wnd SHARED ${MGL_WND_SRC} ${MGL_MOC_FILES}) + add_library(mgl-wnd-static STATIC ${MGL_WND_SRC} ${MGL_MOC_FILES}) -if(MGL_HAVE_WX) - target_link_libraries(mgl-wnd ${wxWidgets_LIBRARIES}) -endif(MGL_HAVE_WX) + set_target_properties(mgl-wnd-static PROPERTIES OUTPUT_NAME "mgl-wnd") + set_target_properties(mgl-wnd PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(mgl-wnd-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(mgl-wnd PROPERTIES SOVERSION 7.0.0) -if(MGL_HAVE_QT) + target_link_libraries(mgl-wnd mgl) target_link_libraries(mgl-wnd ${QT_LIBRARIES}) -endif(MGL_HAVE_QT) +# target_link_libraries(mgl-wnd ${wxWidgets_LIBRARIES}) + target_link_libraries(mgl-wnd ${FLTK_LIBRARIES}) -install( - TARGETS mgl-wnd mgl-wnd-static - RUNTIME DESTINATION bin - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib -) + install( + TARGETS mgl-wnd mgl-wnd-static + RUNTIME DESTINATION bin + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + ) +#endif(MGL_HAVE_QT AND MGL_HAVE_WX AND MGL_HAVE_FLTK) +endif(MGL_HAVE_QT AND MGL_HAVE_FLTK) diff --git a/widgets/fltk.cpp b/widgets/fltk.cpp index 3d22f35..963bcbf 100644 --- a/widgets/fltk.cpp +++ b/widgets/fltk.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_fltk.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -33,6 +33,7 @@ #endif #endif //----------------------------------------------------------------------------- +#include "mgl2/canvas_wnd.h" #include "mgl2/fltk.h" //----------------------------------------------------------------------------- #include "xpm/alpha_on.xpm" @@ -55,24 +56,56 @@ #include "xpm/zoom_out.xpm" #include "xpm/rotate.xpm" #include "xpm/ok.xpm" +#include "xpm/wire.xpm" //----------------------------------------------------------------------------- Fl_Pixmap xpm_a1(alpha_xpm), xpm_a2(alpha_on_xpm); Fl_Pixmap xpm_l1(light_on_xpm), xpm_l2(light_xpm); Fl_Pixmap xpm_z1(zoom_in_xpm), xpm_z2(zoom_on_xpm); Fl_Pixmap xpm_s1(show_sl_xpm), xpm_s2(show_on_xpm); Fl_Pixmap xpm_r1(rotate_xpm), xpm_r2(rotate_on_xpm); +Fl_Pixmap xpm_wire(wire_xpm); +//----------------------------------------------------------------------------- +/// Class allows the window creation for displaying plot bitmap with the help of FLTK library +/** NOTE!!! All frames are saved in memory. So animation with many frames require a lot memory and CPU time (for example, for mouse rotation).*/ +class mglCanvasFL : public mglCanvasWnd +{ +public: +using mglCanvasWnd::Window; + Fl_Window *Wnd; ///< Pointer to window + Fl_MGLView *mgl; ///< Pointer to MGL widget with buttons + + mglCanvasFL(); + ~mglCanvasFL(); + + /// Create a window for plotting. Now implemeted only for GLUT. + void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, + void *par=NULL, void (*reload)(void *p)=NULL, bool maximize=false); + /// Switch on/off transparency (do not overwrite switches in user drawing function) + void ToggleAlpha(); + /// Switch on/off lighting (do not overwrite switches in user drawing function) + void ToggleLight(); + void ToggleRotate(); ///< Switch on/off rotation by mouse + void ToggleZoom(); ///< Switch on/off zooming by mouse + void ToggleNo(); ///< Switch off all zooming and rotation + void Update(); ///< Update picture by calling user drawing function + void Adjust(); ///< Adjust size of bitmap to window size + void GotoFrame(int d); ///< Show arbitrary frame (use relative step) + void Animation(); ///< Run animation (I'm too lasy to change it) +}; //----------------------------------------------------------------------------- void mgl_ask_fltk(const wchar_t *quest, wchar_t *res) { static char buf[1024]; #if FL_MINOR_VERSION>=3 fl_utf8fromwc(buf, 1024, quest, wcslen(quest)+1); - const char *str = fl_input(buf,""); - fl_utf8towc(str, strlen(str)+1, res, 1024); + const char *str = fl_input("%s",buf,""); + if(str) fl_utf8towc(str, strlen(str)+1, res, 1024); + else *res=0; #else wcstombs(buf,quest,wcslen(quest)+1); - const char *str = fl_input(buf,""); - mbstowcs(res,str, strlen(str)+1); + const char *str = fl_input("%s",buf,""); + if(str) mbstowcs(res,str, strlen(str)+1); + else *res=0; #endif } //----------------------------------------------------------------------------- @@ -80,7 +113,7 @@ void mgl_ask_fltk(const wchar_t *quest, wchar_t *res) // class Fl_MathGL // //----------------------------------------------------------------------------- -Fl_MathGL::Fl_MathGL(int xx, int yy, int ww, int hh, char *lbl) : Fl_Widget(xx,yy,ww,hh,lbl) +Fl_MathGL::Fl_MathGL(int xx, int yy, int ww, int hh, const char *lbl) : Fl_Widget(xx,yy,ww,hh,lbl) { gr = new mglCanvas; tet=phi=x1=y1=0; x2=y2=1; @@ -90,16 +123,19 @@ Fl_MathGL::Fl_MathGL(int xx, int yy, int ww, int hh, char *lbl) : Fl_Widget(xx,y draw_par = 0; draw_func = 0; draw_cl = 0; } //----------------------------------------------------------------------------- -Fl_MathGL::~Fl_MathGL() {} +Fl_MathGL::~Fl_MathGL() { if(mgl_use_graph(gr,-1)<1) mgl_delete_graph(gr); } //----------------------------------------------------------------------------- -void Fl_MathGL::set_graph(mglCanvas *GR) +void Fl_MathGL::set_graph(HMGL GR) { - if(!GR) return; - delete gr; gr=GR; + mglCanvas *gg = dynamic_cast(GR); + if(!gg) return; + if(mgl_use_graph(gr,-1)<1) mgl_delete_graph(gr); + gr=gg; mgl_use_graph(gg,1); } //----------------------------------------------------------------------------- void Fl_MathGL::draw() { + // TODO: add active points drawing here (from Qt) const unsigned char *g = gr ? gr->GetBits() : 0; int i, hh=gr->GetHeight(), ww=gr->GetWidth(); if(g) fl_draw_image(g, x(), y(), ww, hh, 3); @@ -127,9 +163,14 @@ void Fl_MathGL::update() gr->Alpha(flag&1); gr->Light(flag&2); if(tet_val) tet = tet_val->value(); if(phi_val) phi = phi_val->value(); - gr->Zoom(x1,y1,x2,y2); gr->View(phi,tet); + gr->Zoom(x1,y1,x2,y2); gr->View(phi,0,tet); + setlocale(LC_NUMERIC, "C"); + // use frames for quickly redrawing while adding/changing primitives + if(gr->get(MGL_VECT_FRAME) && !(gr->GetQuality()&4)) gr->NewFrame(); if(draw_func) draw_func(gr, draw_par); // drawing itself else if(draw_cl) { mglGraph g(gr); draw_cl->Draw(&g); } + if(gr->get(MGL_VECT_FRAME) && !(gr->GetQuality()&4)) gr->EndFrame(); + setlocale(LC_NUMERIC, ""); const char *buf = gr->Mess.c_str(); if(*buf) fl_message("%s",buf); } @@ -226,7 +267,7 @@ int Fl_MathGL::handle(int code) else if(code==FL_DRAG) { xe=Fl::event_x(); ye=Fl::event_y(); - mreal ff = 240./sqrt(w()*h()); + mreal ff = 240./sqrt(mreal(w()*h())); if(rotate) { phi += (x0-xe)*ff; @@ -297,8 +338,8 @@ void Fl_MGLView::setoff(int &val, Fl_Button *b, const char *txt) //update(); } //----------------------------------------------------------------------------- -void mgl_wire_cb(Fl_Widget*, void* v) -{ if(v) ((Fl_MGLView*)v)->toggle_wire(); } +void mgl_grid_cb(Fl_Widget*, void* v) +{ if(v) ((Fl_MGLView*)v)->toggle_grid(); } //------------------------------------------------------------------------- void mgl_alpha_cb(Fl_Widget*, void* v) // alpha?xpm_a2:xpm_a1 { if(v) ((Fl_MGLView*)v)->toggle_alpha(); } @@ -335,7 +376,7 @@ void mglCanvasFL::ToggleRotate() { Fl::lock(); mgl_rotate_cb(0,mgl); Fl::unlock( void Fl_MGLView::update() { FMGL->set_state(zoom_bt->value(), rotate_bt->value()); - FMGL->set_flag(alpha + 2*light + 4*wire); + FMGL->set_flag(alpha + 2*light + 4*grid); FMGL->update(); } void mgl_draw_cb(Fl_Widget*, void* v) @@ -534,112 +575,89 @@ Fl_Menu_Item pop_graph[20] = { { 0,0,0,0,0,0,0,0,0 } }; //----------------------------------------------------------------------------- -Fl_Menu_Item mgl_menuitems[] = { - { gettext("Export"), 0, 0, 0, FL_SUBMENU,0,0,0,0 }, - { gettext(".. as PNG"), FL_ALT + 'p', mgl_export_png_cb,0,0,0,0,0,0 }, - { gettext(".. as PNG (solid)"), FL_ALT + 'f', mgl_export_pngn_cb,0,0,0,0,0,0 }, - { gettext(".. as JPEG"), FL_ALT + 'j', mgl_export_jpeg_cb,0,0,0,0,0,0 }, - { gettext(".. as SVG"), FL_ALT + 's', mgl_export_svg_cb,0,0,0,0,0,0 }, - { gettext(".. as vector EPS"), FL_ALT + 'e', mgl_export_eps_cb,0,0,0,0,0,0 }, - { gettext(".. as bitmap EPS"), 0, mgl_export_bps_cb, 0, FL_MENU_DIVIDER,0,0,0,0 }, -// { gettext("Exit"), FL_ALT + 'x', quit_cb,0,0,0,0,0,0 }, - { 0,0,0,0,0,0,0,0,0 }, - { gettext("Graphics"), 0, 0, 0, FL_SUBMENU,0,0,0,0 }, - { gettext("Alpha"), FL_ALT + 'a', mgl_alpha_cb, 0, FL_MENU_TOGGLE,0,0,0,0 }, - { gettext("Light"), FL_ALT + 'l', mgl_light_cb, 0, FL_MENU_TOGGLE,0,0,0,0 }, - { gettext("Copy graphics"), 0, 0, 0, FL_MENU_INACTIVE|FL_MENU_DIVIDER,0,0,0,0}, - { gettext("Normal view"), FL_ALT + ' ', mgl_norm_cb,0,0,0,0,0,0 }, - { gettext("Redraw plot"),FL_F + 5, mgl_draw_cb,0,0,0,0,0,0 }, - { gettext("Adjust size"), FL_F + 6, mgl_adjust_cb,0,0,0,0,0,0 }, - { gettext("Reload data"), 0, mgl_oncemore_cb,0,0,0,0,0,0 }, - { 0,0,0,0,0,0,0,0,0 }, - { gettext("Animate"), 0, 0, 0, FL_SUBMENU,0,0,0,0 }, - { gettext("Slideshow"), FL_CTRL + FL_F + 5, mgl_sshow_cb, 0, FL_MENU_TOGGLE,0,0,0,0 }, - { gettext("Next frame"),0, mgl_snext_cb,0,0,0,0,0,0 }, - { gettext("Prev frame"),0, mgl_sprev_cb,0,0,0,0,0,0 }, - { 0,0,0,0,0,0,0,0,0 }, - { 0,0,0,0,0,0,0,0,0 } -}; -//----------------------------------------------------------------------------- -Fl_MGLView::Fl_MGLView(int xx, int yy, int ww, int hh, char *lbl) : Fl_Window(xx,yy,ww,hh,lbl) +Fl_MGLView::Fl_MGLView(int xx, int yy, int ww, int hh, const char *lbl) : Fl_Window(xx,yy,ww,hh,lbl) { - alpha = light = sshow = 0; menu = 0; + grid = alpha = light = sshow = 0; menu = 0; next = prev = reload = NULL; delay = NULL; - Fl_Group *g = new Fl_Group(0,30,410,30); Fl_Button *o; + Fl_Group *g = new Fl_Group(0,30,435,30); - alpha_bt = new Fl_Button(0, 31, 25, 25); alpha_bt->type(FL_TOGGLE_BUTTON); + alpha_bt = new Fl_Button(0, 1, 25, 25); alpha_bt->type(FL_TOGGLE_BUTTON); alpha_bt->image(xpm_a1); alpha_bt->callback(mgl_alpha_cb,this); alpha_bt->tooltip(gettext("Switch on/off transparency in the picture")); - alpha_bt->box(FL_PLASTIC_UP_BOX); alpha_bt->down_box(FL_PLASTIC_DOWN_BOX); - light_bt = new Fl_Button(25, 31, 25, 25); light_bt->type(FL_TOGGLE_BUTTON); +// alpha_bt->box(FL_PLASTIC_UP_BOX); alpha_bt->down_box(FL_PLASTIC_DOWN_BOX); + light_bt = new Fl_Button(25, 1, 25, 25); light_bt->type(FL_TOGGLE_BUTTON); light_bt->image(xpm_l1); light_bt->callback(mgl_light_cb,this); light_bt->tooltip(gettext("Switch on/off lightning in the picture")); - light_bt->box(FL_PLASTIC_UP_BOX); light_bt->down_box(FL_PLASTIC_DOWN_BOX); - - rotate_bt = new Fl_Button(55, 31, 25, 25); rotate_bt->type(FL_TOGGLE_BUTTON); +// light_bt->box(FL_PLASTIC_UP_BOX); light_bt->down_box(FL_PLASTIC_DOWN_BOX); + grid_bt = new Fl_Button(50, 1, 25, 25); grid_bt->type(FL_TOGGLE_BUTTON); + grid_bt->image(xpm_wire); grid_bt->callback(mgl_grid_cb,this); + grid_bt->tooltip(gettext("Switch on/off grid drawing")); + // grid_bt->box(FL_PLASTIC_UP_BOX); grid_bt->down_box(FL_PLASTIC_DOWN_BOX); + + rotate_bt = new Fl_Button(80, 1, 25, 25);rotate_bt->type(FL_TOGGLE_BUTTON); rotate_bt->image(xpm_r1); rotate_bt->callback(mgl_rotate_cb,this); rotate_bt->tooltip(gettext("Rotate picture by holding left mouse button")); - rotate_bt->box(FL_PLASTIC_UP_BOX); rotate_bt->down_box(FL_PLASTIC_DOWN_BOX); - zoom_bt = new Fl_Button(80, 31, 25, 25); zoom_bt->type(FL_TOGGLE_BUTTON); +// rotate_bt->box(FL_PLASTIC_UP_BOX); rotate_bt->down_box(FL_PLASTIC_DOWN_BOX); + zoom_bt = new Fl_Button(105, 1, 25, 25); zoom_bt->type(FL_TOGGLE_BUTTON); zoom_bt->image(xpm_z1); zoom_bt->callback(mgl_zoom_cb,this); zoom_bt->tooltip(gettext("Zoom in selected region of the picture")); - zoom_bt->box(FL_PLASTIC_UP_BOX); zoom_bt->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(105, 31, 25, 25); o->tooltip(gettext("Return picture to normal zoom")); +// zoom_bt->box(FL_PLASTIC_UP_BOX); zoom_bt->down_box(FL_PLASTIC_DOWN_BOX); + o = new Fl_Button(130, 1, 25, 25); o->tooltip(gettext("Return picture to normal zoom")); o->image(new Fl_Pixmap(zoom_out_xpm)); o->callback(mgl_norm_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(135, 31, 25, 25); o->tooltip(gettext("Refresh the picture")); + o = new Fl_Button(160, 1, 25, 25); o->tooltip(gettext("Refresh the picture")); o->image(new Fl_Pixmap(ok_xpm)); o->callback(mgl_draw_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); Fl_Counter *tet, *phi; - tet = new Fl_Counter(170, 31, 90, 25, 0); tet->callback(mgl_draw_cb,this); - phi = new Fl_Counter(265, 31, 90, 25, 0); phi->callback(mgl_draw_cb,this); + tet = new Fl_Counter(195, 1, 90, 25, 0); tet->callback(mgl_draw_cb,this); + phi = new Fl_Counter(290, 1, 90, 25, 0); phi->callback(mgl_draw_cb,this); tet->lstep(10); tet->step(1); tet->range(-180,180); tet->tooltip(gettext("Theta angle (tilt z-axis)")); phi->lstep(10); phi->step(1); phi->range(-180,180); phi->tooltip(gettext("Phi angle (rotate in x*y plane)")); - tet->box(FL_PLASTIC_UP_BOX); phi->box(FL_PLASTIC_UP_BOX); +// tet->box(FL_PLASTIC_UP_BOX); phi->box(FL_PLASTIC_UP_BOX); g->end(); g->resizable(0); - g = new Fl_Group(0,60,30,260); - o = new Fl_Button(1, 60, 25, 25); o->tooltip(gettext("Shift the picture up")); + g = new Fl_Group(0,30,30,260); + o = new Fl_Button(1, 30, 25, 25); o->tooltip(gettext("Shift the picture up")); o->image(new Fl_Pixmap(up_1_xpm)); o->callback(mgl_su_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(1, 85, 25, 25); o->tooltip(gettext("Shift the picture left")); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); + o = new Fl_Button(1, 55, 25, 25); o->tooltip(gettext("Shift the picture left")); o->image(new Fl_Pixmap(left_1_xpm)); o->callback(mgl_sl_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(1, 110, 25, 25); o->tooltip(gettext("Zoom in the picture")); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); + o = new Fl_Button(1, 80, 25, 25); o->tooltip(gettext("Zoom in the picture")); o->image(new Fl_Pixmap(zoom_1_xpm)); o->callback(mgl_sz_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(1, 135, 25, 25); o->tooltip(gettext("Zoom out the picture")); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); + o = new Fl_Button(1, 105, 25, 25); o->tooltip(gettext("Zoom out the picture")); o->image(new Fl_Pixmap(norm_1_xpm)); o->callback(mgl_so_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(1, 160, 25, 25); o->tooltip(gettext("Shift the picture right")); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); + o = new Fl_Button(1, 130, 25, 25); o->tooltip(gettext("Shift the picture right")); o->image(new Fl_Pixmap(right_1_xpm)); o->callback(mgl_sr_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(1, 185, 25, 25); o->tooltip(gettext("Shift the picture down")); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); + o = new Fl_Button(1, 155, 25, 25); o->tooltip(gettext("Shift the picture down")); o->image(new Fl_Pixmap(down_1_xpm)); o->callback(mgl_sd_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(1, 215, 25, 25); o->tooltip(gettext("Show previous frame in slideshow")); + o = new Fl_Button(1, 185, 25, 25); o->tooltip(gettext("Show previous frame in slideshow")); o->image(new Fl_Pixmap(prev_sl_xpm)); o->callback(mgl_sprev_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - anim_bt = new Fl_Button(1, 240, 25, 25); anim_bt->type(FL_TOGGLE_BUTTON); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); + anim_bt = new Fl_Button(1, 210, 25, 25); anim_bt->type(FL_TOGGLE_BUTTON); anim_bt->image(xpm_s1); anim_bt->callback(mgl_sshow_cb,this); anim_bt->tooltip(gettext("Run/Stop slideshow (graphics animation)")); - anim_bt->box(FL_PLASTIC_UP_BOX); anim_bt->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(1, 265, 25, 25); o->tooltip(gettext("Show next frame in slideshow")); +// anim_bt->box(FL_PLASTIC_UP_BOX); anim_bt->down_box(FL_PLASTIC_DOWN_BOX); + o = new Fl_Button(1, 235, 25, 25); o->tooltip(gettext("Show next frame in slideshow")); o->image(new Fl_Pixmap(next_sl_xpm)); o->callback(mgl_snext_cb,this); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); +// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); g->end(); g->resizable(0); - scroll = new Fl_Scroll(30, 60, 800, 600); + scroll = new Fl_Scroll(30, 30, 800, 600); //scroll->begin(); - FMGL = new Fl_MathGL(30, 60, 800, 600); + FMGL = new Fl_MathGL(30, 30, 800, 600); FMGL->tet_val = tet; FMGL->phi_val = phi; FMGL->set_popup(pop_graph,FMGL,this); @@ -668,18 +686,45 @@ void mgl_fl_prev(void *v) { ((mglCanvasWnd*)v)->PrevFrame(); } ///< Callback fun void mgl_fl_reload(void *v) { ((mglCanvasWnd*)v)->ReLoad(); } ///< Callback function for reloading mreal mgl_fl_delay(void *v) { return ((mglCanvasWnd*)v)->GetDelay(); } ///< Callback function for delay //----------------------------------------------------------------------------- +void mgl_makemenu_fltk(Fl_Menu_ *m, Fl_MGLView *w) +{ + m->add("Graphics/Alpha", "^t", mgl_alpha_cb, w, FL_MENU_TOGGLE); + m->add("Graphics/Light", "^l", mgl_light_cb, w, FL_MENU_TOGGLE); + m->add("Graphics/Grid", "^g", mgl_grid_cb, w, FL_MENU_TOGGLE|FL_MENU_DIVIDER); + + m->add("Graphics/Restore", "^ ", mgl_norm_cb, w); + m->add("Graphics/Redraw", "f5", mgl_draw_cb, w); + m->add("Graphics/Adjust size", "f6", mgl_adjust_cb, w); + m->add("Graphics/Reload data", "f9", mgl_oncemore_cb, w); + //TODO m->add("Graphics/Stop", "f7", mgl_stop_cb, w); + //TODO m->add("Graphics/Copy graphics","+^c", mgl_copyimg_cb, w); + + m->add("Graphics/Export/as PNG", "#p", mgl_export_png_cb, w); + m->add("Graphics/Export/as solid PNG", "#f", mgl_export_pngn_cb, w); + m->add("Graphics/Export/as JPEG", "#j", mgl_export_jpeg_cb, w); + m->add("Graphics/Export/as SVG", "#s", mgl_export_svg_cb, w); + m->add("Graphics/Export/as vector EPS", "#e", mgl_export_eps_cb, w); + m->add("Graphics/Export/as bitmap EPS", "", mgl_export_bps_cb, w); + + m->add("Graphics/Animation/Slideshow", "^f5", mgl_sshow_cb, w, FL_MENU_TOGGLE); + m->add("Graphics/Animation/Next frame", "#<", mgl_snext_cb, w); + m->add("Graphics/Animation/Prev frame", "#>", mgl_sprev_cb, w); + //TODO m->add("Graphics/Animation/Setup", "", mgl_ssetup_cb, w); +} +//----------------------------------------------------------------------------- void mglCanvasFL::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, void *par, void (*reload)(void *p), bool maximize) { Fl::lock(); SetDrawFunc(draw, par, reload); if(Wnd) { Wnd->label(title); Wnd->show(); return; } - Wnd = new Fl_Double_Window(0,0,830,660,title); + Wnd = new Fl_Double_Window(830,660,title); - mgl = new Fl_MGLView(0,0,830,660); mgl->par = this; + mgl = new Fl_MGLView(0,30,830,630); mgl->par = this; mgl->menu = new Fl_Menu_Bar(0, 0, 830, 30); - mgl->menu->copy(mgl_menuitems, this); + mgl_makemenu_fltk(mgl->menu, mgl); + mgl->next = mgl_fl_next; mgl->reload = mgl_fl_reload; mgl->prev = mgl_fl_prev; mgl->delay= mgl_fl_delay; mgl->FMGL->set_graph(this); @@ -709,3 +754,24 @@ HMGL mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char *title, voi } int mgl_fltk_run() { return Fl::run(); } //----------------------------------------------------------------------------- +uintptr_t mgl_create_graph_fltk_(const char *title, int l) +{ + char *s = new char[l+1]; memcpy(s,title,l); s[l]=0; + uintptr_t t = uintptr_t(mgl_create_graph_fltk(0,s,0,0)); + delete []s; return t; +} +int mgl_fltk_run_() { return mgl_fltk_run(); } +//----------------------------------------------------------------------------- +void *mgl_fltk_tmp(void *) +{ mgl_fltk_run(); return 0; } +//----------------------------------------------------------------------------- +int mgl_fltk_thr() // NOTE: Qt couldn't be running in non-primary thread +{ +#if MGL_HAVE_PTHREAD + static pthread_t thr; + pthread_create(&thr,0,mgl_fltk_tmp,0); + pthread_detach(thr); +#endif + return 0; // stupid, but I don't want keep result returned by Fl::Run() +} +//----------------------------------------------------------------------------- diff --git a/widgets/glut.cpp b/widgets/glut.cpp index b01922d..175af48 100644 --- a/widgets/glut.cpp +++ b/widgets/glut.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_glut.cpp is part of Math Graphic Library - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -36,9 +36,53 @@ #include "mgl2/glut.h" -mglCanvasGLUT *_mgl_glwnd; void _mgl_key_up(unsigned char ch,int ,int ); //----------------------------------------------------------------------------- +/// Class allows the window creation under OpenGL with the help of GLUT library +class mglCanvasGLUT : public mglCanvasGL +{ +friend void _mgl_display(); +friend void _mgl_key_up(unsigned char ch,int ,int ); +friend void _mgl_timer(int); +public: + mreal Delay; ///< Delay for animation in seconds + bool AutoClf; ///< Clear canvas between drawing + + mglCanvasGLUT(); + mglCanvasGLUT(int (*draw)(mglGraph *gr, void *p), const char *title, void *par=NULL, + void (*reload)(int next, void *p)=NULL, bool maximize=false); + virtual ~mglCanvasGLUT(); + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ��������� ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + /// Create a window for plotting. Now implemeted only for GLUT. + void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), + const char *title,void *par=NULL, + void (*reload)(void *p)=NULL, bool maximize=false); + void Window(int argc, char **argv, int (*draw)(mglGraph *gr), + const char *title, bool maximize=false) + { Window(argc,argv,draw?mgl_draw_graph:0,title,(void*)draw,0,maximize); } + /// Create a window for plotting based on class mglDraw. + void Window(int argc, char **argv, const char *title, mglDraw *draw, bool maximize=false) + { Window(argc, argv, draw?mgl_draw_class:0, title, draw, mgl_reload_class, maximize); } + /// Switch on/off transparency (do not overwrite switches in user drawing function) + void ToggleAlpha() { _mgl_key_up('r',0,0); } + /// Switch on/off lighting (do not overwrite switches in user drawing function) + void ToggleLight() { _mgl_key_up('f',0,0); } + void ToggleNo() { _mgl_key_up('n',0,0); } ///< Switch off all zooming and rotation + void Update() { _mgl_key_up(' ',0,0); } ///< Update picture by calling user drawing function + void ReLoad(bool o) { _mgl_key_up(o?']':'[',0,0); } ///< Reload user data and update picture + void NextFrame() { _mgl_key_up('.',0,0); } ///< Show next frame (if one) + void PrevFrame() { _mgl_key_up(',',0,0); } ///< Show previous frame (if one) + void Animation() { _mgl_key_up('m',0,0); } ///< Run slideshow (animation) of frames +private: + void (*LoadFunc)(void *par); + void *FuncPar; ///< Parameters for drawing function mglCanvas::DrawFunc. + /// Drawing function for window procedure. It should return the number of frames. + int (*DrawFunc)(mglBase *gr, void *par); + int NumFig; ///< Number of figures in the list. If 0 then no list and mglCanvas::DrawFunc will called for each drawing. + int curr_fig; ///< Current figure in the list. + int tt; ///< Temporal variable +} *_mgl_glwnd; +//----------------------------------------------------------------------------- void _mgl_timer(int) { if(!_mgl_glwnd) return; @@ -77,11 +121,11 @@ void _mgl_key_up(unsigned char ch,int ,int ) } if(ch=='w') _mgl_glwnd->View(-10,0,0); if(ch=='s') _mgl_glwnd->View(10,0,0); - if(ch=='a') _mgl_glwnd->View(0,-10,0); - if(ch=='d') _mgl_glwnd->View(0,10,0); - if(ch=='q') _mgl_glwnd->View(0,0,-10); - if(ch=='e') _mgl_glwnd->View(0,0,10); - if(ch=='n') _mgl_glwnd->Identity(); + if(ch=='a') _mgl_glwnd->View(0,0,-10); + if(ch=='d') _mgl_glwnd->View(0,0,10); + if(ch=='q') _mgl_glwnd->View(0,-10,0); + if(ch=='e') _mgl_glwnd->View(0,10,0); + if(ch=='n') _mgl_glwnd->Restore(); if(ch==',') _mgl_glwnd->curr_fig = _mgl_glwnd->curr_fig == 1 ? _mgl_glwnd->NumFig : _mgl_glwnd->curr_fig-1; if(ch=='.') @@ -190,15 +234,3 @@ HMGL mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, voi //----------------------------------------------------------------------------- mglCanvasGLUT::mglCanvasGLUT() : mglCanvasGL() {} //----------------------------------------------------------------------------- -#if MGL_HAVE_FLTK -HMGL mgl_create_graph_fltk(int (*)(HMGL gr, void *p), const char *, void *, void (*)(void *p)) -{ return NULL; } -int mgl_fltk_run(){return 0;} -#endif -//----------------------------------------------------------------------------- -#if MGL_HAVE_QT -HMGL mgl_create_graph_qt(int (*)(HMGL gr, void *p), const char *, void *, void (*)(void *p)) -{ return NULL; } -int mgl_qt_run(){return 0;} -#endif -//----------------------------------------------------------------------------- diff --git a/widgets/qt.cpp b/widgets/qt.cpp index a65c241..1c9f833 100644 --- a/widgets/qt.cpp +++ b/widgets/qt.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_qt.cpp is part of Math Graphic Library * - * Copyright (C) 2007 Alexey Balakin * + * Copyright (C) 2007-2012 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -36,29 +36,48 @@ #include #include #include +#include + +#include "mgl2/canvas_wnd.h" +#include "mgl2/qmathgl.h" #include "mgl2/qt.h" //----------------------------------------------------------------------------- +#define MGL_MAX_LINES (INT_MAX-1000) #if !defined(WIN32) && !defined(__APPLE__) #include #endif //----------------------------------------------------------------------------- -#include "xpm/fileprint.xpm" -#include "xpm/copy.xpm" -#include "xpm/left_1.xpm" -#include "xpm/right_1.xpm" -#include "xpm/down_1.xpm" -#include "xpm/norm_1.xpm" -#include "xpm/zoom_1.xpm" -#include "xpm/up_1.xpm" -#include "xpm/alpha.xpm" -#include "xpm/light.xpm" -#include "xpm/zoom_in.xpm" -#include "xpm/zoom_out.xpm" -#include "xpm/rotate.xpm" -#include "xpm/ok.xpm" -#include "xpm/show_sl.xpm" -#include "xpm/next_sl.xpm" -#include "xpm/prev_sl.xpm" +/// Base class for windows containing MathGL graphics +class mglCanvasQT : public mglCanvasWnd +{ +public: +using mglCanvasWnd::Window; + int sshow; ///< Current state of animation switch (toggle button) + QMathGL *QMGL; ///< Control which draw graphics + QMainWindow *Wnd; ///< Pointer to window + + mglCanvasQT(); + + /// Create a window for plotting. Now implemeted only for GLUT. + void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p),const char *title, + void *par=NULL, void (*reload)(void *p)=NULL, bool maximize=false); + /// Switch on/off transparency (do not overwrite switches in user drawing function) + void ToggleAlpha(); + /// Switch on/off lighting (do not overwrite switches in user drawing function) + void ToggleLight(); + void ToggleRotate();///< Switch on/off rotation by mouse + void ToggleZoom(); ///< Switch on/off zooming by mouse + void ToggleNo(); ///< Switch off all zooming and rotation + void Update(); ///< Update picture by calling user drawing function + void Adjust(); ///< Adjust size of bitmap to window size + void GotoFrame(int d); ///< Show arbitrary frame (use relative step) + void Animation(); ///< Run slideshow (animation) of frames + +protected: + QScrollArea *scroll; ///< Scrolling area + QMenu *popup; ///< Popup menu + QSpinBox *tet, *phi; ///< Spin box for angles +}; //----------------------------------------------------------------------------- void mgl_ask_qt(const wchar_t *quest, wchar_t *res) { QInputDialog::getText(QApplication::activeWindow(), "MathGL", @@ -72,18 +91,33 @@ QMathGL::QMathGL(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) { autoResize = false; draw_par = 0; draw_func = 0; gr = new mglCanvas; appName = "MathGL"; - popup = 0; grBuf = 0; draw = 0; + popup = 0; grBuf = 0; draw = 0; phi = tet = per = 0; - x1 = y1 = 0; x2 = y2 = 1; + x1 = y1 = ax1 = ay1 = 0; x2 = y2 = ax2 = ay2 = 1; alpha = light = zoom = rotate = grid = false; resize(600, 400); gr->set(MGL_CLF_ON_UPD); timer = new QTimer(this); + enableWheel = enableMouse = true; // resize(graph->GetWidth(), graph->GetHeight()); // mglConvertFromGraph(pic, graph, &grBuf); connect(timer, SIGNAL(timeout()), this, SLOT(nextSlide())); } //----------------------------------------------------------------------------- -QMathGL::~QMathGL() { delete gr; if(grBuf) delete []grBuf; } +QMathGL::~QMathGL() +{ + if(mgl_use_graph(gr,-1)<1) mgl_delete_graph(gr); + if(grBuf) delete []grBuf; +} +//----------------------------------------------------------------------------- +double QMathGL::getRatio() { return double(gr->GetWidth())/gr->GetHeight(); } +//----------------------------------------------------------------------------- +void QMathGL::setGraph(HMGL GR) ///< Set grapher object +{ + mglCanvas *gg = dynamic_cast(GR); + if(!gg) return; + if(mgl_use_graph(gr,-1)<1) mgl_delete_graph(gr); + gr=gg; mgl_use_graph(gg,1); +} //----------------------------------------------------------------------------- void QMathGL::paintEvent(QPaintEvent *) { @@ -95,7 +129,7 @@ void QMathGL::paintEvent(QPaintEvent *) paint.drawText(0,12,mousePos); if(grid) { - int i, h=pic.height(), w=pic.width(); + long i, d, h=pic.height(), w=pic.width(); paint.setPen(QColor(192,192,192)); for(i=1;i<10;i++) { @@ -104,6 +138,16 @@ void QMathGL::paintEvent(QPaintEvent *) paint.drawText(i*w/10,h,QString::number(i*0.1)); paint.drawLine(i*w/10,0,i*w/10,h); } + paint.setPen(QColor(0,0,0)); + d = (h>w?w:h)/100; + if(gr->get(MGL_VECT_FRAME) && !(gr->GetQuality()&4)) + for(i=0;i<(long)gr->Act.size();i++) + { + const mglActivePos &p=gr->Act[i]; + QRect rf(p.x-d/2,p.y-d/2-1,d,d); + paint.drawRect(rf); + paint.fillRect(rf,QBrush(QColor(127,255,63))); + } } paint.end(); } @@ -134,7 +178,7 @@ void QMathGL::setLight(bool l) { if(light!=l) { light = l; emit lightChanged(l); update(); } } //----------------------------------------------------------------------------- void QMathGL::setGrid(bool g) -{ if(grid!=g) { grid = g; emit gridChanged(g); refresh(); } } +{ if(grid!=g) { grid = g; emit gridChanged(g); refresh(); } } //----------------------------------------------------------------------------- void QMathGL::setRotate(bool r) { @@ -150,39 +194,44 @@ void QMathGL::setZoom(bool z) } //----------------------------------------------------------------------------- void QMathGL::shiftDown() -{ mreal d=(y2-y1)/3; y1+=d; y2+=d; refresh(); } +{ mreal d=(y2-y1)/4; y1+=d; y2+=d; refresh(); } //----------------------------------------------------------------------------- void QMathGL::shiftUp() -{ mreal d=(y2-y1)/3; y1-=d; y2-=d; refresh(); } +{ mreal d=(y2-y1)/4; y1-=d; y2-=d; refresh(); } //----------------------------------------------------------------------------- void QMathGL::shiftRight() -{ mreal d=(x2-x1)/3; x1-=d; x2-=d; refresh(); } +{ mreal d=(x2-x1)/4; x1-=d; x2-=d; refresh(); } //----------------------------------------------------------------------------- void QMathGL::shiftLeft() -{ mreal d=(x2-x1)/3; x1+=d; x2+=d; refresh(); } +{ mreal d=(x2-x1)/4; x1+=d; x2+=d; refresh(); } //----------------------------------------------------------------------------- void QMathGL::zoomIn() { - mreal d; - d = (y2-y1)/4; y1 += d; y2 -= d; - d = (x2-x1)/4; x1 += d; x2 -= d; + mreal d,c; + d = (y2-y1)/4; c = (y2+y1)/2; y1 = c-d; y2 = c+d; + d = (x2-x1)/4; c = (x2+x1)/2; x1 = c-d; x2 = c+d; refresh(); } //----------------------------------------------------------------------------- void QMathGL::zoomOut() { - mreal d; - d = (y2-y1)/2; y1 -= d; y2 += d; - d = (x2-x1)/2; x1 -= d; x2 += d; + mreal d,c; + d = (y2-y1); c = (y2+y1)/2; y1 = c-d; y2 = c+d; + d = (x2-x1); c = (x2+x1)/2; x1 = c-d; x2 = c+d; refresh(); } //----------------------------------------------------------------------------- void QMathGL::restore() { setPhi(0); setTet(0); setPer(0); - x1=y1=0; x2=y2=1; zoom=rotate=false; + x1=y1=0; x2=y2=1; zoom=rotate=false; emit zoomChanged(false); emit rotateChanged(false); - refresh(); + if(ax1!=0 || ay1!=0 || ax2!=1 || ay2!=1) + { + ax1=ay1=0; ax2=ay2=1; + gr->ZoomAxis(); update(); + } + else refresh(); } //----------------------------------------------------------------------------- void QMathGL::stop() { gr->Stop=true; } //{ thr->terminate(); } @@ -199,16 +248,19 @@ void QMathGL::update() if(draw_func || draw) { + gr->ResetFrames(); // remove previous frames if(gr->get(MGL_CLF_ON_UPD)) gr->DefaultPlotParam(); gr->Alpha(alpha); gr->Light(light); if(!isHidden()) QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - setlocale(LC_NUMERIC, "C"); // NOTE: I'm not sure what I should selocale manually??? + setlocale(LC_NUMERIC, "C"); + // use frames for quickly redrawing while adding/changing primitives + if(gr->get(MGL_VECT_FRAME) && !(gr->GetQuality()&4)) gr->NewFrame(); if(draw_func) draw_func(gr, draw_par); else if(draw) { mglGraph g(gr); draw->Draw(&g); } + if(gr->get(MGL_VECT_FRAME) && !(gr->GetQuality()&4)) gr->EndFrame(); setlocale(LC_NUMERIC, ""); if(!isHidden()) QApplication::restoreOverrideCursor(); emit refreshData(); - emit showWarn(gr->Mess.c_str()); mousePos=""; } @@ -217,7 +269,30 @@ void QMathGL::update() //----------------------------------------------------------------------------- void QMathGL::refresh() { - gr->Zoom(x1,y1,x2,y2); gr->View(phi,tet); gr->Perspective(per); +// printf("%ld,%d\n",gr->GetPrmNum(),gr->GetNumFrame()); fflush(stdout); + if(gr->get(MGL_VECT_FRAME) && !(gr->GetQuality()&4) && gr->GetNumFrame()>0) + { + if(draw_func || draw) + { + gr->Clf(); gr->GetFrame(gr->GetNumFrame()-1); + mglParse pr; + long i, n=primitives.count('\n'); + mglGraph gg(gr); + setlocale(LC_NUMERIC, "C"); + gg.Push(); gg.SubPlot(1,1,0,"#"); + mglPoint x1=gr->Min, x2=gr->Max; + gg.SetRanges(mglPoint(-1,-1,-1),mglPoint(1,1,1)); + for(i=0;iSetObjId(i+MGL_MAX_LINES); + QString tst = primitives.section('\n',i,i); + pr.Parse(&gg,primitives.section('\n',i,i).toAscii().constData(),i+MGL_MAX_LINES); + } + gg.SetRanges(x1,x2); gg.Pop(); setlocale(LC_NUMERIC, ""); + + } + gr->Zoom(x1,y1,x2,y2); gr->View(phi,0,tet); gr->Perspective(per); + } mglConvertFromGraph(pic, gr, &grBuf); if(pic.size()!=size()) setSize(pic.width(), pic.height()); repaint(); @@ -230,20 +305,23 @@ void QMathGL::mousePressEvent(QMouseEvent *ev) mglPoint p = gr->CalcXYZ(ev->x(), ev->y()); mglCanvasWnd *g=dynamic_cast(gr); if(g) g->LastMousePos = p; - mousePos.sprintf("x=%g, y=%g, z=%g",p.x,p.y,p.z); - repaint(); - if(g && g->ClickFunc) g->ClickFunc(draw_par); emit mouseClick(p.x,p.y,p.z); + int id = gr->GetObjId(ev->x(),ev->y()); + if(idCalcXYZ(ev->x(), ev->y(), true); + if(mgl_isnan(p.x)) mousePos = ""; + else mousePos.sprintf("x=%g, y=%g, z=%g",p.x,p.y,p.z); emit posChanged(mousePos); - emit objChanged(gr->GetObjId(ev->x(),ev->y())-1); + repaint(); } xe=x0=ev->x(); ye=y0=ev->y(); ev->accept(); } //----------------------------------------------------------------------------- void QMathGL::mouseReleaseEvent(QMouseEvent *ev) { - if(ev->button()&Qt::LeftButton) + if(ev->button()&Qt::LeftButton && enableMouse) { if(zoom) { @@ -265,6 +343,7 @@ void QMathGL::mouseReleaseEvent(QMouseEvent *ev) //----------------------------------------------------------------------------- void QMathGL::mouseMoveEvent(QMouseEvent *ev) { + if(!enableMouse) { ev->ignore(); return; } xe=ev->x(); ye=ev->y(); if(rotate) { @@ -298,10 +377,163 @@ void QMathGL::mouseMoveEvent(QMouseEvent *ev) x0 = xe; y0 = ye; refresh(); } - if(zoom) refresh(); + else if(zoom) refresh(); + else if(ev->buttons()&Qt::MidButton) // shift axis + { + mreal ff = 1./sqrt(mreal(width()*height())); + mreal dx = (x0-xe)*ff*(ax2-ax1), dy = (y0-ye)*ff*(ay2-ay1); + ax1 += dx; ax2 += dx; ay1 -= dy; ay2 -= dy; + gr->ZoomAxis(mglPoint(ax1,ay1),mglPoint(ax2,ay2)); + update(); x0 = xe; y0 = ye; + } + else if(ev->buttons()&Qt::LeftButton) // move primitives + { + long h=pic.height(), w=pic.width(), d=(h>w?w:h)/100; + long pos = mgl_is_active(gr,x0,y0,d); + long id = long(gr->GetObjId(x0,y0))-MGL_MAX_LINES; + if(grid && pos>=0) // this active point + { + const mglActivePos &p = gr->Act[pos]; + id = long(p.id)-MGL_MAX_LINES; + if(id>=0) // this is our primitive + { + // try "attract" mouse + register size_t i; + register int tt; + for(i=0;i<=10;i++) + { + tt = i*(w/10); if(abs(xe-tt)<2*d) xe = tt; + tt = i*(h/10); if(abs(ye-tt)<2*d) ye = tt; + } + for(i=0;iAct.size();i++) + { + const mglActivePos &q = gr->Act[i]; + if(abs(xe-q.x)<2*d && abs(ye-q.y)<2*d) { xe=q.x; ye=q.y; } + } + // now move point + QString tst = primitives.section('\n',id,id), cmd=tst.section(' ',0,0), res; + float dx = 2*(xe-x0)/float(w), dy = 2*(y0-ye)/float(h); + float xx=tst.section(' ',1,1).toFloat(), yy=tst.section(' ',2,2).toFloat(); + if(p.n==0) + res = cmd+" "+QString::number(xx+dx)+" "+QString::number(yy+dy)+" "+tst.section(' ',3); + else if(cmd=="rect") + { + float x_=tst.section(' ',3,3).toFloat(), y_=tst.section(' ',4,4).toFloat(); + if(p.n==1) { xx+=dx; y_+=dy; } + if(p.n==2) { x_+=dx; yy+=dy; } + if(p.n==3) { x_+=dx; y_+=dy; } + res = "rect "+QString::number(xx)+" "+QString::number(yy)+" "+ + QString::number(x_)+" "+QString::number(y_)+" "+tst.section(' ',5); + } + // TODO parse circle if I'll add it + else if(p.n==1) + { + xx=tst.section(' ',3,3).toFloat(); yy=tst.section(' ',4,4).toFloat(); + res = tst.section(' ',0,2)+" "+QString::number(xx+dx)+" "+QString::number(yy+dy)+" "+tst.section(' ',5); + } + else if(cmd=="rhomb" || cmd=="ellipse") + { + float x_=tst.section(' ',3,3).toFloat()-xx, y_=tst.section(' ',4,4).toFloat()-yy, dr=0; + if(x_*x_+y_*y_>0) + { + dr = (dx*x_+dy*y_)/(x_*x_+y_*y_); + dr = hypot(dx-dr*x_,dy-dr*y_); + } + else dr = hypot(dx,dy); + res = tst.section(' ',0,4)+" "+QString::number(tst.section(' ',5,5).toFloat()+dr)+" "+tst.section(' ',6); + } + else if(p.n==2) + { + xx=tst.section(' ',5,5).toFloat(); yy=tst.section(' ',6,6).toFloat(); + res = tst.section(' ',0,4)+" "+QString::number(xx+dx)+" "+QString::number(yy+dy)+" "+tst.section(' ',7); + } + else if(p.n==3) + { + xx=tst.section(' ',7,7).toFloat(); yy=tst.section(' ',8,8).toFloat(); + if(cmd=="curve") { dx*=-1; dy*=-1; } + res = tst.section(' ',0,6)+" "+QString::number(xx+dx)+" "+QString::number(yy+dy)+" "+tst.section(' ',9); + } + if(id>0) res = primitives.section('\n',0,id-1) + "\n" + res; + primitives = res + "\n" + primitives.section('\n',id+1); + refresh(); x0 = xe; y0 = ye; + } + } + else if(id>=0) // this is primitive + { + QString tst = primitives.section('\n',id,id), cmd=tst.section(' ',0,0), res; + float dx = 2*(xe-x0)/float(w), dy = 2*(y0-ye)/float(h); + float x1=tst.section(' ',1,1).toFloat(), y1=tst.section(' ',2,2).toFloat(),x2,y2; + if(cmd=="ball" || cmd=="text") + res = cmd+" "+QString::number(x1+dx)+" "+QString::number(y1+dy)+" "+tst.section(' ',3); + else if(cmd=="curve") + { + x2=tst.section(' ',5,5).toFloat(); y2=tst.section(' ',6,6).toFloat(); + res = cmd+" "+QString::number(x1+dx)+" "+QString::number(y1+dy)+" "+tst.section(' ',3,4)+ + " "+QString::number(x2+dx)+" "+QString::number(y2+dy)+" "+tst.section(' ',7); + } + else + { + x2=tst.section(' ',3,3).toFloat(); y2=tst.section(' ',4,4).toFloat(); + res = cmd+" "+QString::number(x1+dx)+" "+QString::number(y1+dy)+" "+ + QString::number(x2+dx)+" "+QString::number(y2+dy)+" "+tst.section(' ',5); + } + if(id>0) res = primitives.section('\n',0,id-1) + "\n" + res; + primitives = res + "\n" + primitives.section('\n',id+1); + refresh(); x0 = xe; y0 = ye; + } + } ev->accept(); } //----------------------------------------------------------------------------- +void QMathGL::mouseDoubleClickEvent(QMouseEvent *ev) +{ + long h=pic.height(), w=pic.width(), d=(h>w?w:h)/100; + long pos = mgl_is_active(gr,x0,y0,d); + long id = long(gr->GetObjId(x0,y0)); + if(grid && pos>=0) // this active point -> delete primitive + { + const mglActivePos &p = gr->Act[pos]; + id = long(p.id)-MGL_MAX_LINES; + QString res; + if(id>0) res = primitives.section('\n',0,id-1) + "\n"; + if(id>=0) primitives = res + primitives.section('\n',id+1); + refresh(); x0 = xe; y0 = ye; + } + else if(id>=MGL_MAX_LINES) // option for primitives + emit askStyle(id-MGL_MAX_LINES); + else emit doubleClick(id); + ev->accept(); +} +//----------------------------------------------------------------------------- +void QMathGL::setStyle(int id, QString stl) +{ + QString tst = primitives.section('\n',id,id), res; + res = tst.section(' ',0,-2) + " " + stl; + if(id>0) res = primitives.section('\n',0,id-1) + "\n" + res; + primitives = res + "\n" + primitives.section('\n',id+1); + refresh(); x0 = xe; y0 = ye; +} +//----------------------------------------------------------------------------- +void QMathGL::wheelEvent(QWheelEvent *ev) +{ + if(!enableWheel) { ev->ignore(); return; } + if(rotate) // zoom + { + mreal d,c,f=exp(0.001*ev->delta())/2; + d = (y2-y1)*f; c = (y2+y1)/2; y1 = c-d; y2 = c+d; + d = (x2-x1)*f; c = (x2+x1)/2; x1 = c-d; x2 = c+d; + refresh(); ev->accept(); + } + else // zoom axis + { + mreal d,c,f=exp(0.001*ev->delta())/2; + d = (ay2-ay1)*f; c = (ay2+ay1)/2; ay1 = c-d; ay2 = c+d; + d = (ax2-ax1)*f; c = (ax2+ax1)/2; ax1 = c-d; ax2 = c+d; + gr->ZoomAxis(mglPoint(ax1,ay1),mglPoint(ax2,ay2)); + update(); ev->accept(); + } +} +//----------------------------------------------------------------------------- void QMathGL::imgSize(int w, int h) { if(w>0 && h>0) { gr->SetSize(w,h); update(); } } //----------------------------------------------------------------------------- @@ -316,28 +548,28 @@ void QMathGL::exportGIF(QString fname) { if(fname.isEmpty()) fname = gr->PlotId.c_str(); if(fname.isEmpty()) QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0); - else mgl_write_gif(gr,setExtension(fname,"png").toAscii(), appName.toAscii()); + else mgl_write_gif(gr,setExtension(fname,"png").toAscii().constData(), appName.toAscii().constData()); } //----------------------------------------------------------------------------- void QMathGL::exportPNG(QString fname) { if(fname.isEmpty()) fname = gr->PlotId.c_str(); if(fname.isEmpty()) QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0); - else mgl_write_png(gr,setExtension(fname,"png").toAscii(), appName.toAscii()); + else mgl_write_png(gr,setExtension(fname,"png").toAscii().constData(), appName.toAscii().constData()); } //----------------------------------------------------------------------------- void QMathGL::exportPNGs(QString fname) { if(fname.isEmpty()) fname = gr->PlotId.c_str(); if(fname.isEmpty()) QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0); - else mgl_write_png_solid(gr,setExtension(fname,"png").toAscii(), appName.toAscii()); + else mgl_write_png_solid(gr,setExtension(fname,"png").toAscii().constData(), appName.toAscii().constData()); } //----------------------------------------------------------------------------- void QMathGL::exportJPG(QString fname) { if(fname.isEmpty()) fname = gr->PlotId.c_str(); if(fname.isEmpty()) QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0); - else mgl_write_jpg(gr,setExtension(fname,"jpg").toAscii(), appName.toAscii()); + else mgl_write_jpg(gr,setExtension(fname,"jpg").toAscii().constData(), appName.toAscii().constData()); } //----------------------------------------------------------------------------- void QMathGL::exportBPS(QString fname) @@ -347,7 +579,7 @@ void QMathGL::exportBPS(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_bps(gr,setExtension(fname,"eps").toAscii(), appName.toAscii()); + mgl_write_bps(gr,setExtension(fname,"eps").toAscii().constData(), appName.toAscii().constData()); setlocale(LC_NUMERIC, ""); } } @@ -359,7 +591,7 @@ void QMathGL::exportEPS(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_eps(gr,setExtension(fname,"eps").toAscii(), appName.toAscii()); + mgl_write_eps(gr,setExtension(fname,"eps").toAscii().constData(), appName.toAscii().constData()); setlocale(LC_NUMERIC, ""); } } @@ -371,7 +603,7 @@ void QMathGL::exportSVG(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_svg(gr,setExtension(fname,"svg").toAscii(), appName.toAscii()); + mgl_write_svg(gr,setExtension(fname,"svg").toAscii().constData(), appName.toAscii().constData()); setlocale(LC_NUMERIC, ""); } } @@ -383,7 +615,7 @@ void QMathGL::exportXYZ(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_xyz(gr,setExtension(fname,"xyz").toAscii(), appName.toAscii()); + mgl_write_xyz(gr,setExtension(fname,"xyz").toAscii().constData(), appName.toAscii().constData()); setlocale(LC_NUMERIC, ""); } } @@ -395,7 +627,7 @@ void QMathGL::exportTEX(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_tex(gr,setExtension(fname,"tex").toAscii(), appName.toAscii()); + mgl_write_tex(gr,setExtension(fname,"tex").toAscii().constData(), appName.toAscii().constData()); setlocale(LC_NUMERIC, ""); } } @@ -407,7 +639,7 @@ void QMathGL::exportOFF(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_off(gr,setExtension(fname,"off").toAscii(), appName.toAscii(),0); + mgl_write_off(gr,setExtension(fname,"off").toAscii().constData(), appName.toAscii().constData(),0); setlocale(LC_NUMERIC, ""); } } @@ -419,7 +651,7 @@ void QMathGL::exportOBJ(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_obj(gr,setExtension(fname,"obj").toAscii(), appName.toAscii(),0); + mgl_write_obj(gr,setExtension(fname,"obj").toAscii().constData(), appName.toAscii().constData(),1); setlocale(LC_NUMERIC, ""); } } @@ -431,7 +663,7 @@ void QMathGL::exportSTL(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_stl(gr,setExtension(fname,"stl").toAscii(), appName.toAscii()); + mgl_write_stl(gr,setExtension(fname,"stl").toAscii().constData(), appName.toAscii().constData()); setlocale(LC_NUMERIC, ""); } } @@ -443,7 +675,7 @@ void QMathGL::exportSTL(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_x3d(gr,setExtension(fname,"x3d").toAscii(), appName.toAscii()); + mgl_write_x3d(gr,setExtension(fname,"x3d").toAscii().constData(), appName.toAscii().constData()); setlocale(LC_NUMERIC, ""); } }*/ @@ -455,7 +687,7 @@ void QMathGL::exportTGA(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_tga(gr,setExtension(fname,"tga").toAscii(), appName.toAscii()); + mgl_write_tga(gr,setExtension(fname,"tga").toAscii().constData(), appName.toAscii().constData()); setlocale(LC_NUMERIC, ""); } } @@ -467,7 +699,19 @@ void QMathGL::exportPRC(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_prc(gr,setExtension(fname,"prc").toAscii(), appName.toAscii(),1); + mgl_write_prc(gr,setExtension(fname,"prc").toAscii().constData(), appName.toAscii().constData(),1); + setlocale(LC_NUMERIC, ""); + } +} +//----------------------------------------------------------------------------- +void QMathGL::exportMGLD(QString fname) +{ + if(fname.isEmpty()) fname = gr->PlotId.c_str(); + if(fname.isEmpty()) QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0); + else + { + setlocale(LC_NUMERIC, "C"); + mgl_export_mgld(gr,setExtension(fname,"mgld").toAscii().constData(), appName.toAscii().constData()); setlocale(LC_NUMERIC, ""); } } @@ -497,8 +741,8 @@ void QMathGL::copyClickCoor() { QApplication::clipboard()->setText(mousePos); } //----------------------------------------------------------------------------- void QMathGL::setMGLFont(QString path) -{ if(path.isEmpty()) gr->GetFont()->Restore(); - else gr->GetFont()->Load(path.toAscii()); } +{ if(path.isEmpty()) gr->RestoreFont(); + else gr->LoadFont(path.toAscii().constData()); } //----------------------------------------------------------------------------- void QMathGL::setSize(int w, int h) { @@ -560,6 +804,32 @@ void QMathGL::adjust() update(); } //----------------------------------------------------------------------------- +void QMathGL::addMark() +{ primitives += "ball 0 0 'r*'\n"; refresh(); } +//----------------------------------------------------------------------------- +void QMathGL::addLine() +{ primitives += "line -0.2 0 0.2 0 'r2'\n"; refresh(); } +//----------------------------------------------------------------------------- +void QMathGL::addRect() +{ primitives += "rect -0.2 -0.2 0.2 0.2 'r'\n"; refresh(); } +//----------------------------------------------------------------------------- +void QMathGL::addCurve() +{ primitives += "curve -0.2 0 0 0.5 0.2 0 0 0.5 'r2'\n"; refresh(); } +//----------------------------------------------------------------------------- +void QMathGL::addRhomb() +{ primitives += "rhomb -0.2 0 0.2 0 0.1 'r'\n"; refresh(); } +//----------------------------------------------------------------------------- +void QMathGL::addEllipse() +{ primitives += "ellipse -0.2 0 0.2 0 0.1 'r'\n"; refresh(); } +//----------------------------------------------------------------------------- +void QMathGL::addText(QString txt) +{ + if(txt.isEmpty()) + txt = QInputDialog::getText(QApplication::activeWindow(), "MathGL", tr("Enter text")); + if(!txt.isEmpty()) + { primitives += "text 0 0 '"+txt+"' ''\n"; refresh(); } +} +//----------------------------------------------------------------------------- // // class mglCanvasQT // @@ -581,7 +851,7 @@ void mglCanvasQT::ToggleAlpha() { QMGL->setAlpha(!QMGL->getAlpha()); } //----------------------------------------------------------------------------- void mglCanvasQT::ToggleLight() { QMGL->setLight(!QMGL->getLight()); } //----------------------------------------------------------------------------- -void mglCanvasQT::ToggleNo() { QMGL->restore(); } +void mglCanvasQT::ToggleNo() { QMGL->restore(); } //----------------------------------------------------------------------------- void mglCanvasQT::ToggleZoom() { QMGL->setZoom(!QMGL->getZoom()); } //----------------------------------------------------------------------------- @@ -639,8 +909,33 @@ void mglCanvasQT::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p else Wnd->showMaximized(); } //----------------------------------------------------------------------------- +#include "xpm/fileprint.xpm" +#include "xpm/copy.xpm" +#include "xpm/left_1.xpm" +#include "xpm/right_1.xpm" +#include "xpm/down_1.xpm" +#include "xpm/norm_1.xpm" +#include "xpm/zoom_1.xpm" +#include "xpm/up_1.xpm" +#include "xpm/alpha.xpm" +#include "xpm/light.xpm" +#include "xpm/zoom_in.xpm" +#include "xpm/zoom_out.xpm" +#include "xpm/rotate.xpm" +#include "xpm/ok.xpm" +#include "xpm/show_sl.xpm" +#include "xpm/next_sl.xpm" +#include "xpm/prev_sl.xpm" +#include "xpm/text.xpm" +#include "xpm/line.xpm" +#include "xpm/curve.xpm" +#include "xpm/mark_o.xpm" +#include "xpm/mark_s.xpm" +#include "xpm/mark_a.xpm" +#include "xpm/mark_d.xpm" +//----------------------------------------------------------------------------- #define TR QObject::tr -QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *tet, QSpinBox *phi) +QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *&tet, QSpinBox *&phi) { QAction *a; QMenu *o, *oo; @@ -657,14 +952,15 @@ QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *tet, QSpinBox *phi oo->addAction(TR("bitmap EPS"), QMGL, SLOT(exportBPS())); oo->addAction(TR("vector EPS"), QMGL, SLOT(exportEPS()),Qt::ALT+Qt::Key_E); oo->addAction(TR("SVG"), QMGL, SLOT(exportSVG()),Qt::ALT+Qt::Key_S); - oo->addAction(TR("LaTeX"), QMGL, SLOT(exportTEX())); + oo->addAction(TR("LaTeX"), QMGL, SLOT(exportTEX()),Qt::ALT+Qt::Key_L); o->addMenu(oo); popup->addMenu(oo); oo = new QMenu(TR("&Export as 3D ..."),Wnd); -// oo->addAction(TR("X3D"), QMGL, SLOT(exportX3D())); - oo->addAction(TR("XYZ"), QMGL, SLOT(exportXYZ())); - oo->addAction(TR("OBJ"), QMGL, SLOT(exportOBJ())); + oo->addAction(TR("MGLD"), QMGL, SLOT(exportMGLD()),Qt::ALT+Qt::Key_M); + oo->addAction(TR("PRC"), QMGL, SLOT(exportPRC()),Qt::ALT+Qt::Key_D); + oo->addAction(TR("OBJ"), QMGL, SLOT(exportOBJ()),Qt::ALT+Qt::Key_O); oo->addAction(TR("STL"), QMGL, SLOT(exportSTL())); -// oo->addAction(TR("IDTF"), QMGL, SLOT(exportIDTF())); + oo->addAction(TR("XYZ"), QMGL, SLOT(exportXYZ())); +// oo->addAction(TR("X3D"), QMGL, SLOT(exportX3D()),Qt::ALT+Qt::Key_X); o->addMenu(oo); popup->addMenu(oo); o->addSeparator(); @@ -722,9 +1018,49 @@ QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *tet, QSpinBox *phi a->setShortcut(Qt::Key_F6); o->addAction(a); a = new QAction(QPixmap(copy_xpm), TR("&Copy plot"), Wnd); Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(copy())); - a->setToolTip(TR("Copy graphics to clipboard (CTRl+C).")); - a->setShortcut(Qt::CTRL+Qt::Key_C); + a->setToolTip(TR("Copy graphics to clipboard (CTRl+Shift+G).")); + a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_G); o->addAction(a); bb->addAction(a); popup->addAction(a); + + bb->addSeparator(); + oo = new QMenu(TR("Primitives ..."),Wnd); + a = new QAction(QPixmap(line_xpm), TR("Add line"), Wnd); + Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addLine())); + Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(TR("Add line which properties can be changed later by mouse.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(curve_xpm), TR("Add curve"), Wnd); + Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addCurve())); + Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(TR("Add curve which properties can be changed later by mouse.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(mark_s_xpm), TR("Add rect"), Wnd); + Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addRect())); + Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(TR("Add rectangle which properties can be changed later by mouse.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(mark_d_xpm), TR("Add rhombus"), Wnd); + Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addRhomb())); + Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(TR("Add rhombus which properties can be changed later by mouse.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(mark_o_xpm), TR("Add ellipse"), Wnd); + Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addEllipse())); + Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(TR("Add ellipse which properties can be changed later by mouse.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(mark_a_xpm), TR("Add mark"), Wnd); + Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addMark())); + Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(TR("Add marker which properties can be changed later by mouse.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(text_xpm), TR("Add text"), Wnd); + Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(addText())); + Wnd->connect(QMGL, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); + a->setToolTip(TR("Add text which properties can be changed later by mouse.")); + bb->addAction(a); oo->addAction(a); + o->addMenu(oo); + bb->addSeparator(); tet = new QSpinBox(Wnd); tet->setWrapping(true); bb->addWidget(tet); tet->setRange(-180, 180); tet->setSingleStep(10); @@ -777,7 +1113,7 @@ QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *tet, QSpinBox *phi a = new QAction(QPixmap(next_sl_xpm), TR("&Next slide"), Wnd); Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(nextSlide())); a->setToolTip(TR("Show next slide (Alt+Right).")); - a->setShortcut(Qt::ALT+Qt::Key_Right); o->addAction(a); bb->addAction(a); + a->setShortcut(Qt::CTRL+Qt::Key_Period); o->addAction(a); bb->addAction(a); a = new QAction(QPixmap(show_sl_xpm), TR("&Slideshow"), Wnd); a->setCheckable(true); Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(animation(bool))); @@ -786,7 +1122,7 @@ QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *tet, QSpinBox *phi a = new QAction(QPixmap(prev_sl_xpm), TR("&Prev slide"), Wnd); Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(prevSlide())); a->setToolTip(TR("Show previous slide (Alt+Left).")); - a->setShortcut(Qt::ALT+Qt::Key_Left); o->addAction(a); bb->addAction(a); + a->setShortcut(Qt::CTRL+Qt::Key_Comma); o->addAction(a); bb->addAction(a); } Wnd->menuBar()->addSeparator(); @@ -804,3 +1140,11 @@ HMGL mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *title, void } int mgl_qt_run() { return (qApp)?qApp->exec():-1; } //----------------------------------------------------------------------------- +uintptr_t mgl_create_graph_qt_(const char *title, int l) +{ + char *s = new char[l+1]; memcpy(s,title,l); s[l]=0; + uintptr_t t = uintptr_t(mgl_create_graph_qt(0,s,0,0)); + delete []s; return t; +} +int mgl_qt_run_() { return mgl_qt_run(); } +//----------------------------------------------------------------------------- diff --git a/widgets/wx.cpp b/widgets/wx.cpp new file mode 100644 index 0000000..17d3e55 --- /dev/null +++ b/widgets/wx.cpp @@ -0,0 +1,707 @@ +/*************************************************************************** + * wx.cpp is part of Math Graphic Library * + * Copyright (C) 2007-2012 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +//----------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include + +#include "mgl2/canvas_wnd.h" +#include "mgl2/wx.h" +//----------------------------------------------------------------------------- +class mglCanvasWX : public mglCanvasWnd +{ +friend class wxMathGL; +public: + int sshow; ///< Current state of animation switch (toggle button) + wxMathGL *WMGL; ///< Control which draw graphics + wxWindow *Wnd; ///< Pointer to window + + mglCanvasWX(); + virtual ~mglCanvasWX(); + + /// Create a window for plotting. Now implemeted only for GLUT. + void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, + void *par=NULL, void (*reload)(void *p)=NULL, bool maximize=false); + /// Switch on/off transparency (do not overwrite switches in user drawing function) + void ToggleAlpha(); + /// Switch on/off lighting (do not overwrite switches in user drawing function) + void ToggleLight(); + void ToggleRotate(); ///< Switch on/off rotation by mouse + void ToggleZoom(); ///< Switch on/off zooming by mouse + void ToggleNo(); ///< Switch off all zooming and rotation + void Update(); ///< Update picture by calling user drawing function + void Adjust(); ///< Adjust size of bitmap to window size + void GotoFrame(int d); ///< Show arbitrary frame (use relative step) + void Animation(); ///< Run animation (I'm too lasy to change it) + +protected: + wxScrolledWindow *scroll; ///< Scrolling area + wxMenu *popup; ///< Popup menu +// wxSpinCtrl *tet, *phi; ///< Spin box for angles // TODO + + void MakeMenu(); ///< Create menu, toolbar and popup menu +}; +//----------------------------------------------------------------------------- +const wxString ScriptName(L"default"); +enum +{ + TIMER_ID=1000, + LAST_ID +}; +BEGIN_EVENT_TABLE(wxMathGL, wxWindow) + EVT_TIMER (TIMER_ID, wxMathGL::OnNextSlide) + EVT_PAINT (wxMathGL::OnPaint) + EVT_SIZE (wxMathGL::OnSize) + EVT_LEFT_DOWN (wxMathGL::OnMouseLeftDown) + EVT_RIGHT_DOWN (wxMathGL::OnMouseDown) + EVT_MIDDLE_DOWN (wxMathGL::OnMouseDown) + EVT_LEFT_UP (wxMathGL::OnMouseLeftUp) + EVT_RIGHT_UP (wxMathGL::OnMouseRightUp) + EVT_MOTION (wxMathGL::OnMouseMove) +END_EVENT_TABLE() +//----------------------------------------------------------------------------- +// +// class wxMathGL +// +//----------------------------------------------------------------------------- +wxMathGL::wxMathGL(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) : wxWindow(parent,id,pos,size,style,name) +{ + AutoResize = false; draw_par = 0; draw_func = 0; + gr = new mglCanvas; + popup = 0; //!grBuf = 0; + phi = tet = per = 0; + x1 = y1 = 0; x2 = y2 = 1; + alpha = light = zoom = rotate = false; + SetSize(600, 400); + timer = new wxTimer(this,TIMER_ID); +} +//----------------------------------------------------------------------------- +wxMathGL::~wxMathGL() { if(mgl_use_graph(gr,-1)<1) mgl_delete_graph(gr); } +//----------------------------------------------------------------------------- +double wxMathGL::GetRatio() { return double(gr->GetWidth())/gr->GetHeight(); }; +//----------------------------------------------------------------------------- +void wxMathGL::SetGraph(HMGL GR) +{ + mglCanvas *gg = dynamic_cast(GR); + if(!gg) return; + if(mgl_use_graph(gr,-1)<1) mgl_delete_graph(gr); + gr=gg; mgl_use_graph(gg,1); +} +//----------------------------------------------------------------------------- +void wxMathGL::OnPaint(wxPaintEvent& event) +{ + wxPaintDC dc(this); + dc.DrawBitmap(pic,0,0); +// if(zoom) dc.DrawRectangle(x0,y0,xe-x0,ye-y0); + if(gr->get(MGL_SHOW_POS) && !MousePos.IsEmpty()) + dc.DrawText(MousePos,0,12); + // TODO: add grid drawing here (from Qt) + // TODO: add active points drawing here (from Qt) +} +//----------------------------------------------------------------------------- +void wxMathGL::OnSize(wxSizeEvent& event) +{ + wxSize ev = event.GetSize(); + if(gr->GetWidth()==ev.GetWidth() && gr->GetHeight()==ev.GetHeight()) + return; + if(AutoResize && ev.GetWidth()>0 && ev.GetHeight()>0) + { gr->SetSize(ev.GetWidth(), ev.GetHeight()); Update(); } + else SetSize(gr->GetWidth(), gr->GetHeight()); +} +//----------------------------------------------------------------------------- +void wxMathGL::OnNextSlide(wxTimerEvent& evt) { NextSlide(); } +//----------------------------------------------------------------------------- +void wxMathGL::SetPer(int p) +{ if(100*per!=p && p>=0 && p<100) { per = 0.01*p; Repaint(); } } +//----------------------------------------------------------------------------- +void wxMathGL::SetPhi(int p) +{ if(phi!=p) { phi = p; Repaint(); } } +//----------------------------------------------------------------------------- +void wxMathGL::SetTet(int t) +{ if(tet!=t) { tet = t; Repaint(); } } +//----------------------------------------------------------------------------- +void wxMathGL::SetAlpha(bool a) +{ if(alpha!=a) { alpha = a; Update(); } } +//----------------------------------------------------------------------------- +void wxMathGL::SetLight(bool l) +{ if(light!=l) { light = l; Update(); } } +//----------------------------------------------------------------------------- +void wxMathGL::SetZoom(bool z) +{ if(zoom!=z) { zoom=z; rotate=false; Repaint(); } } +//----------------------------------------------------------------------------- +void wxMathGL::SetRotate(bool r) +{ if(rotate!=r) { zoom=false; rotate=r; Repaint(); } } +//----------------------------------------------------------------------------- +void wxMathGL::ShiftDown() +{ mreal d=(y2-y1)/3; y1+=d; y2+=d; Repaint(); } +//----------------------------------------------------------------------------- +void wxMathGL::ShiftUp() +{ mreal d=(y2-y1)/3; y1-=d; y2-=d; Repaint(); } +//----------------------------------------------------------------------------- +void wxMathGL::ShiftRight() +{ mreal d=(x2-x1)/3; x1-=d; x2-=d; Repaint(); } +//----------------------------------------------------------------------------- +void wxMathGL::ShiftLeft() +{ mreal d=(x2-x1)/3; x1+=d; x2+=d; Repaint(); } +//----------------------------------------------------------------------------- +void wxMathGL::Restore() +{ + SetPhi(0); SetTet(0); SetPer(0); + x1=y1=0; x2=y2=1; zoom=rotate=false; + Repaint(); +} +//----------------------------------------------------------------------------- +void wxMathGL::ZoomIn() +{ + mreal d; + d = (y2-y1)/4; y1 += d; y2 -= d; + d = (x2-x1)/4; x1 += d; x2 -= d; + Repaint(); +} +//----------------------------------------------------------------------------- +void wxMathGL::ZoomOut() +{ + mreal d; + d = (y2-y1)/2; y1 -= d; y2 += d; + d = (x2-x1)/2; x1 -= d; x2 += d; + Repaint(); +} +//----------------------------------------------------------------------------- +void wxMathGL::Update() +{ + if(draw_func || draw_cl) + { + if(gr->get(MGL_CLF_ON_UPD)) gr->DefaultPlotParam(); + gr->ResetFrames(); + gr->Alpha(alpha); gr->Light(light); + if(draw_func) draw_func(gr, draw_par); // drawing itself + else if(draw_cl) { mglGraph g(gr); draw_cl->Draw(&g); } + const char *buf = gr->Mess.c_str(); + if(*buf) + { + wxMessageDialog dlg(this, wxString(buf,wxConvLocal), appName, wxOK); + dlg.ShowModal(); + } + } +// if(gr->GetWidth()!=w() || gr->GetHeight()!=h()) +// size(gr->GetWidth(), gr->GetHeight()); + MousePos.Empty(); Repaint(); +} +//----------------------------------------------------------------------------- +void convertFromGraph(wxBitmap &pic, mglCanvas *gr, unsigned char **buf) +{ + const unsigned char *bb = gr->GetBits(); + register long i,w=gr->GetWidth(), h=gr->GetHeight(); + if(*buf) delete [](*buf); + *buf = new unsigned char[4*w*h]; + for(i=0;iZoom(x1,y1,x2,y2); gr->View(phi,0,tet); gr->Perspective(per); + convertFromGraph(pic, gr, &grBuf); + wxSize sz=GetSize(); + if(pic.GetWidth()!=sz.GetWidth() || pic.GetHeight()!=sz.GetHeight()) + SetSize(pic.GetWidth(), pic.GetHeight()); + Refresh(); +} +//----------------------------------------------------------------------------- +void wxMathGL::OnMouseLeftDown(wxMouseEvent &ev) +{ + long x=ev.GetX(), y=ev.GetY(); + if(!zoom && !rotate) + { + mglPoint p = gr->CalcXYZ(x, y); + MousePos.Printf(wxT("x=%g, y=%g, z=%g"),p.x,p.y,p.z); + Refresh(); +// emit mouseClick(p.x,p.y,p.z); + } + xe=x0=x; ye=y0=y; ev.Skip(); +} +//----------------------------------------------------------------------------- +void wxMathGL::OnMouseDown(wxMouseEvent &ev) +{ xe=x0=ev.GetX(); ye=y0=ev.GetY(); ev.Skip(); } +//----------------------------------------------------------------------------- +void wxMathGL::OnMouseLeftUp(wxMouseEvent &ev) +{ + if(zoom) + { + int w1=GetSize().GetWidth(),h1=GetSize().GetHeight(); + mreal _x1,_x2,_y1,_y2; + _x1 = x1+(x2-x1)*(x0-GetPosition().x)/mreal(w1); + _y1 = y2-(y2-y1)*(ye-GetPosition().y)/mreal(h1); + _x2 = x1+(x2-x1)*(xe-GetPosition().x)/mreal(w1); + _y2 = y2-(y2-y1)*(y0-GetPosition().y)/mreal(h1); + x1=_x1; x2=_x2; y1=_y1; y2=_y2; + if(x1>x2) { _x1=x1; x1=x2; x2=_x1; } + if(y1>y2) { _x1=y1; y1=y2; y2=_x1; } + x0 = xe; y0 = ye; + Update(); + } +} +//----------------------------------------------------------------------------- +void wxMathGL::OnMouseRightUp(wxMouseEvent &ev) +{ if(popup && !rotate) PopupMenu(popup, ev.GetPosition()); } +//----------------------------------------------------------------------------- +void wxMathGL::OnMouseMove(wxMouseEvent &ev) +{ + long w=GetSize().GetWidth(), h=GetSize().GetHeight(); + xe=ev.GetX(); ye=ev.GetY(); + if(rotate) + { + if(ev.ButtonDown(wxMOUSE_BTN_LEFT)) // rotate + { + mreal ff = 240/sqrt(mreal(w*h)); + phi += int((x0-xe)*ff); + tet += int((y0-ye)*ff); + if(phi>180) phi-=360; if(phi<-180) phi+=360; + if(tet>180) tet-=360; if(tet<-180) tet+=360; +// Update(); + } + if(ev.ButtonDown(wxMOUSE_BTN_RIGHT)) // zoom and perspective + { + mreal ff = 2.*(y0-ye)/w, gg = 0.5*(xe-x0)/h; + mreal cx = (x1+x2)/2, cy = (y1+y2)/2; + x1 = cx+(x1-cx)*exp(-ff); x2 = cx+(x2-cx)*exp(-ff); + y1 = cy+(y1-cy)*exp(-ff); y2 = cy+(y2-cy)*exp(-ff); + per = per + gg; + if(per<0) per = 0; if(per>=1) per = 0.9999; +// Update(); + } + if(ev.ButtonDown(wxMOUSE_BTN_MIDDLE)) // shift + { + mreal ff = 1./sqrt(mreal(w*h)); + mreal dx = (x0-xe)*ff*(x2-x1), dy = (y0-ye)*ff*(y2-y1); + x1 += dx; x2 += dx; y1 -= dy; y2 -= dy; + } + x0 = xe; y0 = ye; + Update(); + } +// if(zoom) Update(); + if(zoom) Refresh(0); +} +//----------------------------------------------------------------------------- +wxString mglSetExtension(wxString &fname, const char *ext) +{ + wxString oname; + if(fname.Right(4)!=wxChar('.')+wxString(ext,*wxConvCurrent)) + oname = fname+wxChar('.')+wxString(ext,*wxConvCurrent); + return oname; +} +//----------------------------------------------------------------------------- +// NOTE: this is replacement for wxString::char_str() which is for v.2.8 or later +const char *mglw_str(const wxString &str) +{ + static char *buf=0; + if(buf) delete []buf; + long i, n=str.Len(); + buf = new char[n+1]; buf[n]=0; + for(i=0;iOpen()) + { + wxTheClipboard->SetData( new wxBitmapDataObject(pic) ); + wxTheClipboard->Close(); + } +} +//----------------------------------------------------------------------------- +void wxMathGL::SetSize(int w, int h) +{ gr->SetSize(w,h); wxWindow::SetSize(w, h); Update(); }; +//----------------------------------------------------------------------------- +void wxMathGL::Adjust() +{ + wxSize sz=GetSize(); + gr->SetSize(sz.GetWidth(),sz.GetHeight()); + Repaint(); +} +//----------------------------------------------------------------------------- +void wxMathGL::NextSlide() +{ + mglCanvasWnd *g = dynamic_cast(gr); + if(g && g->GetNumFig()>1) g->NextFrame(); +} +//----------------------------------------------------------------------------- +void wxMathGL::PrevSlide() +{ + mglCanvasWnd *g = dynamic_cast(gr); + if(g && g->GetNumFig()>1) g->PrevFrame(); +} +//----------------------------------------------------------------------------- +void wxMathGL::Animation(bool st) +{ + if(st) timer->Start(int(gr->GetDelay()*1000)); + else timer->Stop(); +} +//----------------------------------------------------------------------------- +void wxMathGL::About() +{ + wxString s = wxT("MathGL v. 2.") + wxString::Format(wxT("%g"),MGL_VER2) + + wxT("\n(c) Alexey Balakin, 2007\nhttp://mathgl.sourceforge.net/"); + wxMessageBox(s, wxT("MathGL - about"), wxOK|wxICON_INFORMATION, this); +} +//----------------------------------------------------------------------------- +// +// class mglCanvasWX +// +//----------------------------------------------------------------------------- +#include +#include "xpm/fileprint.xpm" +#include "xpm/copy.xpm" +#include "xpm/left_1.xpm" +#include "xpm/right_1.xpm" +#include "xpm/down_1.xpm" +#include "xpm/norm_1.xpm" +#include "xpm/zoom_1.xpm" +#include "xpm/up_1.xpm" +#include "xpm/alpha.xpm" +#include "xpm/light.xpm" +#include "xpm/zoom_in.xpm" +#include "xpm/zoom_out.xpm" +#include "xpm/rotate.xpm" +#include "xpm/ok.xpm" +#include "xpm/show_sl.xpm" +#include "xpm/next_sl.xpm" +#include "xpm/prev_sl.xpm" +//----------------------------------------------------------------------------- +mglCanvasWX::mglCanvasWX() : mglCanvasWnd() { Wnd = 0; } +//----------------------------------------------------------------------------- +mglCanvasWX::~mglCanvasWX() { if(Wnd) delete Wnd; } +//----------------------------------------------------------------------------- +void mglCanvasWX::ToggleAlpha() { WMGL->SetAlpha(!WMGL->GetAlpha()); } +//----------------------------------------------------------------------------- +void mglCanvasWX::ToggleLight() { WMGL->SetLight(!WMGL->GetLight()); } +//----------------------------------------------------------------------------- +void mglCanvasWX::ToggleNo() { WMGL->Restore(); } +//----------------------------------------------------------------------------- +void mglCanvasWX::ToggleZoom() { WMGL->SetZoom(!WMGL->GetZoom()); } +//----------------------------------------------------------------------------- +void mglCanvasWX::ToggleRotate() { WMGL->SetRotate(!WMGL->GetRotate());} +//----------------------------------------------------------------------------- +void mglCanvasWX::Update() { WMGL->Update(); } +//----------------------------------------------------------------------------- +void mglCanvasWX::Adjust() +{ + wxSize sz = scroll->GetSize(); + SetSize(sz.GetWidth(), sz.GetHeight()); + WMGL->SetSize(sz.GetWidth(), sz.GetHeight()); + Update(); +} +//----------------------------------------------------------------------------- +void mglCanvasWX::GotoFrame(int d) +{ + int f = GetCurFig()+d; + if(f>=GetNumFig()) f = 0; + if(f<0) f = GetNumFig()-1; + if(GetNumFig()>0 && d) { SetCurFig(f); WMGL->Repaint(); } +} +//----------------------------------------------------------------------------- +void mglCanvasWX::Animation() +{ +/* if(anim) + { + bool s = anim->isChecked(); + anim->setChecked(!s); + WMGL->Animation(!s); + }*/ +} +//----------------------------------------------------------------------------- +void mglCanvasWX::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, void *par, void (*reload)(void *p), bool maximize) +{ + SetDrawFunc(draw, par, reload); + popup = 0; + if(Wnd) + { + Wnd->SetLabel(wxString(title,wxConvLibc)); + if(maximize) + { Wnd->SetSize(Wnd->GetMaxSize()); } + else Wnd->Show(); + return; + } + + if(!wxTheApp) { new wxApp; wxTheApp->SetExitOnFrameDelete(true); } + + Wnd = new wxWindow; Wnd->SetSize(650,480); + Wnd->SetLabel(wxString(title,wxConvLibc)); + + scroll = new wxScrolledWindow(Wnd); + WMGL = new wxMathGL(scroll); MakeMenu(); + WMGL->SetPopup(popup); WMGL->SetGraph(this); + WMGL->SetDraw(draw, par); + + WMGL->Update(); + if(maximize) Wnd->SetSize(Wnd->GetMaxSize()); + Wnd->Show(); +} +//----------------------------------------------------------------------------- +void mglCanvasWX::MakeMenu() +{ +/* wxMenuBar *m = new wxMenuBar; + wxMenu *o, *oo; + + o = new wxMenu; m->Append(o, wxT("&File")); + oo= new wxMenu; o->AppendSubMenu(oo,wxT("&Export as ...")); + o->Append(wxID_EXIT, wxT("&Close")); + Wnd->Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(wxWindow::Close)); +*/ +} +/*void mglGraphQT::makeMenu() +{ + QAction *a; + QMenu *o, *oo; + QToolBar *bb; + + popup = new QMenu(Wnd); + // file menu + { + o = Wnd->menuBar()->addMenu(TR("&File")); + oo = new QMenu(TR("&Export as ..."),Wnd); + oo->addAction(TR("PNG"), QMGL, SLOT(exportPNG()),Qt::ALT+Qt::Key_P); + oo->addAction(TR("solid PNG"), QMGL, SLOT(exportPNGs()),Qt::ALT+Qt::Key_F); + oo->addAction(TR("JPEG"), QMGL, SLOT(exportJPG()),Qt::ALT+Qt::Key_J); + oo->addAction(TR("bitmap EPS"), QMGL, SLOT(exportBPS())); + oo->addAction(TR("vector EPS"), QMGL, SLOT(exportEPS()),Qt::ALT+Qt::Key_E); + oo->addAction(TR("SVG"), QMGL, SLOT(exportSVG()),Qt::ALT+Qt::Key_S); + oo->addAction(TR("IDTF"), QMGL, SLOT(exportIDTF())); + o->addMenu(oo); + popup->addMenu(oo); + + o->addSeparator(); + a = new QAction(QPixmap(fileprint), TR("Print &graphics"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(print())); + a->setToolTip(TR("Open printer dialog and print graphics\t(CTRl+P)")); + a->setShortcut(Qt::CTRL+Qt::Key_P); o->addAction(a); + o->addSeparator(); + o->addAction(TR("&Close"), Wnd, SLOT(close()), Qt::CTRL+Qt::Key_W); + } + // graphics menu + { + bb = new QToolBar(TR("Graphics"),Wnd); + Wnd->addToolBar(Qt::TopToolBarArea, bb); + o = Wnd->menuBar()->addMenu(TR("&Graphics")); + a = new QAction(QPixmap(alpha_xpm), TR("&Alpha"), Wnd); + a->setShortcut(Qt::ALT+Qt::Key_T); a->setCheckable(true); + Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(setAlpha(bool))); + Wnd->connect(QMGL, SIGNAL(alphaChanged(bool)), a, SLOT(setOn(bool))); + a->setToolTip(TR("Switch on/off TRansparency for the graphics (Alt+T).")); + o->addAction(a); bb->addAction(a); + a = new QAction(QPixmap(light_xpm), TR("&Light"), Wnd); + a->setShortcut(Qt::ALT+Qt::Key_L); a->setCheckable(true); + Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(setLight(bool))); + Wnd->connect(QMGL, SIGNAL(lightChanged(bool)), a, SLOT(setOn(bool))); + a->setToolTip(TR("Switch on/off lightning for the graphics (Alt+L).")); + o->addAction(a); bb->addAction(a); + a = new QAction(QPixmap(rotate_xpm), TR("&Rotate by mouse"), Wnd); + a->setCheckable(true); + Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(setRotate(bool))); + Wnd->connect(QMGL, SIGNAL(rotateChanged(bool)), a, SLOT(setOn(bool))); + a->setToolTip(TR("Switch on/off mouse handling of the graphics\n(rotation, shifting, zooming and perspective).")); + bb->addAction(a); + a = new QAction(QPixmap(zoom_in_xpm), TR("&Zoom by mouse"), Wnd); + a->setCheckable(true); + Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(setZoom(bool))); + Wnd->connect(QMGL, SIGNAL(zoomChanged(bool)), a, SLOT(setOn(bool))); + a->setToolTip(TR("Switch on/off mouse zoom of selected region.")); + bb->addAction(a); + o->addSeparator(); + a = new QAction(QPixmap(zoom_out_xpm), TR("Res&tore"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(restore())); + a->setToolTip(TR("Restore default graphics rotation, zoom and perspective (Alt+Space).")); + a->setShortcut(Qt::ALT+Qt::Key_Space); + o->addAction(a); bb->addAction(a); popup->addAction(a); + bb->addSeparator(); + a = new QAction(QPixmap(ok_xpm), TR("Re&draw"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(update())); + a->setToolTip(TR("Execute script and redraw graphics (F5).")); + a->setShortcut(Qt::Key_F5); + o->addAction(a); bb->addAction(a); popup->addAction(a); + a = new QAction(TR("&Adjust size"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(adjust())); + a->setToolTip(TR("Change canvas size to fill whole region (F6).")); + a->setShortcut(Qt::Key_F6); o->addAction(a); + a = new QAction(QPixmap(copy_xpm), TR("&Copy plot"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(copy())); + a->setToolTip(TR("Copy graphics to clipboard (CTRl+C).")); + a->setShortcut(Qt::CTRL+Qt::Key_C); + o->addAction(a); bb->addAction(a); popup->addAction(a); + bb->addSeparator(); + tet = new QSpinBox(Wnd); tet->setWrapping(true); + bb->addWidget(tet); tet->setRange(-180, 180); tet->setSingleStep(10); + Wnd->connect(tet, SIGNAL(valueChanged(int)), QMGL, SLOT(setTet(int))); + Wnd->connect(QMGL, SIGNAL(tetChanged(int)), tet, SLOT(setValue(int))); + tet->setToolTip(TR("Set value of \\theta angle.")); + bb->addSeparator(); + phi = new QSpinBox(Wnd); phi->setWrapping(true); + bb->addWidget(phi); phi->setRange(-180, 180); phi->setSingleStep(10); + Wnd->connect(phi, SIGNAL(valueChanged(int)), QMGL, SLOT(setPhi(int))); + Wnd->connect(QMGL, SIGNAL(phiChanged(int)), phi, SLOT(setValue(int))); + phi->setToolTip(TR("Set value of \\phi angle.")); +// bb->addSeparator(); + } + // zooming menu + { + oo = o->addMenu(TR("Zoom/move")); + bb = new QToolBar(TR("Zoom graphics"),Wnd); + Wnd->addToolBar(Qt::LeftToolBarArea, bb); + a = new QAction(QPixmap(left_1_xpm), TR("Move &left"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(shiftLeft())); + a->setToolTip(TR("Move graphics left by 1/3 of its width.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(up_1_xpm), TR("Move &up"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(shiftUp())); + a->setToolTip(TR("Move graphics up by 1/3 of its height.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(zoom_1_xpm), TR("Zoom &in"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(zoomIn())); + a->setToolTip(TR("Zoom in graphics.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(norm_1_xpm), TR("Zoom &out"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(zoomOut())); + a->setToolTip(TR("Zoom out graphics.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(down_1_xpm), TR("Move &down"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(shiftDown())); + a->setToolTip(TR("Move graphics up down 1/3 of its height.")); + bb->addAction(a); oo->addAction(a); + a = new QAction(QPixmap(right_1_xpm), TR("Move &right"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(shiftRight())); + a->setToolTip(TR("Move graphics right by 1/3 of its width.")); + bb->addAction(a); oo->addAction(a); + } + // animation menu + { + o = Wnd->menuBar()->addMenu(TR("&Animation")); + bb = new QToolBar(TR("Animation"),Wnd); + Wnd->addToolBar(Qt::LeftToolBarArea, bb); + a = new QAction(QPixmap(next_sl_xpm), TR("&Next slide"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(nextSlide())); + a->setToolTip(TR("Show next slide (Alt+Right).")); + a->setShortcut(Qt::ALT+Qt::Key_Right); o->addAction(a); bb->addAction(a); + a = new QAction(QPixmap(show_sl_xpm), TR("&Slideshow"), Wnd); + a->setCheckable(true); anim = a; + Wnd->connect(a, SIGNAL(toggled(bool)), QMGL, SLOT(animation(bool))); + a->setToolTip(TR("Run slideshow (CTRl+F5).")); + a->setShortcut(Qt::CTRL+Qt::Key_F5); o->addAction(a); bb->addAction(a); + a = new QAction(QPixmap(prev_sl_xpm), TR("&Prev slide"), Wnd); + Wnd->connect(a, SIGNAL(activated()), QMGL, SLOT(prevSlide())); + a->setToolTip(TR("Show previous slide (Alt+Left).")); + a->setShortcut(Qt::ALT+Qt::Key_Left); o->addAction(a); bb->addAction(a); + } + + Wnd->menuBar()->addSeparator(); + o = Wnd->menuBar()->addMenu(TR("&Help")); + o->addAction(TR("About"), QMGL, SLOT(about())); + o->addAction(TR("About &Qt"), QMGL, SLOT(aboutQt())); +}*/ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +HMGL mgl_create_graph_wx(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)) +{ + mglCanvasWX *g = new mglCanvasWX; + g->Window(0,0,draw,title,par,load); + return g; +} +int mgl_wx_run(){ return wxTheApp ? wxTheApp->MainLoop():0; } +//----------------------------------------------------------------------------- +uintptr_t mgl_create_graph_wx_(const char *title, int l) +{ + char *s = new char[l+1]; memcpy(s,title,l); s[l]=0; + uintptr_t t = uintptr_t(mgl_create_graph_wx(0,s,0,0)); + delete []s; return t; +} +int mgl_wx_run_() { return mgl_wx_run(); } +//----------------------------------------------------------------------------- -- 2.30.2
  • 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 IY5e;C0(=}FcmMzZ literal 32909 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 nW;Eo8g(lIQF*7#Yke(<~WLnyy z5Tk#Wz-*@Tb2ulIusO%Cf)dD}&x z)Cy=iS8d5FE9iN)_bZ;3m6i3;@89hKpv_*2tc#2`8ZqCDuI%Ktli?oL01AvmUJ(-$ z)Ae8h0Kk9#mssEX;sb2mfcD;@p#v^vDk?+>WGo;+eSLko+eiUqw6xNcFY4>-KOhQR z@3B66_6#N4{q*CVe|L9x7!IR~s;Z`@rl*@*IEf%Ah(YnJsIbsxq3(ma`u6YN7{tT} z>+8lIwEXU;r(No~7Da>u%&wlZXQ%eXmM~O-o5hNkQ=zl=nn{voLUQ_z@8?xKQu7 zy0W66ps+ERDlW_T=FOM>b;Vqn%scQ0`6VS0p`rQ}Y7+n^?DN{1QIH53c39&eZ6Uxd zjEx0hP;W&$Gb^uq7sATl`ks}`#P zsC7iRk5V~f+fI)jJ-WX;Z{6S9%ZC%ZyD-$!`l?b?T~+nH`vQkv!U2`moisauzJ^Suu!G#!{q-&j303 z1_tD?o0i<%SCE~v^J0s4BN**l&G{a8_pP3Xn7C6?gNh3<>e<;@OlmmUqE1j_A5WL-h~|l>}e7KnPyM08HjjY+&n#fLD2HUQ@~7GS?%53Udv|) zSQlotwA|fXp7bX&f}$)@x?V?JrMmX8ok`Hkh2ddaP@sicK7FCpw^f32?xDhK=9bcN zUWO0Ad(^74`%~6>=dm|a0sj~cq}C`YDG_oze5WqiUu{ad=Xzkm1EztH9zK_x{6ihv z4<9~27gDr~+fsV^dNo56>gh;_L`FRIgTU*0mFz`cS zVqyegyZVJh9gn__j*j{HRGPnooXb!f?_tyG=H}yv)doS};Kx_P0IR`qL#EJjP><;b z%;I56N9x{kYld8&?Oavp&gRMAziJIm+p4C6`eYfM55b2nq^By8<;sq= zCAl+Jq-BO|8mPT_CXARQVC$7J1dy7YD{JIZFUAwD(r8bFHha&Zl$^LrkxbUE>)HS{+AhZ?5TFDd4|JaWp1wi!$=a4geW;4yTwak3?O=ig@p;xdXyw}bciFw zvJ-y21!=2D0i#E8@{pOi`6b{a)Uqk3dzHf}uKB;I0xl5qJCaBSwzfc?myK@N#yy&j`4lzpIz5MZQ0r?NTRU-|Q=-Jk*p zw#?~WSwtXaWTF~!7!Wc&p2`9xLWW2_D!KtB6RgNIJ^bcBp5zX#wmFAaT!S3>}*i23l+M%y92@k zaKB&u{e~>bfYB`0JLYLIELWLhI$Qj%ciaS%3X~9|R~DdYD~J^e#iRypC1d!!F8+>Y zi;G7Q%fhz6zN~3zxC+A2DX*yL11zJr7if(@KLDhDey})Qs!bso)A@(*_H=yXe+$g_ z7S&f5N2{P<4H(Mz(lhpgvNA!}144*Sv!-~J3KigWudlBU^PdxjbmFm^3|yXU0@0?U z2x_ks0a+cFoD8tQ7Z(=50HL;?p3Rl6Fd(Ozye=K=?T-L6#mC173akWWmW}7}$OJ$u zxtu6aoSd9QMMW(wEd`;OZ>b)U%1kStN=Zug0Ywcg6V;0+@i#$%filS~Ipfv_ph^Q^ z&0xtshlPPUpNaix+>RT&Wvw%*oKISY#&pk{O%u>dC2?0bI)N{3Zz z$i}RJSy}cv83ZWb#{jT91f8U&vXXUqPGG42t>C}B>$}4CxV)e>8~*C*DzCO%N?Ka8 z)3(Cn#~~LN7m?$tB^u5^y$B3M*l`%Uxw&~zR9RUS%ch?NbyQnU1I)xmAc%8q_(Da0 z0E!1YzgmL`AOArJI{xVh0*K+c<97oj2QUv%sm<5x^4K__y&N#(H;TC^@d&@4vx>w5 zwKE|B+tt-IhH{WmBwlKLZ*O7Wu3V!8Os$K({kAlEp+Z4%Ss7@-DY#NRYLDq)n#n!Aytpq?O73KM{fNV9FnY{UNP_32wh9={Bk^==;%^_JFx4`A$x>R7B7J{{YqcwkrSt diff --git a/texinfo/concept_en.texi b/texinfo/concept_en.texi index 0524431..9cd7f4d 100644 --- a/texinfo/concept_en.texi +++ b/texinfo/concept_en.texi @@ -54,7 +54,7 @@ The form (appearence) of tick labels is controlled by @code{SetTicks()} function Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. @ifhtml @html -